本文由嵌入式企鹅圈原创团队成员-华南师范大学物联网创新中心Hende_Zhu先生执笔。
在物联网开发中,OTA升级是产品必备功能之一,本篇文章将以庆科EMW3165模块的OTA升级原型为例进行设计原理介绍,以及提供简单的STM32 DEMO实现帮助大家进一步理解。本文为分析WIFI模块固件升级,蓝牙BLE的固件升级设计和分析请看《固件空中升级(OTA)与固件二次引导的原理和设计》。
一、EMW3165硬件架构
EMW3165内部集成了一个Cortex-M4微控制器以及一个无线射频芯片,其片内Flash容量为512K,RAM为128K,除此之外,通过SPI接口连接2M的片外Flash。现在物联网开发很多都采用这种类似的架构,或者是通过STM32外部连接WiFi模组联网,如串口等。
OTA升级设计很重要的一个工作就是首先规划好Flash区域的布局,必须清晰地知道Bootloader, Application以及下载的.bin文件在Flash中放置的位置。
二、Bootloader和Application的角色
OTA固件升级其实就是IAP应用编程,要完成固件升级需要设计两个程序,一个为Bootloader程序,另外一个为Application程序。通常我们是在Application程序中建立socket连接来发起HTTP请求去查询服务器是否有新的固件并进行下载的,并且在片外Flash中修改和存储固件的参数信息,而Bootloader程序主要检查固件的参数信息并且如果需要就负责将Application程序下载的固件从片外Flash搬运到片内Flash,然后跳到那里运行。
1.Bootloader角色主要完成的:
1)读取固件参数信息;
2)判断是否需要更新,如果不需要直接跳到Application区域执行;
3)如果需要更新,则将固件搬到Application区域,并且更新固件参数信息(表示已将更新过该固件了),最后跳到Application区域执行。
当然,在搬运固件前还需要进行校验如CRC以确保完整性。
2.Application角色主要完成的:
1)发送HTTP请求查询服务器最新固件信息;
2)和当前固件做对比,如果需要更新,就进行下载;
3)将下载的固件写到规划好的OTA固件存储区域;
4)更新固件参数回写片外Flash,最后进行软件复位;
这里也相应地首先完成网络上固件下载的完整性校验,以确保在网络下载下来的固件是完整的,然后在写进OTA固件存储区域的时候也需要再进行校验计算,以在Bootloader在搬运固件时校验确保完整性。
三、Flash区域规划
在OTA升级中我们需要存储更新的固件,如果片内Flash不够大的时候我们需要加片外Flash进行存储,简单介绍一下OTA升级时Flash区域的规划。(这里的地址划分与后面的stm32 demo程序对应,和庆科模块实际位置和大小稍有区别,但是原理都是一样的)
1.Bootloader放置在片内Flash的0x08000000地址,大小为64K,STM32设备上电后首先跳到这里执行;(主闪存存储器被选为启动区域)
2.Application放置在片内Flash的0x08010000地址;
3.PARAMETER_1和PARAMETER_2(备份用)记录固件参数信息的区域,它们放在片外Flash;
4.OTA_TEMP区域为OTA固件存储区域,放在片外Flash,Application从网络下载bin文件然后写到该区域,而Bootloader从这个区域搬运固件到Application区域。
从上面可以看出,不管是Bootloader还是Application都需要做好片内Flash驱动和片外的Flash驱动来进行Flash操作。
四、OTA升级过程
1.Application查询服务器下载固件到OTA_TEMP区域;
2.Application根据下载的固件修改PARAMETER_1和PARAMETER_2区域的内容,固件参数信息可以简单用一个结构体记录,如:
3.Application进行软件复位;
4.Bootloader读取PARAMETER_1区域信息,判断是否有固件需要更新,如判断上述结构体upgrade_type的值;
5.如果upgrade_type值为’U’,先做一下校验,再将OTA_TEMP区域的固件搬运到片内Flash区域,最后修改PARAMETER_1区域数据如upgrade_type的值改为’0’,设备下次上电后Bootloader就不会再更新固件;
6.最后Bootloader跳到Application区域执行应用程序;
五、总结
OTA固件升级设计主要做好几部分工作:清楚芯片启动流程、完成Flash区域规划以及做好Flash驱动,Bootloader主要判断片外是否有固件待更新,如果有就搬到片内Flash,而Application程序主要完成固件的下载,其实固件更新并没有大家想象中的难以实现。
六、STM32 DEMO(内附使用说明)
嵌入式企鹅圈原创团队由阿里、魅族、炬力、华南师范大学物联网创新中心等资深工程师组成。百分百原创,每周两篇,分享嵌入式、Linux、物联网、GPU、Android等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!