IAP升级主要分为在线升级与本地升级两种方式,核心都是将升级程序的BIN文件写入到MCU的内部FLASH中,并使程序从升级程序的的地址开始运行。
再进行升级之前,这些一定要搞清楚:
1.MCU的内部FLASH大小(A KByte)
2.启动程序(就是引导程序,这部分是不能被擦除的)的大小(B KByte)
3.应用程序(即升级程序)的大小(C KByte)
为保证升级成功,这里要注意:
A > B+C(最好在预留1K空间,即A>B+C+1)
我使用的是STM32F051系列的,闪存大小64K,引导程序5K,预留6K空间,应用程序55K,内存大小足够。下面讲一讲具体思路及实现函数。
主要思路:
先将升级程序写入到外部FLASH中进行备份,写入完成后,给MCU一个升级信号,然后开始读外部FLASH,写内部FLASH,按页操作,写完之后,进行地址跳转,跳转至升级程序的开始地址。
STM32库里面提供了内部FALSH的读写函数,我们只需要找到自己需要的调用即可。
内部FLASH写入步骤:
解锁——清除标志位——擦除——写FLASH——上锁
内部FLASH结构:
库里擦除函数提供了全部擦除和页擦除两种方式:
1.FLASH_Status FLASH_ErasePage(uint32_t Page_Address) //页擦除,每次擦除1K,参数为起始地址
2.FLASH_Status FLASH_EraseAllPages(void) //全部擦除
写FLASH函数:
1.FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) //写一个字,即4个字节
2.FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) //写半字,即2个字节
写入函数代码如下:
void Flash_Task_Write(u32 write_addr,u16 *pBuff,u16 len)
{