1. 课程导入
在嵌入式产品交付中,固件升级从来不是“把新程序烧进去”这么简单。真正让工程师头疼的,是升级过程中突然断电、通信中断、镜像校验失败,导致设备变砖、现场返修。STM32 的双 Bank(Dual Bank)Flash 机制,正是为解决这一类问题而设计的硬件级方案:它把同一片 Flash 划分为两个可独立擦写、独立运行的存储区,让“旧固件继续跑、新固件后台写”成为可能,从而实现掉电安全、可回滚的现场升级。
本课程围绕 STM32 双 Bank 固件升级工程展开,目标不是讲清一个寄存器,而是带你走完一条从原理到量产的完整链路。学完之后,你应当能够独立设计一套具备断电保护、版本回滚、完整性校验能力的升级方案,并能定位升级失败的真实原因。
一、学习目标:从“会烧录”到“会设计升级系统”
本课程的学习目标分为四个层次,逐层递进:
- 原理层:理解 STM32 Flash 双 Bank 的物理划分、Bank 切换机制、启动地址映射,以及 BFB2、DBANK 等关键选项字节的含义。
- 设计层:能够规划 Bootloader 与 App 的分区布局,设计升级标志、版本号、镜像头、CRC 校验等元数据结构。
- 实现层:掌握 Flash 解锁、页擦除、双字编程、Bank 交换、跳转执行等关键代码流程,并能用 YMODEM、串口或自定义协议传输镜像。
- 验证层:能够构造断电、校验失败、镜像损坏等异常场景,验证回滚逻辑,并用日志和状态机复盘问题。
二、核心价值:为什么值得投入学习双 Bank 升级
很多团队最初用“单 Bank + Bootloader”做升级,逻辑是:Bootloader 先擦除 App 区,再写入新固件。这个方案最大的风险在于擦除之后、写入完成之前,设备没有任何可运行固件,一旦断电就是“砖”。双 Bank 的价值恰恰在于消除了这个“空窗期”。
具体来说,双 Bank 升级带来三重价值:
- 掉电安全:新固件写入备用 Bank 期间,当前 Bank 始终完整可运行,断电后重启仍能回到旧版本。
- 可回滚:新固件校验失败或启动异常时,可通过标志位切回旧 Bank,避免批量事故。
- 在线升级体验:配合 Bootloader,可实现后台下载、复位切换,减少现场停机时间。
从工程角度看,双 Bank 不只是“多一块 Flash”,而是一套状态管理机制。它要求你同时考虑存储布局、启动流程、校验策略和异常恢复,这正是嵌入式系统设计能力的集中体现。
三、整体知识框架:一张图看清全貌
下面的结构图展示了本课程的知识骨架:从硬件 Bank 划分,到 Bootloader 与 App 的协作,再到升级状态机与回滚路径。理解这张图,就理解了整门课的主线。
四、方法流程:双 Bank 升级的典型时序
双 Bank 升级的典型流程可以概括为“旧 Bank 运行、新 Bank 写入、校验通过后切换”。下面用一段伪代码描述 Bootloader 的核心判断逻辑,帮助建立整体印象:
上电复位
↓
读取升级标志区(UpgradeFlag)
↓
if (标志 == 需要升级) {
擦除备用 Bank
接收镜像 → 写入备用 Bank
计算 CRC 并与镜像头比对
if (校验通过) {
设置启动 Bank = 备用 Bank
清除升级标志
复位
} else {
保留原 Bank
记录错误码
}
}
跳转到当前有效 Bank 的 App 入口
这段逻辑看似简单,但真正落地时会遇到大量细节:标志区放在哪一页、擦写顺序如何保证原子性、CRC 覆盖范围是否包含镜像头、跳转前是否需要关闭中断和外设。这些细节将在后续章节逐一展开。
五、案例与场景:从智能表计到工业网关
以一款基于 STM32F4 的智能电表为例。设备安装在配电箱内,现场无法拆机,只能通过 RS485 远程升级。若采用单 Bank 方案,升级过程中一旦通信中断,电表将无法启动,必须返厂。改用双 Bank 后,新固件先写入 Bank2,校验通过后设置切换标志并复位,Bank1 作为备份保留。即使升级失败,设备仍运行旧版本,运维人员可择机重试。
类似场景还包括工业网关、车载终端、医疗设备等对可用性要求高的产品。它们的共同点是:升级失败的成本远高于升级本身,因此必须用硬件机制兜底。
六、常见误区与复盘要点
- 误区二:只做写入校验,不做启动校验。新固件 CRC 正确,但可能因中断向量表偏移错误而无法运行,必须增加“启动确认”机制。
- 误区三:升级标志与固件放在同一页,擦除时把标志一起擦掉,导致状态丢失。标志区应独立成页并最后写入。
- 误区四:忽略选项字节的写入寿命和锁定状态,反复切换 Bank 导致配置异常。
复盘时建议围绕三个问题:升级失败后设备处于什么状态?旧固件是否仍可启动?错误码能否定位到具体阶段?能回答这三个问题,方案才算真正可靠。
七、关键参数与检查清单
| 检查项 | 说明 | 典型值 / 要求 |
|---|---|---|
| Bank 大小 | 由芯片型号决定,需查数据手册 | 如 512KB / Bank |
| 页大小 | 擦除最小单位 | 如 16KB / 页(F4 大容量) |
| 镜像头 | 含版本、长度、CRC、入口地址 | 建议 32 字节对齐 |
| 校验算法 | 完整性校验 | CRC32 或硬件 CRC |
| 升级标志 | 独立页,原子写入 | 双备份 + 反码 |
| 回滚条件 | 启动失败或校验失败 | 连续失败 3 次回滚 |
这张清单可以作为你后续动手时的自检表。每一项都对应课程中的一个具体章节,建议在实战中逐项确认,而不是等到设备变砖后再回头排查。
双 Bank 固件升级的本质,是用存储冗余换取运行连续性。掌握它,你不仅能做出一个能升级的产品,更能做出一个“升级失败也不会死”的产品。这正是本课程希望带给你的工程能力。