STM32H7 的 FLASH ECC 介绍 LAT1558
关键字:STM32H7, FLASH ECC
1. 前言
随着微电子产品的应用越来越广泛,同时,系统对可靠性和安全性的要求也越来越高。而在实际应用中系统存储单元可能发生故障,因此存储器完整性保护变得愈加重要。ECC 【Error correction Code】技术被广泛用于防止数据损坏,确保数据的准确性,提高系统的可靠性和安全性。
在 STM32H7 系列微控制器配备了大容量的内部 FLASH 存储器,用于存储程序代码和数据,有些型号 STM32H7 MCU 其容量高达 2MB。因此在 FALSH 操作过程中不可避免的会遇到FLASH ECC 问题。
本文介绍了 STM32H7 的 FLASH ECC 结构及原理,并且通过软件方法模拟了 FLASH ECC故障,以及发生故障后的处理方法,最后总结了 STM32H7 的 FALSH 操作的注意事项。
2. STM32H7 Flash 介绍
ECC(Error Correction Code)由数学家 Richard Hamming 发明,第一个 Hamming 码使用 7 位存储 4 位信息,冗余位用于纠正和检测错误。在 STM32H7 系列器件中,RAM 和Flash 存储器均使用基于 Hamming 原理的 SEC/DED (Single-Error Correction/Double-Error Detection)算法进行保护。ECC 码能够检测并纠正存储的数据字中的一位错误,并对两位错误进行检测
对于 STM32H72x/3x/4x/5x 型微控制器,Flash Word(最小可编程内存量)为 256 位,而在STM32H7Ax/Bx 型上为 128 位。这也是在 Flash Word 上实现 SEC 和 DED 功能所需的10 个ECC 位(STM32H7Ax/Bx 型为 9 个 ECC 位)保护的存储器部分。只有在读取-修改-写入的基础上才能对任何较小的内存单元进行写访问,这种操作会对内存硬件造成更大的压力。
ECC 功能集成在 Flash 控制器中,不能禁用。如果应用并不适用于 ECC,则可禁用相关的中断功能并忽略 Flash 状态寄存器中的标志位。
3. STM32H743 的 Flash
以 STM32H743 为例,Flash 中的数据为 266 位字:每 256 位的 Flash 字增加了 10 个 ECC 位 。 ECC 机 制 基 于 SEC/DED 算 法 。 它 支 持 : SEC(Single-Error Correction) 以 及DED(Double-Error Detection) 。
检测到错误并进行校正后,FLASH_SR1/2 寄存器中的 SNECCERR1/2 标志会置 1。如果FLASH_CR1/2 寄存器中的 SNECCERRIE 位置 1,将生成中断。
如果检测到两个错误,FLASH_SR1/2 寄存器中的 DBECCERR1/2 标志会置 1,并会生成总线错误。在这种情况下,将不会对接收到的数据进行校正。如果 FLASH_CR1/2 寄存器中的DBECCERRIE1/2 位置 1,将生成中断。
如果检测到 ECC 错误,出错 Flash 字的地址会保存到 FLASH_ECC_FA1/2R 寄存器中。如果连续检测到错误,将只会存储第一个错误对应的地址。当生成错误的相关标志复位后,该寄存器会自动清空。
4. 试验-Flash ECC 故障注入
对于 STM32H7 的 FLASH ECC 验证,我们可以采用软件的方法模拟 ECC 故障注入,其原理是一次擦除后对 FLASH 进行两次连续写入不同值。然后再通过读取该 Flash 地址的数据来触发 ECC 故障。
在这里,我们使用 NUCLEO-H743 板子进行测试,它有三个状态指示灯,我们利用这三个状态指示灯来指示目前程序状态。LED1 亮代表触发了 SEC 故障,LED2 亮代表触发了 DED 故障,LED3 闪烁代表程序正常运行,LED3 常亮代表程序进去了 HardFault_Handler(void) 。
首先,如图 1 所示,使能 ECC 中断,并且在 FLASH 中断回调函数中加入对 ECC 错误的状态指示灯。
图1. 使能 ECC 中断以及加入 ECC 回调函数

图2. HardFault 处理函数

图3. main 函数

