IAP功能笔记
参考:
https://blog.csdn.net/u013165704/article/details/72828249/
STM32实现IAP功能的学习笔记
参考:
远程固件升级流程
MCU初始化
进入BootLoader:
BootLoader验证flash相关标志位,更新APP跳转入口,APP分两种,一种是系统应用,一种是系统更新
flash标志位错误,则进入系统更新
否则GPRS模块连接终端
与终端通讯
登录IP
查询版本号
超时则进入APP,不重启
验证版本号,一致则跳转进入APP
不一致则进入系统更新
系统更新:
验证终端连接状态
连接成功则查询版本号,验证版本号,进行固件下载
未连接则尝试连接
失败则载入出厂副本,成功进行固件下载
通知终端进行固件下载
接收整个固件信息头
接收帧数据,验证数据完整则通知接收下帧
循环直到数据接收完成
验证固件信息头,正确则进入IAP,错误则重来
IAP:读取FLASH标志,根据标志选择合适的flash区域(分多个区域循环使用)
将固件写入flash,更新固件版本号,
修改flash标志位,以便进入系统应用,重启
系统应用:
更新flash标志位
APP中定时查询终端版本号(安信可有类似心跳包的东西维持通讯)
版本更新,修改flash标志位,重启
APP循环
功能定义:
上电进入BootLoader,检测标志位
FLAG_TO_APP 进入APP
FLAG_TO_BOOT 进入Boot
APP接收到升级指令后,标志位置FLAG_TO_BOOT,重启
Boot接收文件,存储在FLASH空间,标志位置FLAG_TO_APP,重启
数据格式:
串口指令
串口数据包
u8 [2054]
{55, AA, 01, 数据包号, 版本号, 数据文件2048字节, 校验位}
校验位的计算 暂时不写
FLash分区
BOOTLOADER_LENGTH 0x0000 FFFF
BOOTLOADER_STARTADDR 0x0800 0000
BOOTLOADER_ENDADDR (BOOTLOADER_STARTADDR+BOOTLOADER_LENGTH)
APP_LENGTH 0x0001 FFFF
APP_STARTADDR (BOOTLOADER_ENDADDR+1)
APP_ENDADDR (APP_STARTADDR+APP_LENGTH)
FLAG_LENGTH 0x0000 FFFF
FLAG_STARTADDR (APP_ENDADDR+1)
FLAH_ENDADDR (FLAG_STARTADDR+FLAG_LENGTH)
BootLoader程序
主函数
int main(void)
{
int flag = FLAG_TO_BOOT;
int nCount = 0;
delay_init();
uart_init(115200);
LED_Init();
TIM3_Init(99, 719);
flag = STMFLASH_ReadHalfWord(FLASH_UPDATE_FLAG_ADDR);
while(1)
{
if(flag==FLAG_TO_APP)
{
lap_Load_App(FLASH_APP_ADDR);
}
else
{
ReceiveUsartData();
if(Flag10MS == 1)
{
Flag10MS = 0;
nCount++;
if(nCount == 10)
{
nCount = 0;
USARTxSendRespondToServer(USART1, SERIAL_CODE_STM32_UPDATE_PREPAR_BOOT_OK);
LED0 = !LED0;
}
}
}
}
return 0;
}
串口初始化程序
void uart_init()
串口中断服务程序
void USART1_IRQHandler(void)
UpdateFlag置一:接收bin文件
当UsartRxCodeCount计数等于传输总字节数USART_RECEIVE_CODE_DATA_SIZE时,置一标志位UsartReceiveFlag个NextPageFlag
跳出中断,执行ReceiveUsartData()
验证数据,存储数据进FLASH
重新加载代码的程序
void MSR_MSP(u32 addr)
{
asm("MSR MSP, r0");
asm("BX r14");
}
typedef void(*lapFun)(void);
lapFun JumptoApp;
void lap_Load_App(u32 AppAddr)
{
if(((*(vu32*)AppAddr) & 0x2FFE0000) == 0x20000000)
{
JumptoApp = (lapFun)*(vu32*)(AppAddr+4);
MSR_MSP(*(vu32*)AppAddr);
JumptoApp();
}
}

浙公网安备 33010602011771号