• 正文
  • 相关推荐
申请入驻 产业图谱

STM32 双存储区即时固件更新详解

05/25 16:37
914
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

工业控制物联网终端、医疗设备等对运行连续性要求极高的嵌入式场景中,传统 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 函数内、堆栈最低位区域。

切换流程:

  1. 关闭全局中断
  2. 禁用并清空缓存
  3. 修改中断向量表偏移
  4. 翻转存储区切换控制位
  5. 恢复缓存配置
  6. 重新开启中断该代码体积越小越好,建议编译为独立库文件,后续版本直接复用,避免二进制差异导致崩溃。

方案 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 协议升级,操作流程清晰:

  1. 下载新固件至闲置存储区并解密校验
  2. 擦除 / 重写备用存储区、完整性检查
  3. 微秒级切换存储区、配置 BFB2 标志

固件加密保护

支持 AES 硬件加密的型号(STM32L083/L486/G484),可实现固件加密传输与解密运行:

  • 采用 CTR 模式 AES 加密,无需填充、抗传输错误
  • 用 Crypto++ 库生成加密固件,设备端硬件解密
  • 加盐值抵御已知明文攻击,提升固件安全性

6. 开发落地避坑要点

  1. 双区固件均链接到 0x0800 0000 起始地址,不使用别名地址
  2. 不可修改代码必须全量测试,杜绝隐藏 Bug
  3. 避免动态堆内存,即时更新场景下堆无法稳定运行
  4. 升级包添加版本、产品标识,防止刷入不兼容固件
  5. 可结合 AN4894 实现 EEPROM 仿真,双区同步存储配置数据

双存储区是 STM32 实现高可靠、零停机固件更新的核心硬件基础,AN4767 应用笔记从原理、实现、示例全链路给出标准化方案。相比传统 Bootloader + 单区升级,双存储区即时更新可满足工业、医疗、车载等严苛场景的不间断运行需求,配合 X‑CUBE‑DBFU 扩展包,能大幅降低开发成本、缩短验证周期。

实际项目中,只需根据目标 MCU 型号适配存储区切换寄存器、优化 RAM 数据管理、做好加密校验,即可快速落地稳定的即时固件更新功能。

相关推荐