大家好,本次小编介绍华芯微特MCU OTA升级的应用!
一、引言
OTA升级(Over-the-Air Update,空中下载技术升级)是一种通过无线网络(如Wi-Fi、蓝牙或移动数据网络)远程为设备推送并进行应用更新的技术,无需用户手动 物理连接设备或更换硬件。它广泛应用于智能手机、智能汽车、物联网设备、智能穿戴等领域,是现代智能设备维护和功能迭代的核心手段。
在MCU领域,由于急于抢占市场份额而缩短研发周期,或是由于系统架构设计本身的不周全,又或是由于产品功能未能充分适应环境变化导致产品的功能无法适应新的环境,该产品的设计或框架需要及时进行更新迭代。传统的方法是通过召回待升级产品到厂商中的方式逐个进行系统更新,或者是工程师携带专业工具逐户上门对相关设备进行调试更新,不论是哪一种方式,对厂商而言都需要较多的时间和金钱成本来维护,对用户的体验也会带来不便,此时OTA升级技术变得尤为重要。
二、升级方式
常见的用于OTA升级的IAP方式主要有两种:
第一种方式为将程序整体擦除后再写入,这种实现方式一般是利用物联网模块通过串口的方式传输固件到嵌入式设备,由嵌入式设备的引导加载程序(Bootloader)擦除所需的应用程序区域,再将从串口接收到的新程序写入。这种方式实现起来比较简单,但在升级过程中意外断电或发生错误时设备无法正常启动到应用程序,需要重新进行升级。

第二种实现方式是通过对存储空间划分为应用程序区域和固件存储区域,通过运行应用程序接收新的固件到固件存储区域,即使传输过程中出现意外断电或发生错误,也不会影响应用程序的正常使用,但该方式需消耗多一倍的存储空间用于存储固件。

三、功能设计
整体框架:
以SWM34S系列MCU为例,Flash可用容量为512KB。该MCU的Flash起始地址为 0x00000000,因此内部Flash可用地址为0x00000000到0x00080000。其中Bootloader主要包括以下功能:挂载文件系统,对数据进行解析和校验,将程序写入Flash或替换文件。 根据实际情况编译后Bootloader实际占用空间为28kB,因此分配32kB的Flash空间给Bootloader。 为实现存储空间的充分运用,除预留4kB以储存备用参数外,其余部分悉数分配给APP,用以承载复杂功能程序的实现。

Bootloader区和APP区是两个独立的存储空间,因此有2个中断向量表。上电后第一段程序从栈顶地址0x00000000处开始运行,因为MCU是32位,所以程序以4字节进行区分。运行至复位中断向量(中断向量表起始地址)0x00000004时,跳转到复位中断服务程序中,运行后跳转到Bootloader的main函数中执行。当执行完Bootloader后,执行跳转至APP程序的复位向量表,取出复位中断向量的地址,并跳转执行复位中断服务程序,随后跳转到APP的main函数中执行。

Bootloader设计:
Bootloader启动后会通过文件系统检测SPI FLASH中更新文件是否存在且判断文件类型,若存在且为素材文件则将旧素材文件替换为新文件并删除旧文件,若为程序文件则将正确的文件数据存放在自定义的临时缓冲区中,数据满一帧后写入Flash中,直到所有数据写入完成。 文件不存在或更新完成后跳转至APP段地址,执行APP程序。
采用SPI FLASH文件系统升级更加安全稳定,文件系统使用的是开源的FATFS文件系统。因此,对于网络故障和意外断电导致升级失败的情况,根据固件存储区文件是否写入完全并保存,来检测升级文件是否完整。当升级过程中出现未知错误时,固件存储区文件未完成保存,此时Bootloade直接运行原程序,只有固件存储区文件完整时才将需要升级的数据拷贝覆盖原数据。
APP设计:
因APP程序起始地址为0x00008000,所以在Keil工程中需将工程的FLASH起始地址更改为0x8000,大小更改为0x76000,SRAM初始地址为0x20000000。需检查Options for Target->Linker中的Use Memory Layout from Target Dialog是否勾选,勾选后通过对话框中的Target->IROM1来修改FLASH起始地址及大小。

若Use Memory Layout from Target Dialog未勾选,则通过编辑sct文件(分散加载文件)来修改FLASH起始地址及大小。


四、传输协议
协议简介:
固件(素材文件和程序文件)数据的传输通过Xmodem协议进行,Xmodem是一种在串口通信中广泛使用的异步文件传输协议,最早在20世纪70年代由Ward Christensen提出并实现的,传输数据的单位为信息包,信息包格式如下:
帧头 | 包号 | 包号反码 | 有效数据 | 校验位 |
SOH/STX | PN | XPN | DATA | SUM/CRC |
1字节 | 1字节 | 1字节 | 128/1024字节 | 1/2字节 |
Xmodem 协议最早是以 128 字节块的形式传输数据,并且每个块都使用校验和进行错误检测。后面衍生出了使用循环冗余校验方式 (CRC16) 和支持 1024 字节块的传输协议 (Xmodem-1k)。帧头表示后面的有效数据的帧长度,因为数据包的序号和反序号只有1字节,所以包序不能大于255,若数据包个数大于255,序号则归零重复使用。根据Xmodem 协议规定,数据包长度有两种:一是以SOH(0x01)为帧头开始的数据包,信息包中的有效数据为128字节,数据包的总长度为131+校验字节;二是以STX(0x02)为帧头开始的数据包,信息包中的有效数据为1024字节,数据包总长度为1027+校验字节。SOH、STX为协议固定的控制符,具体的控制符定义为:
符号 | 数值 | 含义 |
SOH | 0x01 | 128字节数据包 |
STX | 0x02 | 1024字节数据包 |
EOT | 0x04 | 文件传输结束标识符 |
ACK | 0x06 | 接收数据包成功信号 |
NAK | 0x15 | 接收数据包失败信号 |
CA | 0x18 | 传输中止 |
C | 0x43 | 请求数据包 |
通讯流程:
以WIFI升级为例,MCU收到升级请求后,发送 C 请求数据,WIFI设备将按照Xmodem协议将固件文件分块传输给MCU设备。MCU设备在接收到每个数据块后,会发送确认信号(ACK)或重传请求(NAK)。
如果传输过程中出现错误,终端软件将自动重传出错的数据块。

更多详情请参考网盘中13.SWM341(S)/02.SDK/01.IAP_UserBoot Demo/串口Xmodem方式的Userboot/ 路径下的应用参考文件 。
结束语:
华芯微特多款屏驱芯片系列均支持OTA升级并提供简单易懂的参考例程,操作简单,开发便捷,有需要了解更多,可以在华芯微特论坛(bbs.synwit.cn)中查找开发技术资料或发帖向我们提问,期待您与华芯微特的每一次邂逅!
欢迎多多点赞、转发、分享,您的每次支持都是对小编的鼓励!