
概览1 {1 {" ]1 @" Q% `3 P7 U 现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。/ j' _$ ~6 E3 l4 n# n 2 \2 U4 S9 K& J 6 h6 Z2 D2 ^ S STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。( x- y' t8 X; S ( ?( X4 t7 I# C7 A% k7 p RAMECC外设: ^" X3 G+ T6 ? v2 ? 在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。 1 A7 M' h2 ~ R3 H STM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。 / Z+ {9 U" u. B2 j* P 在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。2 X6 x9 a! W0 N* n $ t- F5 u4 V3 {: d STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。; t1 w+ |, A3 u u# d5 H4 W. W ![]() " o& l7 e H* ?" @ - _3 s8 L! l' g4 H/ W( s9 Z 关于ECC Controller8 b; t8 k1 L/ P STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。) |9 N4 U8 c: P* X; A* I3 b ) k4 A1 z( @% O, y# A ECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。5 F7 A I# \+ P* y* H " L( Z i$ |1 o* Y 4 [5 R7 C6 Q& F8 }* c$ m6 ] $ u0 s! Z. C3 ]& p8 \ 关于ECC Monitor* N: R# v) F# ]) e- T* | STM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。 8 [9 g$ a1 [- t5 b& \% C, j6 h ECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。 ![]() , K+ {' O4 ?4 b, W# S& I. o' u FAR和FDR寄存器* N- I3 ^) D( G" u7 G7 ? RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。 , P- _# l: b& X8 k0 A$ g8 ? 使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。 FAR寄存器里保存的是相对地址。实际出错地址的计算公式如下: ; V3 l' P8 K/ t5 U" A 实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。 1 d! e1 p: x; g" n S' `, d! y: V; R FDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。 我们可以看下面两个例子: + C4 T# G: D4 O+ z! |% A 例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。9 r" G' y- ?) Y6 S/ P ![]() L) E8 H5 }# g0 L% g/ m % u( N: |3 c! a, s/ G 这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。 / r5 ?4 M, }4 J 例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。* K P5 H! |, _. ?1 q4 P( ]0 b+ Z ![]() 6 J' [; H+ [6 p9 ] - Y$ A3 S" D8 C2 c8 K; n9 k8 h8 e. [ 因为SRAM1是32位总线接口,所以这时N的值是4。9 d5 c% R" P) l* L. d: A# A 2 g; ~! V3 w7 l) {, M& |! O. U3 ` 2 i% x9 G1 Y8 i9 T ( C5 [7 f4 s# \( ^$ s 在应用中如何正确使用RAM ECC8 d' J4 z+ G- W9 R+ c& ~+ ~7 l4 Z 在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。 % A. |" |6 A3 s! Q* [ 对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。 通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。; {. Z% a% e9 z9 P) j- A6 [1 J! ^ |
拷打cubemx【003】——找不到的芯片包
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明
实战经验 | 关于STM32H745的MC SDK电机控制工程问题的解决办法
您好,但是参考了各方资料,STM32H7系列的RAM区ECC功能无法关闭,这就导致无法查看RAM区原始数据,特别是对单bit错误的纠正功能没有手段去验证,这块能赐教下吗