【正点原子STM32连载】 第六十章 串口IAP实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子APM32F407最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第六十章 串口IAP实验

本章将介绍在APM32F407上使用串口进行IAP,以实现简单的IAP功能。通过本章的学习,读者将学习到IAP的使用。
本章分为如下几个小节:
60.1 硬件设计
60.2 程序设计
60.3 下载验证

60.1 硬件设计
60.1.1 例程功能

  1. 程序运行后进入等待接收APP的bin数据的状态
  2. 接收到APP的bin数据后,先后按下KEY0按键和KEY_UP按键,可分别进行将APP的bin数据加载到Flash和跳转到APP的位置执行APP的操作
  3. LED0闪烁,指示程序正在运行
    60.1.2 硬件资源
  4. LED
    LED0 - PF9
  5. 按键
    KEY0 - PE4
    KEY_UP - PA0
  6. USART1(PA9、PA10连接至板载USB转串口芯片上)
  7. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    60.1.3 原理图
    本章实验使用的IAP为软件算法,因此没有对应的连接原理图。
    60.2 程序设计
    60.2.1 IAP的实现
    本章实验提供了用于IAP的驱动代码,如下图所示:

图60.2.1.1 IAP驱动代码
IAP的实现最主要分为两个步骤,分别为加载APP固件至Flash和跳转到APP中运行,为此本实验实现了以上两个函数,如下所示:
void iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t applen);
void iap_load_app(uint32_t appxaddr);
以上两个函数就分别实现了加载APP固件至Flash和跳转到APP运行的功能,这两个函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "./IAP/iap.h"#define FLASH_APP_ADDR (0x08010000)
#define APP_MAX_SIZE (120*1024)static uint8_t appbin[APP_MAX_SIZE];void example_fun(void)
{uint32_t appsize;/* 通过串口等方式获取APP的二进制数据 */appsize = get_app_bin(appbin);/* 将APP的二进制数据写入Flash的指定地址中 */iap_write_appbin(FLASH_APP_ADDR, appbin, appsize);/* 跳转到APP在Flash中的起始地址运行 */iap_load_app(FLASH_APP_ADDR);
}

60.2.2 APP工程修改
APP程序要能够在指定的Flash起始地址运行,需要编译器在编译APP的时候知道APP将被保存在Flash的那个位置,对于MDK软件,可以在Options for Target窗口中设置,如下图所示:
在这里插入图片描述

图60.2.2.1 配置MDK中的Flash空间
上图中将APP程序保存在Flash中的空间配置为0x8010000~(0x8010000+0xF0000),通过这样的配置便可以使APP被保存在指定Flash位置中执行。读者可以自行配置“Start”和“Size”参数,但要注意不能超过Flash的范围,并且也不要覆盖IAP程序(Bootloader)。
上一小节中将APP保存到Flash中的操作操作的是二进制数据,因此APP也应当被编译为二进制文件,然后MDK软件中并没有直接编译出二进制文件的选项,因此需要配置MDK在编译完成后执行指定的命令,如下图所示:
在这里插入图片描述

图60.2.2.2 配置MDK生成二进制文件
完成以上配置后,便可在APP程序编译完成后在工程的Output目录下得到正确的二进制文件。
60.2.3 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{/* 仅保留关键代码,其余代码省略 *//* 初始化串口 */usart_init(115200);while (1){/* 串口已接收到数据 */if (g_usart_rx_cnt != 0){/* 新的一次循环串口还没有接收到新数据,* 则断定串口接收完毕*/if (lastcount == g_usart_rx_cnt){/* 记录APP固件大小 */applenth = g_usart_rx_cnt;lastcount = 0;g_usart_rx_cnt = 0;}else{lastcount = g_usart_rx_cnt;}}key = key_scan(0);switch (key){case KEY0_PRES:{/* 将串口接收到的APP二进制数据写入Flash中的指定位置 */iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth);break;}case WKUP_PRES:{/* 跳转到Flash的指定位置执行APP程序 */iap_load_app(FLASH_APP1_ADDR);break;}}delay_ms(100);}
}

