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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览5 S2 L; e- y" [; j# g1 l. Z
现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。8 J1 T% N$ q4 m
' j* q$ o# l8 U# O) ?3 b, }

  ?7 x( U  N- _- q: F' L' ^STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。! B- c/ r6 N, ]- r8 K" P" v

& P# `8 r* ^  K+ b# N
& d$ c. x- L7 w0 A* @4 e

& @% o2 F& W& e
4 w( S% S8 D+ s
RAMECC外设
: i4 U2 }) `0 J* w; r$ U在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。4 r# g6 p2 L2 }4 P; x8 g7 A
0 v& y/ m2 u- S0 t+ Z$ \* \# j3 T

& z; K7 ]  t7 \% ?5 j# n* S. GSTM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。; @+ y" Z& T3 k! H! D
0 ?) K( V, o! L8 I

# n2 t+ J3 u% ~* X( w在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。0 {+ Q! W  P. f4 @& Q
3 [4 p4 L& B4 R( N( z  ], \
) n, g! L# r9 {/ Z
STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。
" u/ I+ {4 D7 u: u/ c. [$ _ 1.png 6 L( T6 G. C/ W  F
7 q* y0 j/ O/ i- J( E4 t
2 }, w" [' Q; b0 b9 ~
关于ECC Controller
& r) ~  L! V0 R$ |: _5 }* A4 JSTM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。
$ z4 a0 H& o, X) C8 V  {" b: g' Y/ z  k% J) U+ t2 W

. h8 E% u0 x" n; `* V7 ~& x' n5 u, gECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。
7 u" W9 z1 U5 {0 Z1 L
/ ~' L$ S( O5 j/ ~8 E0 ^, k

! _6 [9 o7 Y; Y$ _# c' T( X: E6 _( q* t  W) ^% g1 D2 d& H
& L/ s  f9 G+ K# T! }/ M$ d3 x
关于ECC Monitor
' x# Y; _5 Y! Q8 s* fSTM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。
& d0 [$ W) X/ f- O5 |
' w. S  W0 w, G7 w4 `

3 K# P0 E& v4 v. j! E+ TECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。3 r4 B1 D& w) R# D6 P
2.png , i* L% g9 V: P, e. y* x
+ G! _0 Z+ C6 D5 @
  V3 i, n# ^9 {1 j
FAR和FDR寄存器
4 B/ ?5 g( k6 ?. J0 h& }9 I0 @RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。  z- \; J2 B) A2 c

% G+ [! Z0 g) G: l

. Y! d" y: y" l6 d; R& T& f' T- ]使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。2 s  J1 t* _# Z1 b' b# K2 x% ?. ^

. I9 p+ X" f# V4 p

' w9 j/ f5 P& U5 [7 |FAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:, |7 B& u' c: O/ C: a! J

4 S. V+ v( M' r! z

, s) @8 S6 L. @6 @  I& \& b" U, Z实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
8 H5 R: B! d1 }/ H
; W. a$ G, Y' Y7 c9 W9 M5 Q* N3 H. V

! a7 m2 h" @! M) V* S' j1 ?FDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。7 E$ D9 a" ?) k7 k5 R7 y, P

# Y8 l- _1 G6 L- M  [  B+ V

* J  q, H; K3 P9 y/ e我们可以看下面两个例子:
4 F' G# h/ v) V' p, m
& u: @% \& y- ^5 `( f  }6 ^6 C
" Z2 \: C: h2 i1 `1 r0 m3 y/ C. i
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。. m/ m+ F9 A, i) f6 j
3.png / ]0 i& @9 D  ~
  `/ e3 {% ?1 e" P

" |# x. b# ~( t0 Q$ g7 t这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。
) d: v) u4 D8 O; V6 |  ]
" d( P- j; Z- _) H# {
4 }; L4 N4 n2 V, n8 h
例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。& T$ {  s- F: S2 I) H! G
4.png
, w+ g5 X  E1 p9 f
% j7 x( e6 k2 P: J, {( m4 L
: Z+ r5 Y+ [7 c) t. s2 Q' s
因为SRAM1是32位总线接口,所以这时N的值是4。
5 l0 q" {  T0 y; ~* f: E) i9 f2 b+ [5 \' \" s
  V0 W- O) B' w  ?' o4 c$ E

- Z; U5 j& o3 y7 }4 t; f2 e  i4 _

$ [$ n' ^- U6 J在应用中如何正确使用RAM ECC! T' n6 w* v7 N3 z7 m/ C; g9 |
在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。8 g3 y* P. `' r# T8 C+ Z3 n" X) ~. D

9 X5 O/ f, {8 w  P8 N2 l! }- i
. \0 w5 E; m% i. M
对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。9 J) K# ~, L- N8 x  N
6 U( l3 {) `# ~

# M! I! h& x/ v通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。) V4 o. b5 h4 K  G3 Z. j& b
4 l3 m$ R6 i6 o8 v. [: k
赞 收藏 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 手机版