中国自动化学会专家咨询工作委员会指定宣传媒体
文摘详情
gkongbbs

单片机控制板OTA远程升级的Bootloader设计与实践

http://www.gkong.com 2026-09-29 02:18 苏州永节电子科技有限公司

越来越多的工业和家电控制板在出厂后还需要远程升级:家电类要修bug、加新功能;工业设备部署在现场,拆机升级成本高。OTA(Over-The-Air)远程升级已经从高端IoT产品下放到普通单片机控制板。本文分享一套在STM32/GD32等Cortex-M MCU上验证过的Bootloader+OTA方案。

一、为什么必须做双区备份

最朴素的做法是Bootloader收到新固件后,直接写正在运行的App所在Flash。一旦传输中断、掉电、或者新固件本身有bug,板子就变砖了,必须拆机用仿真器重刷。工业现场这种事故的代价远高于省下来的Flash成本。

更稳妥的做法是双区(A/B partition):Flash划分为Bootloader区、A区、B区、参数区四个部分。Bootloader启动时读参数区里的"当前运行区"标志,跳转到对应分区启动新App。下载新固件时写到备用分区,写完校验通过后,把"待启动区"标志切到备用分区,下次重启就切到新固件;如果新固件跑飞、或者Bootloader在规定时间内没收到App发的"启动成功"心跳,就自动回滚到旧分区。这样任何一步断电都不会变砖。

二、Bootloader最小职责

Bootloader本身要做到两件事:上电判断是否需要升级;需要升级时通过通信通道接收固件并写入备用分区。它不做业务、不接传感器、不处理复杂协议,代码越小越可靠。

启动流程建议:上电先关外设→读参数区的升级标志和CRC→如果标志要求升级,进入接收模式→通过UART/CAN/4G/WiFi接收固件包→按页写入备用Flash→写完算整包CRC和签名→校验通过则切换启动标志,否则保留旧标志→然后跳转到用户App。

三、固件分包与校验

一份完整固件动辄几十到几百KB,通过不稳定的无线链路一次性传完不现实。必须分包传输:每包512字节或1KB,包头包含总包数、包序号、目标地址、包CRC;接收端按序号写Flash,缺包就请求重传。整包传完后Bootloader再算一次全片CRC-32或者SHA-256,和云端下发的固件摘要对比,不一致就丢弃。

产品量大、面向C端时建议加签名验证:云端用私钥对固件签名,Bootloader里固化公钥,只校验通过的固件才能写入。这样即使通信通道被中间人篡改,恶意固件也刷不进去。

四、通信通道怎么选

- 家电类(带WiFi/蓝牙):走MQTT或自定义TCP长连接,服务器推送升级通知,设备端拉取固件分片;

- 工业4G类:走运营商网络,注意升级流量费,可以分批次灰度推送;

- CAN总线设备:主控板作为网关,整车或整线升级时通过CAN把固件分发给从节点;

- 纯UART小设备:Bootloader预留串口升级协议,现场工程师用一根USB-TTL线本地刷,也算兜底方案。

五、几个容易踩的坑

1)中断向量表重定位:App跳转前必须把SCB->VTOR指向新分区的中断向量偏移,否则一进中断就跑飞;

2)栈顶指针:Bootloader跳App前要手动把MSP设置成App中断向量表的第一个字;

3)看门狗:升级过程要定期喂狗,否则传输慢一点就被看门狗复位;

4)Flash擦写时间:大块擦除可能几十毫秒,期间必须关中断或关闭高优先级中断源;

5)App要回传启动心跳:App启动后几秒内通过标志位通知Bootloader"我活了",否则Bootloader判定升级失败自动回滚;

6)参数区和固件区物理隔离:升级不能动校准参数、设备唯一ID、联网配置。

六、成本权衡

双区备份会多用一份Flash容量,对小容量MCU(如64KB Flash)要精打细算。如果产品定位极简、现场有人值守、拆机可接受,也可以用单区+断点续传+CRC校验的折中方案,但高端产品和工业设备强烈建议双区+回滚。

我们在二十年的单片机控制板定制项目中,给家电、物联网、工业自动化客户做过多种OTA方案,从UART本地升级到4G远程双区升级都有成熟落地。关于Bootloader移植、分区表划分、签名校验的更多细节,可参考www.yjeie.com了解控制板定制服务。

版权所有 工控网 Copyright©2026 Gkong.com, All Rights Reserved