从上面的代码中可以看出,程序是通过串口接收APP的二进制数据的,因此串口驱动中的串口接收缓存因该设置的足够大,以能够容纳APP的二进制数据,本实验中串口接收缓存的配置如下所示:
/* 定义最大接收120KB数据 */
#define USART_REC_LEN (120 * 1024)
在判断APP二进制数据接收完毕后,便可通过KEY0按键调用函数iap_write_appbin()将APP的二进制数据写入Flash中的FLASH_APP1_ADDR位置中,FLASH_APP1_ADDR是一个宏,该宏的定义如下所示:
#define FLASH_APP1_ADDR 0x08010000
需要注意的是,APP写入的位置应当与上一小节中配置MDK软件的指定Flash位置相同。
将APP的二进制数据写入到Flash中后,此时运行的依旧是IAP(Bootloader)程序,此时可以按下KEY_UP按键来跳转到Flash中APP的位置执行APP程序。
60.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,此时程序正在等待串口接收APP的二进制数据,此时便可通过串口调试助手将实现编译生成的APP二进制文件发送给MCU,待发送完毕后按下KEY0按键,将APP的二进制数据写入到Flash中,若写入成功,LCD上将会有相应的提示,此时便可按下KEY_UP按键将程序跳转到APP的保存位置中运行,若指定的Flash位置保存了正确的APP固件,那么便可看到MCU正在运行APP程序,而非IAP(Bootloader)程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake使用file(GLOB ...)需要注意的问题

文章目录 基本语法使用例子潜在的问题大型项目中推荐的用法 file(GLOB ...) 命令用于获取匹配指定模式的文件列表。在 CMake 中,file(GLOB ...) 命令的一种常见用法是用于收集源文件列表,例如 C 源文件(.cpp)和 C 源文件&#xff…

html页面加载json数据,在html中显示JSON数据的方法

