你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

工程师笔记 | STM32H7 RAMECC功能及应用

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览7 X3 Y3 j* Z+ d; s
现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。& t# Y7 q/ Q7 Z* o3 @. e

% H/ f* w: f. l/ H6 @3 X
& T) P' i8 a- N4 x4 \
STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。* B" p) w1 M% I" b; D
4 T9 [2 |9 |  i3 |. J

, v7 }& U/ g5 e# D7 O; i: I! y; ?
; ]2 I) E; l# A" P
RAMECC外设; t1 s6 s- n# `
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。
9 ]; o  O$ B3 K! c+ b; j2 m% Y! i3 p) }
$ L, J. N( G8 L) w8 C; Z$ p

1 K. v  I$ ^; P5 T! b6 T9 wSTM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
! W6 P4 q. a4 U1 W7 h3 I" b9 Z0 I/ T/ G) d; C; a5 y

/ h" F& A1 c: D% }5 P$ s! ?: I6 M在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。
, K+ ]% k: L. c2 j; T3 ?3 ~% [4 w8 e+ ]5 P7 w  R& g- d. y, y
( Y# u2 q- B$ ^( p
STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。, r& u' A, ^  \" ~! H7 y9 n
1.png
' _5 Z8 |4 J5 y+ u1 q7 o0 w( t$ }% t) d0 `

+ I8 N, q3 r2 t+ [" ~& b0 I& t关于ECC Controller
% l& V9 }9 X* z7 ?2 w* u9 |STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。
" S5 i2 |0 B* x
/ S* a- Z+ ]1 E1 ]1 q- E9 |

/ K7 e7 k, N/ z. q+ rECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。
$ C+ w- Q, V( |% Z- M  I8 P5 _( G# w1 C; F* Z; c

) |1 X% \) g3 U1 r2 E% f/ o. G( m# K9 J: q2 h, F

. S" R; j5 _& u. T- W0 k3 ]关于ECC Monitor
! D& z+ p1 |% u2 LSTM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。$ T$ A' D4 K$ e

% M9 l6 O$ |+ Y1 m, k# H1 G
3 W! f" t: U+ x1 I  s" P9 B
ECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。
/ i$ X- w. f4 I' ]  y 2.png
8 U. R$ K% [$ Q8 T6 U4 m2 J; R: J: c/ h& S! k% c4 [( z

- @" o  {9 k, }; A" L" CFAR和FDR寄存器
7 G$ c: m' w/ O5 pRAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。
# R: p4 I5 u* A: t8 Q, a1 c& L2 z+ G$ c  R2 g
$ |6 g3 X6 {4 ~; Q5 ~
使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。, `3 F& I% H9 W
& M5 E* q+ k0 H5 ^
; v1 i$ Q' e; z/ y0 N; I6 g; Z, q
FAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:
& Z1 T+ |. j" y6 h) z6 W( H2 y/ _& s% t

5 x6 Z) ^/ ~6 V0 [( Q实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。9 h; p6 y% g4 h" R4 T  D7 A

% y! X2 U, f1 J: z  {

; M* ^+ z- o% \8 u. wFDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。
' `+ B0 n) `* e* C
+ o( U2 `0 j# i: U# c, H/ o' W* }

& J4 S4 W* x5 Q我们可以看下面两个例子:  F, c, i: ^* U$ t

% q) l, h9 U" X3 M$ I* S" ~
3 K. E, o8 N  [' M- |0 a- |
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。5 K) [  ^5 M9 Y9 M5 n
3.png
1 N* _) F' a3 a$ h0 T2 F2 B  E2 R: P. p

) h  x" Z% w% I) |* C8 z% o这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。9 D3 @. w4 C9 N# s6 b+ `
& c* B  p1 h$ I+ V" w. _

/ M8 M4 F% N9 E例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。
4 w5 p9 S: r9 {( Q% x0 \) X 4.png # ]  p. |( C/ G" c  _0 B9 I5 c" n
9 E# o3 y2 y! {2 O4 u
  I( y9 j" `3 F: p/ C, e) {/ w
因为SRAM1是32位总线接口,所以这时N的值是4。0 R( J) O0 m8 q& T4 Z0 M
& }% }2 z" b. T% O
- E9 u  ?5 D3 i7 E
$ s3 I8 X* x5 p
; W  u$ i3 T1 s: v- K( C/ B
在应用中如何正确使用RAM ECC
7 e! p7 P# x, f2 B! q# n在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。
1 v3 c. Y; M( A" @' D( b
4 O3 z, W0 u/ i

0 l1 u, `* \; u8 q7 D' `2 A对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。2 B) n" B* w7 y6 G% X7 i

" F, ?/ l7 |2 i- _
( {; l* }$ Y6 w3 b4 O- O
通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。
, g9 z* W3 r& m1 Y
( j9 M9 h; i" ^. \! Z
赞 收藏 1 评论1 发布时间:2021-8-6 10:47

举报

1个回答
土拨鼠先生 回答时间:2024-12-24 09:47:27

您好,但是参考了各方资料,STM32H7系列的RAM区ECC功能无法关闭,这就导致无法查看RAM区原始数据,特别是对单bit错误的纠正功能没有手段去验证,这块能赐教下吗

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版