最近研究了一下基于STM32的串口IAP升级功能,在原子的精英版上实现的,基本的功能原子给的库里已经实现了,今天主要记录以下自己实现的一整个软件升级思路以及其中遇到的一些问题和解决思路。
-
总体思路
将FLASH划分为一个Bootloader即IAP升级代码区和若干个App代码区,具体划分方法根据自己的项目实际情况划分,此处可随意百度到方法。
我们需要的是:预留一个可以方便升级软件的接口,当软件需要更新时,用户可通过简单的工具实现软件升级,这个过程我们希望尽可能的方便客户自行操作,可选串口,USB,无线升级等方式,本文仅实现串口IAP,后续继续更新其他实现方式。
IAP代码启动时检测标志位判断执行IAP代码或APP代码,若为APP代码,直接跳转执行知道APP代码中接受到更新软件的标志,此时设置标志位为IAP启动并提示重启,再次重启时,从IAP代码启动,等到更新数据,接受完数据,写入FLASH,同时设置标志位为APP启动,直接跳转至APP执行或复位从APP启动。 -
实现细节
在IAP代码启动时,检测标志位判断当前执行IAP程序或执行App代码(这个标志位可以选择多种方式实现,可选择FLASH中的一块存储单元,也可以选择外部的存储单元,由于这一区域需要在IAP代码和App代码中同时操作,加上IAP升级本就依赖于FLASH操作,选择FLASH中的存储单元更为合理),当检测到需要执行App代码时,直接跳转置App代码执行,否则等到代码升级。本文通过简单的串口超时中断接收数据,未做数据安全检测。当串口数据接受完成时,数据写入FLASH,置位标志位,设置为下次启动为App代码启动。在接受到新的代码数据时,写入到FLASH,可根据实际情况选择立即跳转到App执行或关机重启在跳转到App执行。要记住,代码永远是从基址0x8000000即IAP代码开始执行的,我们需要的是,从IAP执行后,可以直接跳转到我们需要的代码区。
启动时判断标志位,APP执行则直接跳转,否则顺序执行IAP
//判断启动标志位
STMFLASH_Read(FLASH_UPDATA_FLAG_ADDR,(u16*)state,SIZE);
if(strstr((