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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览
6 D' z( v/ ?0 C8 C  _现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。0 |# `' Q. Q+ w# [7 k
& A# w$ q+ ~0 ?$ I  t  q3 e) o( Q: p

) E% c) h& Y+ p6 ?3 sSTM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。
( R' e5 R. G* E! B
) X4 i, [/ M0 M' c9 F5 }

- X! `" q5 H% Q& G. D: T
* Y4 @  E0 n5 J
+ ?& j8 W5 E% j. x
RAMECC外设  h. E$ m1 F( Z# g! e
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。2 A  @9 @3 m0 M/ f5 b

$ n) X9 @4 z4 o$ P; i5 y4 I
+ s) s# o1 U/ I& K: R& ^
STM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
+ h: b- ?# R+ T1 {2 [
! \& s# x' E* a( ^
4 q3 Q' j# e1 o
在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。' e9 V) C6 a; m. A" n

( G" c0 P1 `/ e6 S; d
4 v9 o  k- H( H
STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。- U8 p5 Q& {& j3 _4 h
1.png
3 J) G% C6 A, n+ n/ x
  u4 ^& V% x8 X$ `; d; \
$ f$ {3 r# W, E6 n" V7 |3 I
关于ECC Controller, @' i5 \8 X" N
STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。, o. C& M! N+ s' t  _& {

# ]! u8 B& t# a

, _2 S6 `3 m& s, g) J+ z' OECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。* Y2 l" R5 M+ K- m- H
7 V( |. }4 Y0 m4 A9 h% ^

' u# y% {# V7 g
1 M. J) J' q/ F! l
* ]& `" f5 C8 p( K2 c6 n8 [8 y% a
关于ECC Monitor0 D% p( }' ^7 s
STM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。4 k7 d' P+ x& T  x2 z6 m! x/ l0 _

! n1 }6 {- v- ?1 ^4 ^+ [5 R

) v6 z+ U, [/ e7 \5 W4 RECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。' E1 P8 W% M4 l  R. a% Z
2.png
* U5 }$ ^5 c- H* T% `/ M+ f7 Q& q: n
* l) ~: S2 X9 y& H6 n# L
# x2 S8 p; G- q: s
FAR和FDR寄存器! N0 K* _+ M( B3 T, f- o+ @5 Z8 G
RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。
( a0 q/ }7 S3 k5 d" Z' V1 B$ N4 _! d6 G' _- b- g8 j4 R3 u" H0 }6 L
! r+ C, q' F/ p, b, p) u- ]
使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。
/ b$ M& O  {2 ~7 ~0 {* k
3 j- @- _& j# {" c& r; K

) P8 }, j8 r' l0 ?7 S  _FAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:
5 Y. k/ Y8 F1 ?. w  @  N( \
! y8 w3 i5 ^8 N. d

6 X& L9 c% W# `( g2 a6 Z# b7 L4 y! B实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。, r% Q7 R( u; s/ g; I

: o2 @. ?$ l* J7 p" r, j% l

, I) ^, B6 l8 xFDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。7 s7 a& c' U# m% K5 a/ _& e
* Z: o0 P1 Y  t- B

# [+ k( v4 x, E我们可以看下面两个例子:# ]& ?9 u$ V" @! d! N0 z5 F
6 U) E' O9 D- y# C) o  ?- u
2 \, y" p+ Q* h1 {& s. }8 O
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。! z" Z/ W1 m! M5 L1 D8 s6 W$ ?
3.png
/ C% Z/ A8 T3 y! F/ A2 ~. u
, F5 i0 a. P: m/ `7 v7 c

6 w' X, y  ]% e# j3 ~' I' m这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。# F& t3 u. B! v

4 i7 M4 K9 ?9 H  @/ T' M1 h

6 ]1 X1 k7 F: k8 F$ a例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。% A5 Q2 y+ e' n1 H4 c
4.png ) W5 M( @. y8 p+ U

- C# h+ b' P( {& `* [

, b9 r1 j1 B, l9 R4 I8 @因为SRAM1是32位总线接口,所以这时N的值是4。
7 J" ~$ M3 a5 n6 M
* ~' O: X- D% }# c6 A4 q+ o

; O0 ~% j( `5 r1 ^" |% c
8 c5 E7 B0 l0 u4 w; {: Z7 S
4 z1 E, m! {: l- o6 P0 ^
在应用中如何正确使用RAM ECC
! F3 `, O/ h" ?4 O, u$ M7 r. S在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。# ]7 R2 k7 }- W, |9 d- m

  m9 W! H. U- C4 N

. A* h' I! W0 {+ z, Y6 Q8 z4 L对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。& S  s. A: Y+ P+ t0 x# Q
0 S; t$ Q7 g. W+ q
/ q$ T" o2 Y% l$ T. q
通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。
1 k- l/ M9 A5 w- B& _
3 w" h  m5 v+ ~  k
收藏 1 评论1 发布时间:2021-8-6 10:47

举报

1个回答
土拨鼠先生 回答时间:昨天 09:47

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

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版