
STM32F103做AB OTA这个事儿我前前后后在两个产品上折腾过一个是用C8T6做的小型采集器另一个是RCT6做的主控板。疫情期间设备已经发到现场发现固件有Bug没法派人挨个去烧才真正体会到OTA不是“锦上添花”而是救命用的。这篇教程就是把我从零复现AB OTA的整个过程完整写下来包括分区怎么规划、Bootloader怎么写、App端怎么做配合、串口协议怎么定、回滚怎么处理全部是可落地的方案适合手里有一块STM32F103开发板或者自己打过最小系统板、想给设备加上远程升级能力的同学。1. 项目背景为什么嵌入式设备需要AB OTA1.1 从“刷机”到“空中升级”的演进早些年给STM32升级固件最常用的方式就是ST-Link或者串口ISP把设备拆开用烧录器怼上去下载程序再装回去。开发阶段这样搞没问题一旦设备到了客户现场麻烦就来了几十台设备分布在几个城市每个都要开箱、接线、烧录、复原一趟下来小半天成本高不说还容易把端子排弄坏。后来很多人用IAPIn Application Programming方案也就是在设备里先烧一个Bootloader平时跑App需要升级时通过串口或者网络把新的bin文件传给Bootloader由Bootloader直接擦写App所在的Flash区域。这种单分区方案比拆机强多了但有一个隐蔽的大坑如果升级过程中断电、串口线被拔、传输数据错乱App区域可能被写到一半固件损坏设备直接变砖。因为Bootloader只有一个人App坏了它也无能为力只能等售后。AB OTA也叫双分区升级就是针对这个问题来的Flash里存两份App分别叫A区和B区Bootloader根据标志位决定启动哪一份。升级时只覆盖当前不在运行的那一份成功后才切换标志让Bootloader下次启动到新固件。如果中途失败旧的固件还在系统还能正常跑完全不怕断电。1.2 AB双分区方案究竟解决了什么问题官方有个词叫“A/B seamless update”字面意思是无缝升级。真正落地后AB方案带来的核心价值有三点。第一是防变砖。这是最实在的好处。因为总有当前有效的固件在Flash里趴着就算升级写到一半断电、复位、数据出错Bootloader启动时发现新区域不可用自动回退到旧区域设备顶多停留在旧版本不会变成死砖。对远程维护来说这相当于多了一条保命的退路。第二是支持失败回滚。我们当时遇到的情况是新固件烧进去之后设备能启动但跑了一会儿就死机。单分区方案遇到这种情况只能到现场重烧AB方案则可以设计成“启动后一段时间内没上报心跳Bootloader下一次复位自动切回旧版本”不需要人工介入。第三是升级过程不影响正常业务。写入B区的时候A区的固件还在正常运行设备该采集采集、该上报上报等B区完全写好了才通过软复位跳到新固件业务中断时间从“整个升级过程”缩短到“一次重启的时间”。1.3 本教程的复现目标与适用人群这篇教程的目标不是贴一个抄来就能跑的工程而是把AB OTA背后的设计思路和关键代码讲清楚让读者能根据自己的硬件和工程改造成自己的方案。请点击 支付 查看全文 end