在 main 函数中,首先对 Flash 进行了擦除操作,然后对 Flash 进行 Single ECC 错误故障注入或 Double ECC 错误故障注入,然后通过读取该地址内容触发 ECC 故障。
4.1. Single ECC 注入
首先我们定义了两个数组(如图 4 所示),用来完成一个 FLASH Word 写入。两个数组差异为 1 个 bit。
图4. Single ECC 写入 Flash Word 定义

然后,我们运行图 5 函数来模拟 Single ECC 故障发生。然后再读取这个 Flash 地址
的内容去触发 ECC 错误。这时我们可以看到板子 LED1 灯亮,LED3 灯闪烁。
图5. 模拟 Single ECC 故障发生

通过 STM32 CubeProgrammer 观察 FLASH 寄存器状态(图 6)。可以看到 SR1 寄存器中的 SNECCERR 已经 被置位“1”,并且 ECC_FA1R 寄存器已经将发生错误的地址记录了下来。(该地址为 Flash Word 地址,需要转换一下才是 Flash 地址)
图6. Flash 寄存器状态

4.2. Double ECC 注入
Double ECC 故障注入方法类似,只不过两个数组差异为两个 bit,如图 7 所示。
图7. Double ECC 写入 Flash Word 定义

然后,我们运行图 8 函数来模拟 Single ECC 故障发生。然后再读取这个 Flash 地址的内容去触发 ECC 错误。这是我们可以看到程序已经进入 HardFault_Handler(void) 。
图8. 模拟 Double ECC 故障发生

通过 STM32 CubeProgrammer 观察 FLASH 寄存器状态(图 9)。可以看到 SR1 寄存器中的 DBECCERR 已经 被置位“1”,并且 ECC_FA1R 寄存器已经将发生错误的地址记录了下来。(该地址为 Flash Word 地址,需要转换一下才是 Flash 地址)
图9. Flash 寄存器状态

5. FLASH 使用小结
5.1. FLASH 操作注意事项
a) FLASH 操作过程中不应该被其他操作打断,如掉电,复位;
b) FLASH 应遵循先擦后写,不建议在同一地址连续写两次;
c) 不能对 FLASH 寄存器解锁两次,否则 FLASH 寄存器将被锁定,直至下一次复位;
d) FLASH 擦除前先清故障标志;
e) 对 option bytes 的错误操作可以导致 bus error,ECC double error detection event也会导致 bus error;
5.2. 常见的导致 ECC 错误的原因
a) 闪存的典型故障是由于存储单元磨损和电荷泄漏导致的。可能导致故障的一些因素包括来自相邻单元的干扰或编程期间电压不稳定;
b) 与 SRAM 不同,某些内存地址的故障可能表明同一页面中随后的故障概率略高在两次erase 之间,向同一个 Flash 地址写入两次不同的值;
c) 在 Flash program 或者 Flash erase 过程中突然断电或异常终止;
d) 电磁辐射;
5.3. FLASH ECC 总结
a) 在 Flash 存储器中,数据寿命会随时间衰减,尤其是在高温下。存储温度会对 Flash 存储器数据寿命产生影响;
b) 对 FLASH 进行循环(编程)时温度的影响会更大;
c) 由于 10 位 ECC 码关联到每个 256 位数据 Flash 字,因此只支持按 256 位进行的写操作;
d) Flash 不同于 SRAM,其 Erase 过程是写“1”,其 Program 过程是写“0”。因此正确的操作过程是先要对 FLASH 先进行 Erase 操作再进行 Program 操作,不可以对 FLASH 同一地址连续 program 不同值;
e) Flash 的 SEC(Single-Error Correction)仅仅是读纠错,其 Flash 的错误不能被自动纠正回来;
f) ECC 是 Memory 的一种保护机制,产生了 ECC 错误并不代表 Flash/RAM 内存物理上损坏;
g) 对 Flash 进行擦除也可以修复 ECC 错误,或者不再去读内容被破坏的内存,也可以规避掉 ECC 错误的产生;
h) Flash 存储器只能对每个存储字进行一定量的重写,这就需要在数据存储的情况下实现平均抹写存储区块。
更多推荐

所有评论(0)