STM32 iap移植笔记

 

1.IAP概述

对于大多数基于 Flash 的系统而言,在最终产品中安装之后,能够对固件进行更新,这一点非常重要。这一功能被称为在应用中编程 (IAP)。STM32F4xx 微控制器能够运行用户指定的固件,从而执行微处理器内置 Flash 的 IAP。借助这一特性,在重新编程过程中可以使用任意类型的通信协议。 

1.1 原理

         使用所选的开发工具通过 JTAG/SWD 接口,或使用系统存储区中工厂内置的自举程序将IAP 驱动程序编程到 Flash 的基址。用户程序设置在flash的第二个块中,并设置中断向量表偏移量为第一个flash块大小。芯片上电后会先执行IAP驱动程序,用户可使用预设的通信方式,下传用户代码,IAP驱动检测到代码正常后会将其写入相应flash中,然后跳转到用户代码区执行用户代码。

注:cortex-m0内核无法通过设置向量表偏移寄存器重映射中断向量表,需重映射为从ram启动。

注:

         用这种方式更新代码时,需要直接向flash中写入二进制文件(.bin文件),可由keil直接生成;由于官方例程中使用的事Ymodem传输协议,因此需要能够支持此协议传输的超级终端,例如:SecureCRT。

1.2  代码移植(非M0内核)

1.2.1 修改官方例程

         下载ST官网串口IAP源码,是个基于评估板的例程(包含IAP驱动程序,及用户APP例程),IAP驱动可以修改串口后直接使用。为适应公司驱动代码并且能够更灵活的选择串口,可将bsp_usart代码植入:

1)新建一个裸机工程,提取公司的基础版本,USER目录下删除除stm32f4xx_conf、stm32f4xx_it.c、stm32f4xx_it.h(防止不兼容)的文件,BSP目录下只保留bsp_usart.c、bsp_usart.h文件,把APP目录下的app_cfg.h复制到USER目录下,删除APP、KAL、UCOSII文件夹。

2)新建IAP文件夹,向其中复制ST官方例程中的STM32F4xx_AN3965_V1.0.0\Project\ STM32F4xx_IAP目录下的src和inc文件夹,将main文件放到USER目录下,删除stm32相关文件:

 

3)工程中删除多余文件,添加新文件后编译。

4)stm32f4xx_conf.h文件中,注释掉#include "ucos_ii.h",添加#include "app_cfg.h"

5)mian文件中,删除串口初始化函数和按键相关调用; 在bsp_usart中定义EVAL_COM,替换掉工程中的EVAL_COM1,再将bsp_usart.h包含到common.c和main.c中。重新编译,调整代码直到编译成功。

6)按照启动文件修改PendSV_Handler和SysTick_Handler函数名。

7)修改flash_if.h中flash结构,及用户APP存放位置。

8)修改IAP启动处理逻辑,官方例程需要按键控制,需改为密钥激活方式。当前版本代码只实现IAP下载程序功能,芯片复位后需在3s内发送密钥zy123456,才能收到反馈‘C’,超时将直接执行用户代码。

9)查看工程的.map文件,确认预留flash空间充足。例如,在flash_if.h中定义了用户APP地址为0x08004000,而flash起始地址为0x08000000(手册),因此IAP驱动预留空间有16K,而IAP驱动有10.69K,空间充足:

 

1.2.2 修改用户代码

Main函数中重新设置中断向量表地址:

​​​​​​​1.2.3 修改用户代码的MDK设置

1)修改target选项卡中rom位置:

2)修改utilities->settings->flash download中flash范围:

 

3)user选项卡中添加生成二进制文件的指令:

fromelf.exe  --bin -o "[email protected]" "#L"

4)修改完成

1.3 代码移植(M0内核)

1.3.1 移植官方例程

参考上一节,只多了个main.h。

注:官方例程与当前芯片兼容性bug:

1)Flash_if.c文件中,FLASH_If_Init()函数清空标志位时,无FLASH_FLAG_BSY位。

2)库函数FLASH_ErasePage()检查参数时,宏定义的flash范围不对:

正确范围: (((ADDRESS) >= 0x08000000) && ((ADDRESS) <= 0x0803FFFF))

 

​​​​​​​1.3.2 修改用户代码

Main函数中重新设置中断向量表地址:

1)将用户APP的中断向量表手动复制到RAM起始位置:

2)重映射启动位置为从sram启动(见上图)。

 

​​​​​​​1.3.3 修改用户代码的MDK设置

1)修改target选项卡中rom位置和RAM位置(预留中断向量表空间):

2)修改utilities->settings->flash download中flash范围和RAM范围:

3)user选项卡中添加生成二进制文件的指令:

fromelf.exe  --bin -o "[email protected]" "#L"

4)修改完成