【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485
1 . 前言
随着MCU的资源增大以及物联的普及,许多产品已经使用上了远程升级OTA技术,可以远程优化掉产品的BUG,大大降低了程序风险,以下详解KeilC51/MDK平台下的OTA步骤
2 . BootLoader
代码OTA中有两部分区域,一是BootLoader负责启动引导和更新程序,二是APP程序代码,
BootLoader启动步骤如下 :
- 考虑中断向量地址映射,不同平台有不同的处理规则
- 程序初始化(主频初始,串口初始)
- OTA初始化(OTA结构体初始)
- IOT初始化(物联结构体初始)
- 程序flash可写初始(部分芯片需要解锁flash擦写锁)
- 设置Boot等待更新指令时间(如果从APP复位Boot此处时间设0)
- 进入循环事件检测更新指令(数据接收和发送封装好放入串口中断检索)
- 处理IOT通信事件,等待更新指令进入接收数据包阶段(芯片存储记录升级)
- 开始处理接收,数据写入备份区,接收完成进行CRC32校验
- 记录写入备份区完成记录,检查备份区代码完整性拷贝代码到运行区
- 运行区校验数据完整性通过跳转APP运行区,不通过数据复位在boot区循环
3 . APP
代码OTA中有两部分区域,一是BootLoader负责启动引导和更新程序,二是APP程序代码,
APP启动步骤如下 :
- 考虑中断向量地址映射,不同平台有不同的处理规则
- 程序初始化(主频初始,串口初始)
- OTA初始化(OTA结构体初始)
- IOT初始化(物联结构体初始)
- 检索物联通信遇到更新指令告知BootLoader预留时间等待升级,跳转Boot区
4 . 注意事项
注意以下几点注意事项防止OTA变砖
- BOOT与APP区中断向量偏移地址必须正确
- BOOT区进行数据下载,数据拷贝,固件完整性校验,固件跳转
- BOOT区的STARTUP地址
- APP固件日期,版本,SUM,CRC校验等
- APP区的STARTUP地址以及信息存放地址(日期,一般固化在APP的CODE区),更新记录存放地址(指示段,一般固化在APP区的16字节末尾)
- 预留RAM的部分空间上电不清零,以留BOOT与APP之间通信(共享内存)
- 芯片的FLASH擦写稳定性问题
- 限定BOOT与APP区的代码范围
- 最后进行压力测试,若是不通过分析失败根源
5 . 普遍疑惑点
【Q】一,中断偏移的方式有哪些?
【A】1. 若是KeilC51平台可以借助A51汇编在中断向量根据特定ram来选择跳转boot区的中断还是APP的中断,这种方法boot和app都进行中断向量偏移
2. 若是MDK平台可以借助中断函数指针二次跳转,或者芯片自带中断偏移寄存器,直接设定即可完成中断向量偏移
【Q】二,数据传输有哪些协议可以增强稳定性?
【A】一般有Xmodem和Ymodem以及厂商自定义的通信协议
【Q】三,变砖一般有哪些可能性?
【A】1. Boot区代码被永久性更改,2. APP区数据完整性不通过仍然跳转,3. 备份区代码完整性异常但是校验通过,4. 芯片flash擦写不稳定导致擦写到其他区域,5. Boot区代码存在BUG
【Q】四,为什么要在APP区设置固件日期,版本等信息?
【A】首先可以间接增强的代码的完整性,校验手段越多越安全,日期可以回溯版本一致性根源问题,版本可以反应程序更新记录
【Q】五,为什么要把STARTUP地址,信息存放地址,更新记录地址区分开?
【A】可以保证数据粘连,干预等问题
【Q】六,KeilC51可以在LX51 Location定位地址区分,MDK怎么设定?
【A】MDK定位常量代码段写法 :
uint8_t const codeData[16]attribute((at(ADDR))) = {0x12,0x34,0x56,x078};
6 . 总结
希望大家完善好OTA升级过程,谢谢观看。
技术交流群 : 745662457
群内专注 - 问题答疑,技术研究