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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览
5 y% C9 t8 C+ a. B. p/ O现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。
0 j' R% a6 e8 t0 C' t9 p+ B1 B3 ~5 |) \

  v9 J0 L4 p3 @9 x% BSTM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。
  U% I$ [6 A; f/ X
6 k" N8 _! E, D3 ~1 p. y6 O+ G6 x
9 ?6 @( s7 |8 o* ]
8 D3 j+ S4 j  I! P
8 x4 I& U: l" y
RAMECC外设( n$ O  \- p2 D
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。
4 E6 n0 c& m( V3 I2 M5 ]+ k$ H: M2 }: I! @6 V+ a
1 f  `: G0 ^6 j
STM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
7 _6 C6 N( r" H( m/ L
- I3 R' ~! [7 [9 `9 ]& r  M& ^/ @

4 x/ y8 M: d, S  @在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。
$ K9 g. f9 l; I7 R% y
5 m- w2 o$ y5 r$ g

9 H" |: b/ ?; R, Q6 g) C! ~/ ySTM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。/ b  |1 |0 h% c# s3 A( F& \
1.png
: j3 k; Q1 W5 r; M/ ~
8 a' d4 j7 o  O7 n; D% G

( `3 z( i3 v3 z( I% ]0 E. b关于ECC Controller
* A1 b# q0 `# w  c# SSTM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。
9 U- l: ^# V. @2 n% a* x- w# l! \
  P5 p1 h: e7 {6 w7 e
; ~! a! n( C' ^( k% _% d
ECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。
! U+ ]# ?( S' K" T$ K9 Q
( O2 T2 i% s! o+ [& N) A

) G# A+ `' [  u9 B' U, b3 h) P$ v& s) ?
1 Q" o$ x9 N: _) z
关于ECC Monitor7 G* c; J0 a% e2 f
STM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。) {3 G+ W1 n/ W$ e9 Y
: u) L/ I6 w7 k! M# _& _1 J

7 V7 X) v" d. f0 l' p' i$ r/ FECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。
- r, Z; L3 a3 d& @# W 2.png 4 e. p7 e0 m7 }' q) n6 D

! P' `6 V" b" X) \3 V
3 y( P3 U# G/ F- o5 l  D2 \( V5 U
FAR和FDR寄存器* X! f3 Z6 P" b
RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。
. N) y- c3 U$ o) ~5 \, S- ~
: V* u5 X1 ^( q; \- l. u
: P2 I2 Y! S" a! `1 E
使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。
& h' W% l3 }! i0 d/ |8 R& b% J" j+ ^6 N

: E9 I7 H% j( q5 q& l8 CFAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:
% _9 D) K4 u6 Q0 N  s7 N! @$ U
* U  w: n7 O8 [3 Z) A% J9 {

3 }5 ~. N7 @2 Y实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
' T* K7 P, f% O2 ]/ T; T3 f
2 q( Q( Z$ D. S% r

$ ^- q3 r. |+ a& o3 V  @1 u9 {; _FDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。
  u4 c7 N: L/ r* c$ d
- T. U" d, }  A" h$ a; L+ h
% K; T1 T7 D- J5 l: i# I  \
我们可以看下面两个例子:# k/ ?( p% j1 g
/ M2 F) ]+ W2 k1 j* U+ y
: N. d4 ?% B: d' R* R9 T
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。- v1 K5 j' }, [9 c  ?! T$ v
3.png
1 T- t9 P9 G! n* s; V9 v' u5 N: O6 }7 J2 Y, X3 Y: B8 R

! S6 ^$ T. K5 [* u+ K* v这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。
) H* Y& o( d( b8 [5 K3 _" R  M
0 n/ `# |# q, @  ^) ?  C$ \/ C
( X" G, v  G  K" F" y3 O& U
例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。, O3 c) o* K5 K( {
4.png
: ^: K6 v; h  f" b: f$ ^1 N, i3 J8 |
6 {3 w8 z0 I. G  n/ a3 w4 T/ E9 \

5 a* ?' Y# L) t% W- O) l因为SRAM1是32位总线接口,所以这时N的值是4。8 T, J- j7 ]3 H" _5 a: z3 {; h4 }

2 H! H6 R/ u" i3 B# _6 V# ?" q
  ^, j! P% Y5 X, H3 p5 g1 ~5 \7 A
" i+ i# G; b) D: t

- d. r( \0 ?4 f, N9 U+ ]在应用中如何正确使用RAM ECC
. I" a4 c% n) p" q1 ^" j在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。% `  a+ X0 h2 C) z% U3 Q* ?
5 h; H6 w, Q8 T
4 J  O, J, I1 I3 u
对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。" L$ _' R- a1 X5 V

. v2 M' k: n7 I9 \1 e$ m
3 e& z1 [, w: j, S
通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。
# }, X8 ^. T8 m
' M$ t  t! f# p& P8 m8 j
赞 收藏 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 手机版