html页面加载json数据,在html中显示JSON数据的方法 export const mixin {methods: {syntaxHighlight(json) {if (typeof json ! string) {json JSON.stringify(json, undefined, 2);}json json.replace(/&/g, &).replace(/</g, <).replace(/>/g, >);re…

实例分割12篇顶会论文及代码合集,含2023最新

同学们&#xff0c;你们觉得视觉经典四个任务中哪个最难&#xff1f;我个人觉得是实例分割。 因为它既具备语义分割的特点&#xff0c;需要做到像素层面上的分类&#xff0c;也具备目标检测的一部分特点&#xff0c;即需要定位出不同实例&#xff0c;即使它们是同一种类。 但…

LangChain的函数,工具和代理(一):OpenAI的函数调用

一、什么是函数调用功能 几个月前OpenAI官方发布了其API的函数调用功能(Function calling), 在 API 调用中&#xff0c;您可以描述函数&#xff0c;并让模型智能地选择输出包含调用一个或多个函数的参数的 JSON 对象。API函数“ChatCompletion” 虽然不会实际调用该函数&#…

C语言变量和常量

变量和常量 标识符 在计算机高级语言中&#xff0c;用来对变量、符号常量、函数、数组、类型等命名的有效字符序列统称为标识符&#xff08;identifier&#xff09;。 C语言规定标识符&#xff1a; 只能由字母&#xff0c;数字和下划线组成。不能以数字开头。字母区分大小写…

一站式企业快递管理平台使用教程

因公寄件在企业中重要性的提升&#xff0c;催生出了企业快递管理平台。为什么这么说呢&#xff1f; 随着经济和快递行业的发展&#xff0c;因公寄件在企业中成了一件“常事”&#xff0c;寄文件合同、发票、节假日慰问品、样品等等&#xff0c;这种情况之下&#xff0c;因公寄件…

Vue3 设置点击后滚动条移动到固定的位置

需求&#xff1a; 点击不通过按钮&#xff0c;显示红框中表单&#xff0c;且滚动条滚动到底部 &#xff08;显示红框中表单默认不显示&#xff09; <el-button click"onApprovalPass">不通过</el-button> <div class"item" v-if"app…

vue打包优化

vue.config.js文件中 module.exports defineConfig({ productionSourceMap: false,//去掉mapjs文件 });

pwn:[SWPUCTF 2021 新生赛]nc签到

题目 linux环境下显示为 配合题目的下载附件&#xff0c;发现过滤了一些&#xff0c;一旦输入这些会自动关闭程序 ls被过滤了&#xff0c;可以使用l\s cat和空格都被过滤了&#xff0c;cat可以换成c\at ,空格可以换成$IFS$9

<HarmonyOS第一课>1·运行Hello World【课后考核】

【习题】运行Hello World工程 判断题 1.DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。 正确(True) 2.main_pages.json存放页面page路径配置信息。 正确(True) 单选题 1.在stage模型中&#xff0c;下列配置文件属于AppScope文件夹的是&#xff1f;&#xff08;…

Youtube0播放?运营教你需要的技巧、策略与工具!

对于有跨境意向的内容创作者或者品牌企业来说&#xff0c;YouTube是因其巨大的潜在受众群和商业价值成为最值得投入变现与营销计划的平台。 据统计&#xff0c;98% 的美国人每月访问 YouTube&#xff0c;近三分之二的人每天访问。但是&#xff0c;YouTube还远未达到过度饱和的…

酵母双杂交服务专题(一)

酵母双杂交系统是一种在酵母这种真核生物模型中执行的实验方法&#xff0c;用于探索活细胞内部蛋白质间的相互作用。这种技术能够敏感地捕捉蛋白质间的细微和短暂相互作用&#xff0c;通过检测报告基因的表达产物来实现。作为一种高度灵敏的技术&#xff0c;酵母双杂交系统被广…

Spring Cloud LoadBalancer 简单介绍与实战

前言 本文为SpringCloud的学习笔记&#xff0c;如有错误&#xff0c;希望各位高手能指出&#xff0c;主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…

评测|PolarDB MySQL 版 Serverless

评测&#xff5c;PolarDB MySQL 版 Serverless 目录 一、测试背景 1.1、云原生数据库 PolarDB Serverless新架构概念 1.2、Serverless资源弹性扩缩触发条件 二、PolarDB的Serverless能力与同类型产品进行对比 三、动态弹性升降资源的能力测试 3.1、测试资源 3.2、测试一…

ubuntu22.04在线安装redis,可选择版本

安装脚本7.0.5版本 在线安装脚本&#xff0c;默认版本号是7.0.5&#xff0c;可以根据需要选择需要的版本进行下载编译安装 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安装redis rm -rf ./tmp.log systemctl …

freeRTOS下载链接(sourceForge)

FreeRTOS Real Time Kernel (RTOS) download | SourceForge.net 文件名&#xff1a;FreeRTOSv202212.00.exe 双击后会自动变成这个样子的&#xff1a; 文件夹大小&#xff1a;506M 可以看到跟那个教程里面的文件结构是一模一样的&#xff0c;所以很可能是同一个最新版本的文件…

Linux(Centos)上使用crontab实现定时任务(定时执行脚本)

场景 Windows中通过bat定时执行命令和mysqldump实现数据库备份&#xff1a; Windows中通过bat定时执行命令和mysqldump实现数据库备份_mysqldump bat-CSDN博客 上面讲windows中使用bat实现定时任务的方式&#xff0c;如果是在linux上可以通过crontab实现。 cron是服务名称。…

高斯DB数据库添加字段并添加字段注释

个人网站 公众号小肖学数据分析 可以使用以下SQL语句向高斯DB数据库添加字段并添加字段注释&#xff1a; ALTER TABLE 表名 ADD COLUMN 列名 数据类型 COMMENT 字段注释; "表名"替换为要添加字段的表名&#xff0c;"列名"替换为要添加的字段名&#xf…

怎样提升伦敦银买卖技巧?

如果投资者想提升伦敦银的买卖技巧&#xff0c;可以学习一些有用的技术分析方法。所谓技术分析&#xff0c;就是通过对行情过往价格和相关交易数据进行收集&#xff0c;用图表的方式解读白银市场&#xff0c;进而预测行情未来主线走势、判断价格细节变化、寻找重要支撑点阻力点…