在工业控制、物联网终端、医疗设备等对运行连续性要求极高的嵌入式场景中,传统 STM32 固件升级往往面临停机时间长、升级失败易变砖、无法兼顾实时任务等痛点。意法半导体 AN4767 应用笔记给出了成熟解决方案 —— 基于双存储区硬件特性实现即时固件更新,配合 X‑CUBE‑DBFU 扩展包,可在微秒级完成固件切换,全程不中断核心业务运行。本文结合官方笔记核心要点,用实战化思路拆解双存储区即时更新的原理、实现与落地细节。
资料获取:【应用笔记】双存储区 STM32 微控制器的即时固件更新
1. 双存储区与即时固件更新:基础认知
双存储区是多款 STM32 MCU 的原生硬件特性,将片内 Flash 划分为两个半独立的非易失性存储区(Bank1/Bank2),支持并行读写操作:一个存储区运行当前固件、执行取指与读操作,另一个可同步擦写、写入新固件,完全不干扰正常业务。
即时固件更新(即时现场升级)是基于双存储区的升级模式,核心优势远超传统 IAP 方案:
- 零停机风险:切换仅耗时数微秒,更新期间可正常执行实时任务
- 原子级安全:新固件验证通过才切换,升级失败 / 掉电不影响原固件运行
- 加载程序可更新:无需独立 Bootloader,双区均可承载完整固件与升级逻辑
- 无状态约束:器件始终可正常加载代码,无需维护复杂升级状态位
笔记覆盖 STM32L0 Cat5、STM32L4 入门 / USB OTG、STM32G4 Cat.3 系列,其他带双存储区的 STM32 器件可复用核心逻辑适配开发。
2. STM32 双存储区更新的三大硬件支撑
即时更新的稳定性依赖 MCU 原生硬件机制,AN4767 重点明确三项核心配置:
2.1 存储器重映射切换
双存储区通过控制位实现地址映射切换:STM32L4/G4 用 FB_MODE 位,STM32L0 用 UFB 位,均位于系统配置寄存器。
该位翻转后,Bank1/Bank2 会动态映射到 0x0800 0000 起始地址,0x0000 0000 同步生成别名地址;切换不改变 PC 与 CPU 寄存器,CPU 直接从新存储区取指,实现无缝跳转。
2.2 可重新定位的中断向量表
中断向量表(IVT)可通过VTOR 寄存器偏移重定位,满足双区切换时的中断响应需求:
- 向量表偏移需512 字节对齐,每个中断向量占 4 字节
- 切换存储区时同步修改 VTOR,避免中断指向失效地址
- 实时性要求高的 ISR 可放入 RAM,进一步降低延迟
2.3 BFB2 选项字节标志
BFB2 是复位后从 Bank2 启动的安全兜底机制:
- 存储区 1 无有效代码时,置位 BFB2 确保异常断电后设备可启动
- 新固件从 Bank2 复制到 Bank1 后,清零 BFB2 恢复正常启动流程
- 配合系统自举程序,可自动校验 Bank2 固件有效性,提升升级安全性
3. 核心实现:两类稳定切换方案
AN4767 给出两种经官方验证的存储区切换方案,兼顾稳定性与实时性:
方案 1:不可修改代码(推荐)
切换过程中存储区重映射会改变取指地址,必须预留一段无 Bug、不可修改的固定代码执行切换,通常放在 main 函数内、堆栈最低位区域。
切换流程:
- 关闭全局中断
- 禁用并清空缓存
- 修改中断向量表偏移
- 翻转存储区切换控制位
- 恢复缓存配置
- 重新开启中断该代码体积越小越好,建议编译为独立库文件,后续版本直接复用,避免二进制差异导致崩溃。
方案 2:RAM 中运行切换代码
对稳定性要求极致的场景,可将切换函数放入 RAM 执行:
- RAM 划分两个分区,分别对应双存储区的 ISR 代码
- 双区 ISR 功能一致,通过 VTOR 切换向量表,规避 NMI 导致的崩溃风险
- 仅时间关键型 ISR 放入 RAM,平衡性能与资源占用
4. 易失性数据管理:升级不丢数的关键
即时更新不执行系统复位,RAM 数据不会被启动代码重新初始化,数据结构一致性是升级成功的核心:
4.1 避免数据结构异常变更
- 固定链接器配置,不随意修改编译器参数
- 变量删除用同大小虚拟变量占位,新增变量放入未用 RAM 分区
- 直接复用旧版目标文件,杜绝地址偏移
4.2 分级处理数据修改
AN4767 定义 5 级修改严重性,匹配对应处理逻辑:
| 级别 | 数据变化 | 升级后操作 |
|---|---|---|
| 0 | 映射文件完全一致 | 无需操作 |
| 1 | 删除变量 | 校验地址无偏移 |
| 2 | 新增变量 | 按需初始化 |
| 3 | 地址变更 | 代码迁移数据 |
| 4 | 结构修改 | 旧数据转新格式 |
| 建议新增单次初始化函数,切换后仅执行一次,完成数据适配。 |
4.3 切换时序控制
- 选择无高优先级中断的空闲时隙执行切换
- 提升系统时钟至最大,缩短切换耗时
- 用内部标志位触发切换,适配多任务周期调度
5. 官方示例与安全加密:X‑CUBE‑DBFU 落地实践
AN4767 配套 X‑CUBE‑DBFU 扩展包提供可直接编译的示例工程,适配 STM32 评估板,支持 UART+YMODEM 协议升级,操作流程清晰:
- 下载新固件至闲置存储区并解密校验
- 擦除 / 重写备用存储区、完整性检查
- 微秒级切换存储区、配置 BFB2 标志
固件加密保护
支持 AES 硬件加密的型号(STM32L083/L486/G484),可实现固件加密传输与解密运行:
- 采用 CTR 模式 AES 加密,无需填充、抗传输错误
- 用 Crypto++ 库生成加密固件,设备端硬件解密
- 加盐值抵御已知明文攻击,提升固件安全性
6. 开发落地避坑要点
- 双区固件均链接到 0x0800 0000 起始地址,不使用别名地址
- 不可修改代码必须全量测试,杜绝隐藏 Bug
- 避免动态堆内存,即时更新场景下堆无法稳定运行
- 升级包添加版本、产品标识,防止刷入不兼容固件
- 可结合 AN4894 实现 EEPROM 仿真,双区同步存储配置数据
双存储区是 STM32 实现高可靠、零停机固件更新的核心硬件基础,AN4767 应用笔记从原理、实现、示例全链路给出标准化方案。相比传统 Bootloader + 单区升级,双存储区即时更新可满足工业、医疗、车载等严苛场景的不间断运行需求,配合 X‑CUBE‑DBFU 扩展包,能大幅降低开发成本、缩短验证周期。
实际项目中,只需根据目标 MCU 型号适配存储区切换寄存器、优化 RAM 数据管理、做好加密校验,即可快速落地稳定的即时固件更新功能。
914