WiFi物联中的OTA固件升级设计原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueqian_scut/article/details/52804009

在物联网开发中,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等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!


猜你喜欢

转载自blog.csdn.net/yueqian_scut/article/details/52804009