请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览
& m  _" ?" h9 t. S( G" w现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。8 A7 I3 |7 \8 N/ O* y' B' l
( v$ d2 D! _3 f0 }
) b. M( q' s; l' p3 E
STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。
6 F' |% {; U1 l7 e' j: ?; l  i, F  K1 o9 x% A" I6 G, d

# a: P2 ~3 ^$ z. n; S
. E! G6 q# \/ S7 ?$ [

. y+ Y+ N+ n/ N2 B( J. F6 t4 d! R: pRAMECC外设" z! `( j. r/ N2 E, B
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。
& ^) N$ g. v, d) \7 U# V2 o
0 F# s" h; C6 }# |0 A! M

$ d0 e: _& e) C7 r6 u$ zSTM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
6 I: R( H5 v- t( `& v6 I
; M6 j& L  i7 D- z* W

, n# k+ _- K0 a$ b在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。
! W( E' T) W* C5 C* {$ Q, I7 ]7 H. [& u1 |
& J9 W) W2 U- ]6 C7 p4 N1 j
STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。. j" y% w0 E) r2 v
1.png : H* ~1 w& F% k1 y

+ [' e* ?, w& z, u* d2 k

, L* b5 s( g* h4 g0 D; ^关于ECC Controller7 p9 s# C/ b, F3 U; o, f
STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。" f% f3 g1 ?) N
8 Q, _, J. ~/ V8 [+ f. A. U

3 A' a0 ~6 U- l- M- m4 S0 n+ dECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。
& v3 M: {+ Y/ n# o& ]; \" l7 ]$ G3 N- m
* f' a8 \3 ^9 R+ V

, f% m6 M8 D+ ?! G2 t
- [4 _- ]% f; P, y
关于ECC Monitor
5 u; A# X1 R9 vSTM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。
, Z0 X2 B* D! l/ k: O  ]* v! F
3 Q  R; m& L: u, p
9 N' p% @' O2 d/ t% i
ECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。
$ r7 b' D" b" n  d( J$ b; ] 2.png
9 |) {6 p2 O! ?( @) Q
0 b  A2 y0 o8 {- h
0 ?: J3 q3 ?0 v( ~% L/ M1 G
FAR和FDR寄存器: W4 Y  b& E6 x+ R9 z. S( \
RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。
! X- w) v; H/ o/ x7 J
! C2 \8 o6 h& ?2 Z/ r( y) R

: {6 U0 q' w8 d1 |5 ]" G使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。5 P- o* s2 c% r( I/ T. e, h* w
1 _2 B3 \' O" C) U! }$ K' J, P

3 r7 B- _- q" z. C* H! V7 C* pFAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:+ l5 b* `1 h! M) ]8 o' [

2 G& G5 N! [" Q' ^
3 E) L; V8 Z1 R: I' k
实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
- T7 E* S6 ^8 [  U' z- \9 i2 |* P* f3 R1 m

7 ~) B4 z; j+ I' }; S& TFDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。
. y& G! ?/ ]: [' D: m" ?4 E+ T! R0 U6 N( r
$ X$ U/ C0 ?3 q+ A9 f* b
我们可以看下面两个例子:& e! ~- X7 y6 P* v3 ^) ~& q

/ h) {7 Y# m6 J0 ^1 d
7 s4 q  {9 W% W( \# R' O7 {
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。* V; y) T- j4 }3 b
3.png
/ g+ [' I: L+ Z6 y- \
1 P5 P9 |8 d0 ?0 n( g

9 G; z; V8 s' ~5 V* O; k这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。
- [- f  m1 y/ y- `9 q0 ?
8 z" l3 H; D2 G" q" F' V4 P5 S

# {3 K" |1 F5 L) o4 K; M! f例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。( ~; f) P, F5 x* y' B$ H2 h4 p
4.png
/ o2 A+ l& G) ^; \  R& ]
9 S0 `! Y- q. m5 N$ c7 a8 S& [

4 s4 L1 q) l6 {+ {% x因为SRAM1是32位总线接口,所以这时N的值是4。* {5 Q4 ^. N' q+ i
' _, n. `3 J& W

- _7 U* l) t3 Q3 x5 r
$ K$ ~; z: P& g; j! L

5 N3 H# X' Z8 Y$ v% u2 U) p' S在应用中如何正确使用RAM ECC
: H2 j+ Y( {/ [# R8 b在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。1 o$ T+ A% \8 S. k- \1 Q
6 @/ v8 a" r3 |0 r1 O1 K

/ b9 T- x; s% A$ d7 F对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。- \3 b4 V+ f* _( c6 G( U
( T1 H5 d' T! E. ?6 P' k" ^# x

6 [# `1 H! x2 }/ P: d& f; a- v通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。
  l% O$ P+ u5 U/ G, J7 d* u+ ~0 B' n, ]
收藏 1 评论0 发布时间:2021-8-6 10:47

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版