1. 课程导入

在嵌入式产品交付中,固件升级从来不是“把新程序烧进去”这么简单。真正让工程师头疼的,是升级过程中突然断电、通信中断、镜像校验失败,导致设备变砖、现场返修。STM32 的双 Bank(Dual Bank)Flash 机制,正是为解决这一类问题而设计的硬件级方案:它把同一片 Flash 划分为两个可独立擦写、独立运行的存储区,让“旧固件继续跑、新固件后台写”成为可能,从而实现掉电安全、可回滚的现场升级。

本课程围绕 STM32 双 Bank 固件升级工程展开,目标不是讲清一个寄存器,而是带你走完一条从原理到量产的完整链路。学完之后,你应当能够独立设计一套具备断电保护、版本回滚、完整性校验能力的升级方案,并能定位升级失败的真实原因。

一、学习目标:从“会烧录”到“会设计升级系统”

本课程的学习目标分为四个层次,逐层递进:

  • 原理层:理解 STM32 Flash 双 Bank 的物理划分、Bank 切换机制、启动地址映射,以及 BFB2、DBANK 等关键选项字节的含义。
  • 设计层:能够规划 Bootloader 与 App 的分区布局,设计升级标志、版本号、镜像头、CRC 校验等元数据结构。
  • 实现层:掌握 Flash 解锁、页擦除、双字编程、Bank 交换、跳转执行等关键代码流程,并能用 YMODEM、串口或自定义协议传输镜像。
  • 验证层:能够构造断电、校验失败、镜像损坏等异常场景,验证回滚逻辑,并用日志和状态机复盘问题。
核心判断标准:一套合格的双 Bank 升级方案,必须在“升级中途断电”这一最恶劣场景下,仍能保证设备重启后运行一个可用的固件版本。

二、核心价值:为什么值得投入学习双 Bank 升级

很多团队最初用“单 Bank + Bootloader”做升级,逻辑是:Bootloader 先擦除 App 区,再写入新固件。这个方案最大的风险在于擦除之后、写入完成之前,设备没有任何可运行固件,一旦断电就是“砖”。双 Bank 的价值恰恰在于消除了这个“空窗期”。

具体来说,双 Bank 升级带来三重价值:

  • 掉电安全:新固件写入备用 Bank 期间,当前 Bank 始终完整可运行,断电后重启仍能回到旧版本。
  • 可回滚:新固件校验失败或启动异常时,可通过标志位切回旧 Bank,避免批量事故。
  • 在线升级体验:配合 Bootloader,可实现后台下载、复位切换,减少现场停机时间。

从工程角度看,双 Bank 不只是“多一块 Flash”,而是一套状态管理机制。它要求你同时考虑存储布局、启动流程、校验策略和异常恢复,这正是嵌入式系统设计能力的集中体现。

三、整体知识框架:一张图看清全貌

下面的结构图展示了本课程的知识骨架:从硬件 Bank 划分,到 Bootloader 与 App 的协作,再到升级状态机与回滚路径。理解这张图,就理解了整门课的主线。

STM32 双 Bank 固件升级知识框架 硬件与存储层 Bank1:当前运行固件 Bank2:待升级固件 选项字节 / 启动映射 软件与流程层 Bootloader 镜像传输协议 Flash 编程与校验 跳转执行 状态与决策层 空闲 / 正常启动 接收升级请求 写入并校验 切换 / 回滚 实战路线 环境搭建 → 分区规划 → Bootloader 编写 → 镜像传输 → 校验与回滚 → 异常测试 → 量产固化

四、方法流程:双 Bank 升级的典型时序

双 Bank 升级的典型流程可以概括为“旧 Bank 运行、新 Bank 写入、校验通过后切换”。下面用一段伪代码描述 Bootloader 的核心判断逻辑,帮助建立整体印象:

上电复位
  ↓
读取升级标志区(UpgradeFlag)
  ↓
if (标志 == 需要升级) {
    擦除备用 Bank
    接收镜像 → 写入备用 Bank
    计算 CRC 并与镜像头比对
    if (校验通过) {
        设置启动 Bank = 备用 Bank
        清除升级标志
        复位
    } else {
        保留原 Bank
        记录错误码
    }
}
跳转到当前有效 Bank 的 App 入口

这段逻辑看似简单,但真正落地时会遇到大量细节:标志区放在哪一页、擦写顺序如何保证原子性、CRC 覆盖范围是否包含镜像头、跳转前是否需要关闭中断和外设。这些细节将在后续章节逐一展开。

五、案例与场景:从智能表计到工业网关

以一款基于 STM32F4 的智能电表为例。设备安装在配电箱内,现场无法拆机,只能通过 RS485 远程升级。若采用单 Bank 方案,升级过程中一旦通信中断,电表将无法启动,必须返厂。改用双 Bank 后,新固件先写入 Bank2,校验通过后设置切换标志并复位,Bank1 作为备份保留。即使升级失败,设备仍运行旧版本,运维人员可择机重试。

类似场景还包括工业网关、车载终端、医疗设备等对可用性要求高的产品。它们的共同点是:升级失败的成本远高于升级本身,因此必须用硬件机制兜底。

六、常见误区与复盘要点

误区一:认为双 Bank 就是“两个 App 分区”。实际上 Bank 的划分由芯片型号和选项字节决定,部分型号的 Bank 大小并不对称,分区规划必须查数据手册。
  • 误区二:只做写入校验,不做启动校验。新固件 CRC 正确,但可能因中断向量表偏移错误而无法运行,必须增加“启动确认”机制。
  • 误区三:升级标志与固件放在同一页,擦除时把标志一起擦掉,导致状态丢失。标志区应独立成页并最后写入。
  • 误区四:忽略选项字节的写入寿命和锁定状态,反复切换 Bank 导致配置异常。

复盘时建议围绕三个问题:升级失败后设备处于什么状态?旧固件是否仍可启动?错误码能否定位到具体阶段?能回答这三个问题,方案才算真正可靠。

七、关键参数与检查清单

检查项 说明 典型值 / 要求
Bank 大小 由芯片型号决定,需查数据手册 如 512KB / Bank
页大小 擦除最小单位 如 16KB / 页(F4 大容量)
镜像头 含版本、长度、CRC、入口地址 建议 32 字节对齐
校验算法 完整性校验 CRC32 或硬件 CRC
升级标志 独立页,原子写入 双备份 + 反码
回滚条件 启动失败或校验失败 连续失败 3 次回滚

这张清单可以作为你后续动手时的自检表。每一项都对应课程中的一个具体章节,建议在实战中逐项确认,而不是等到设备变砖后再回头排查。

双 Bank 固件升级的本质,是用存储冗余换取运行连续性。掌握它,你不仅能做出一个能升级的产品,更能做出一个“升级失败也不会死”的产品。这正是本课程希望带给你的工程能力。