简介
双存储区功能是多款 STM32 微控制器的通用特性。本文档旨在描述如何在客户应用中使用此功能。
本应用笔记中涉及的主要内容是现场升级,通过 X-CUBE-DBFU STM32Cube 扩展包介绍。
即时更新的主要优点是可以最大程度地缩短切换阶段的停机时间,即使在更新期间也可以执行要求严苛的实时任务。
尽管本文档仅直接描述了 STM32L0 系列 Cat5 器件、STM32L4 系列的入门系列和 USB OTG器件,以及 STM32G4 系列 Cat.3 器件,但具有两个半独立存储器区的其他 STM32 微控制器也可以共享部分所述属性并采用类似的使用方式。
存储器子系统概述
STM32L0 系列使用 Cortex? M0+ 内核。STM32L4 和 STM32G4 系列使用 Cortex? M4 内核,并且数据总线与指令总线相互独立。这意味着,后两个系列器件中的 AHB 总线矩阵更为复
杂。另一个区别是 STM32L0 基于 EEPROM 技术。设计应用程序时,务必要牢记 STM32L0的数据 EEPROM 与程序 Flash 存储器共享存储区接口。
本文档涵盖的所有 MCU 均在 NVM 接口中采用了某种缓存机制,STM32L0 系列比较简单,基于 Cortex M4 的两个系列则采用了更为高级的 ART Accelerator?。
双存储区存储器可以被配置为一个支持连续寻址的大容量 NVM 块(少数情况例外,本文档不作详细介绍)。将 NVM 配置为两个并行块时则具有显著优势,最重要的是可以一边对其中一个存储区执行写操作,一边对另一个存储区执行读操作(和取指操作)。这一点在执行更新时尤为重要,因为无需停止从程序 NVM 中执行代码。
在设计使用双存储区器件的应用程序时,可以选择多种方法来使用程序存储器的后半部分。
即时更新
即时更新也称为即时现场升级,这是一种允许用户在不干扰器件正常工作的情况下修改代码
和配置的过程,与简单的 IAP 解决方案相比具有更多优势:
使用双存储区时可以更新加载程序的代码
即使加载失败,原始代码也仍然能够正常运行(操作可为“原子操作”)
无需定义加载程序状态,器件始终能够加载代码。
本文档通过几个示例详细介绍了如何在几微秒内将基于原始代码的所有操作转换为基于更新代码的所有操作。本文档还介绍了使用重新定位的向量表从 RAM 执行 ISR 的情况。这是降低中断延迟的常见解决方案,但在现场升级时执行起来比较棘手。
MCU 支持的特性
微控制器中实现了多种机制来确保固件正常执行,其中最重要的是能够一边对其中一个非易失性存储区进行写操作,一边从另一个非易失性存储区中执行代码。
存储器重映射切换
微控制器中有一个控制位(在 STM32L4 和 STM32G4 系列中标记为 FB_MODE,在STM32L0 系列中标记为 UFB)可供用户代码访问。该位位于系统配置寄存器中,用于控制存储器映射和别名。此外,该位也用于双存储区自举机制,如果使用时足够谨慎,还可用于即时现场升级。
根据标志设置,存储区 1 或存储区 2 被映射到以 0x0800 0000 为起始地址的区域,并在地址0x0000 0000 处设置别名。由于操作不影响 PC 和其他 CPU 寄存器,因此当该位发生翻转时,CPU 只会简单地从另一个存储区获取下一条指令。示例代码未链接到别名地址范围,因为如果涉及系统存储器中的 ST 自举程序,别名地址将保持为 0x0000 0000。
正常情况下,两个存储区中的代码均链接到以 0x0800 0000 为起始地址的区域。
可重新定位的中断向量表
CPU 可以配置 IVT 的偏移量。因此,可以通过软件定义更多的 IVT,并根据需要在它们之间进行切换。
向量表偏移量的默认值为 0x0000 0000,通常指向程序存储器的别名。
务必要为向量表预留足够的空间,每个中断向量需要 4 字节。此外,偏移地址值也存在限制,
即必须与 512 字节的倍数对齐。
用户选项字节中的 BFB2 标志
该标志本质上是用于触发在复位时尝试从存储区 2 自举。
当存储区 1 中不存在代码时,务必保持 BFB2 标志置 1,以确保在意外断电时也可保持安全。
当 BFB2 置 1 后,将激活系统自举程序以评估存储区 2 中是否存在代码,以便尽可能对其进行控制(详见相关参考手册或 AN2606)。之后,固件必须检测到存储区 1 的代码被替换,且程序从存储区 2 运行。
在该应用程序中,只有在从存储区 2 执行代码时发生意外断电的情况下,才使用 BFB2 作为故障安全机制。当存储区 1 不包含有效代码时,BFB2 必须保持置 1;当存储区 2 中的新代码复制到存储区 1 时,BFB2 清零。