STM32H5 EDATA (高寿命数据区) 使用指南与注意事项
STM32H5 系列微控制器提供的 EDATA 功能是专为 EEPROM 模拟设计的 Flash 存储区域,支持高达 100,000 次的擦写循环。为了确保系统稳定性和访问效率,开发者必须正确配置选项字节、内存保护单元 (MPU) 并妥善处理 ECC 纠错引起的 NMI 中断。
- 高可靠性存储 :EDATA 提供 100k 次擦写寿命,远高于标准 Flash 扇区。
- 强制非缓存配置 :必须通过 MPU 将 EDATA 区域设置为 non-cacheable,否则会导致系统 HardFault。
- ECC 与 NMI 机制 :读取未初始化的 EDATA 区域会触发 NMI 中断,需在中断服务程序中进行首次擦写处理。
- RWW 性能优化 :建议将代码运行与 EDATA 存储分布在不同的 Bank,以实现读写同时进行 (Read-While-Write)。
STM32H5 EDATA 核心技术规范与配置流程
1. EDATA 选项字节配置与空间规划
STM32H5 的 EDATA 空间通过选项字节 EDATA(1/2)_EN 和 EDATA(1/2)_STAT 进行定义。在 STM32CubeProgrammer 中,EDATA_STAT 的取值范围为 0 至 7,其中 0 代表保留 Bank 的最后 1 个扇区,7 代表保留最后 8 个扇区。若通过 HAL 库代码配置,EDATASize 取值范围为 0 至 8(0 表示禁用)。每个 EDATA 扇区的大小通常为 6KB,并带有 6-bit ECC 校验位。
2. MPU 内存属性强制要求
由于 STM32H5 的 EDATA 区域通过 AHB 总线访问,默认情况下 AHB 内存区域属性为 cacheable。然而,STM32H5 EDATA 硬件特性要求其必须为不可缓存区域。开发者必须使用 Cortex 内存保护单元 (MPU) 将 EDATA 对应的地址范围(例如 Bank1 的 0x0900 0000 - 0x0900 BFFF)配置为 "Normal non-cacheable" 属性。如果未配置 MPU,CPU 访问该区域时将直接触发硬件异常 (HardFault)。
3. ECC 纠错与初次读取异常处理
STM32H5 EDATA 采用 128-bit Flash 字对应 9-bit ECC 的机制,或在某些模式下为 16-bit 字对应 6-bit ECC。对于从未写入过数据的“处女”区域,其 ECC 校验值是不确定的。直接读取这些未初始化的区域会触发 ECC 错误并产生不可屏蔽中断 (NMI)。在生产或首运行流程中,建议先执行擦除或写入操作再进行读取;或者在 NMI_Handler 中调用 HAL_FLASHEx_ECCD_IRQHandler(),识别出 EDATA 区域的 ECC 错误后进行格式化处理。
4. RWW (Read-While-Write) 架构优化
为了获得最高的访问效率,推荐采用跨 Bank 布局策略。将应用程序代码存放在 Flash Bank 1 中运行,而将 EDATA 存储区配置在 Flash Bank 2。这种双 Bank 配置允许 CPU 在执行代码的同时对 EDATA 进行擦写操作,避免了单 Bank 下因 Flash 忙导致的流水线停顿,显著提升实时性。
常见问题解答 (FAQ)
为什么读取 EDATA 会导致 STM32H5 进入 HardFault?
这是因为 EDATA 区域未在 MPU 中配置为 non-cacheable。默认的 cacheable 属性与 EDATA 硬件访问机制冲突,必须显式禁用缓存。
EDATA 区域支持的最大扇区数量是多少?
STM32H5 每个 Bank 最多支持配置 8 个 EDATA 扇区。通过 EDATASize 参数可以灵活调节启用数量(1~8个)。
如何在代码中判断 EDATA 触发了 ECC 错误?
可以在 NMI 中断服务程序中通过 HAL_FLASHEx_GetEccInfo() 获取产生错误的地址,若地址落在 EDATA 范围内且数据为 0xFFFF,则通常是未初始化导致的错误。
在 TrustZone 工程中使用 EDATA 有什么限制?
在 TrustZone 环境下,安全区与非安全区的调用函数默认存放在 Flash 最后一个扇区。由于 EDATA 也占用末尾扇区,需修改分散加载文件 (Linker Script) 以避免地址冲突。
更多内容,请下载 LAT1571 STM32H5使用EDATA时的注意事项 |