前言
关于IAP
IAP(In Application Program)即在应用中编程,用于产品成熟后,拆机麻烦并且有对外通信接口的情况下,使用对外接口更新程序。
IAP实现原理是:在程序正常运行应用程序时,若需要更新,程序会跳转到另一个存储区执行IAP程序,在IAP程序实现对应用程序存储区的改写,更新完成后,再复位回到应用程序存储区执行更新过的软件。
ST在大部分单片机中集成了IAP程序,用户不需再自己实现,关于这种自举模式,参考:自举模式:STM32 L4X6 系统内置BootLoader的使用(DFU例程)
本文
本文使用对外串口实现IAP,基于STM32L452CEU6单片机。串口通信遵循Ymodem文件下载协议,可以使用超级终端或其他支持Ymodem的软件更新程序。
参考资料
- STM32L4X2用户手册RM0394
- 安富莱V7开发板用户手册
- ST官方例程(\STM32Cube_FW_L4_V1.16.0\Projects\STM32L476G-EVAL\Applications\IAP)
系统框架
L452仅有一个Bank,地址0x08000000 ~ 0x0807FFFF,分256个Page,L452内置Flash分为Page0~Page255,每个Page有2K Byte。
其中Page0 ~ Page223(即0x08000000 ~ 0x0806FFFF)是App存储区,Page224~Page254(0x08070000 ~ 0x0807F7FF)为IAP存储区,Page255(0x0807F800 ~ 0x08080000)存储IAP标志位。
系统上电先检测Flash中的IAP标志位,若是IAP,则跳转到IAP存储区执行,否则继续执行应用程序。
实现
App程序设置
MDK设置
上电后检查IAP flag
#define FLASH_USER_START_ADDR (0x807F800)
#define IAP_FLAG (0x57)// 自定义
if(*(uint8 *)FLASH_USER_START_ADDR == IAP_FLAG)
vJumpToIAP();
跳转函数
#define IAP_ADDR 0x8070000
void vJumpToIAP(void)
{
uint32_t i=0;
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if