OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 614|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第五十四章 串口IAP实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-27 11:00:27 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-25 14:27 编辑

第五十四章 串口IAP实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

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

54.1 硬件设计
54.1.1 例程功能
1. 串口接收APP固件数据
2. 按下WKUP按键可将串口接收到的APP固件数据写入Flash
3. 按下KEY0按键可执行写入Flash的APP
4. LED0闪烁,提示程序正在运行

54.1.2硬件资源
1. LED
       LED0 - PB5
2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块
3. 按键
       WKUP - PA0
       KEY0 - PE4
4. USART1
       USART1_TX - PA9
       USART1_RX - PA10

54.1.3 原理图
本章实验使用的IAP为软件算法,因此没有对应的连接原理图。

54.2 程序设计
54.2.1 IAP的实现
本章实验提供了用于IAP的驱动代码,如下图所示:                                 
1.png
图54.2.1.1 IAP驱动代码
IAP的实现最主要分为两个步骤,分别为加载APP固件至Flash和跳转到APP中运行,为此本实验实现了以上两个函数,如下所示:
  1. voidiap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t applen);
  2. void iap_load_app(uint32_t appxaddr);
复制代码
以上两个函数就分别实现了加载APP固件至Flash和跳转到APP运行的功能,这两个函数的使用示例,如下所示:
  1. #include "./IAP/iap.h"
  2. #define FLASH_APP_ADDR (0x08010000)
  3. #define APP_MAX_SIZE (55*1024)
  4. static uint8_t appbin[APP_MAX_SIZE];
  5. void example_fun(void)
  6. {
  7.     uint32_t appsize;
  8.    
  9.     /* 通过串口等方式获取APP的二进制数据 */
  10.    appsize = get_app_bin(appbin);
  11.    
  12.     /* 将APP的二进制数据写入Flash的指定地址中 */
  13.    iap_write_appbin(FLASH_APP_ADDR, appbin, appsize);
  14.    
  15.     /* 跳转到APP在Flash中的起始地址运行 */
  16.    iap_load_app(FLASH_APP_ADDR);
  17. }
复制代码
54.2.2 APP工程修改
APP程序要能够在指定的Flash起始地址运行,需要编译器在编译APP的时候知道APP将被保存在Flash的那个位置,对于MDK软件,可以在Options for Target窗口中设置,如下图所示:     
2.png
图54.2.2.1 配置MDK中的Flash空间
上图中将APP程序保存在Flash中的空间配置为0x8010000~(0x8010000+0x70000),通过这样的配置便可以使APP被保存在指定Flash位置中执行。读者可以自行配置“Start”和“Size”参数,但要注意不能超过Flash的范围,并且也不要覆盖IAP程序(Bootloader)。
上一小节中将APP保存到Flash中的操作操作的是二进制数据,因此APP也应当被编译为二进制文件,然后MDK软件中并没有直接编译出二进制文件的选项,因此需要配置MDK在编译完成后执行指定的命令,如下图所示:     
3.png
图54.2.2.2 配置MDK生成二进制文件
完成以上配置后,便可在APP程序编译完成后在工程的Output目录下得到正确的二进制文件。

54.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     /* 仅保留关键代码,其余代码省略 */
  4.    
  5.     /* 初始化串口 */
  6.    usart_init(115200);
  7.    
  8.     while (1)
  9.     {
  10.          /* 串口已接收到数据 */
  11.          if (g_usart_rx_cnt != 0)
  12.          {
  13.              /* 新的一次循环串口还没有接收到新数据,
  14.               * 则断定串口接收完毕
  15.               */
  16.              if (lastcount == g_usart_rx_cnt)
  17.              {
  18.                  /* 记录APP固件大小 */
  19.                  applenth = g_usart_rx_cnt;
  20.                  lastcount = 0;
  21.                  g_usart_rx_cnt = 0;
  22.              }
  23.              else
  24.              {
  25.                  lastcount = g_usart_rx_cnt;
  26.              }
  27.          }
  28.          
  29.          key = key_scan(0);
  30.          switch (key)
  31.          {
  32.              case WKUP_PRES:
  33.              {
  34.                  /* 将串口接收到的APP二进制数据写入Flash中的指定位置 */
  35.                  iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth);
  36.                  break;
  37.              }
  38.              case KEY0_PRES:
  39.              {
  40.                  /* 跳转到Flash的指定位置执行APP程序 */
  41.                  iap_load_app(FLASH_APP1_ADDR);
  42.                  break;
  43.              }
  44.          }
  45.          
  46.          delay_ms(100);
  47.     }
  48. }
复制代码
从上面的代码中可以看出,程序是通过串口接收APP的二进制数据的,因此串口驱动中的串口接收缓存因该设置的足够大,以能够容纳APP的二进制数据,本实验中串口接收缓存的配置如下所示:
  1. /* 定义最大接收55KB数据 */
  2. #define USART_REC_LEN (55 * 1024)
复制代码
在判断APP二进制数据接收完毕后,便可通过WKUP按键调用函数iap_write_appbin()将APP的二进制数据写入Flash中的FLASH_APP1_ADDR位置中,FLASH_APP1_ADDR是一个宏,该宏的定义如下所示:
  1. #define FLASH_APP1_ADDR 0x08010000
复制代码
需要注意的是,APP写入的位置应当与上一小节中配置MDK软件的指定Flash位置相同。
将APP的二进制数据写入到Flash中后,此时运行的依旧是IAP(Bootloader)程序,此时可以按下WKUP按键来跳转到Flash中APP的位置执行APP程序。

54.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,此时程序正在等待串口接收APP的二进制数据,此时便可通过串口调试助手将实现编译生成的APP二进制文件发送给MCU,待发送完毕后按下WKUP按键,将APP的二进制数据写入到Flash中,若写入成功,LCD上将会有相应的提示,此时便可按下KEY0按键将程序跳转到APP的保存位置中运行,若指定的Flash位置保存了正确的APP固件,那么便可看到MCU正在运行APP程序,而非IAP(Bootloader)程序。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表