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

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

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

1 @/ l% _2 v. j+ Q0 g

2 Y9 q3 ?6 _9 @5 c! LSTM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。
! O+ n6 t  l, r3 i$ I2 l) Q- A  D' W9 S: v6 X9 x

, }' h" s) M6 S6 j$ a) F+ y. Z: n) i' Z

1 b4 \+ Q/ l& a6 ^! N7 PRAMECC外设
0 T8 ?2 c% v0 I, _在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。. ~; c) L- Y1 j

  a- g$ n1 K' a! b) W, I2 \

8 T# L4 j. a% cSTM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
1 @- u  I/ a! T
- b% u; h# c$ J" L4 l2 x: O
: B) Z' ?3 k, _* v1 L# S6 n
在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。7 }9 R  @- J# Z6 [$ i  X* b

3 m3 l& m) k5 {9 B' }' q1 H& J5 e

8 O6 k6 i. ?1 u  hSTM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。  t* g5 s$ [& t
1.png
% i7 D- t( ?" F! V" N; B& z; I3 M& w

# b. t& N" {2 F. ]8 |7 s# Q关于ECC Controller+ w2 k3 F' y7 B% E; R
STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。/ p* H, H; G  x& g/ U- P
( ~$ o% k8 R5 s( a% R1 G( t
( \- B1 y5 P$ Q# W9 i) ^
ECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。% D7 k  d, h' G4 s# C4 _2 w7 W
) W4 j6 Z3 |0 b" U. |: \/ ~: t

+ s1 m2 E" P4 ?! y( j2 ~  S7 z% h3 e. v/ `

( H( ]: {( f, n/ U& G关于ECC Monitor
7 r3 c/ P; F7 q$ ^. mSTM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。
! T  ~8 E2 F  P* U4 E4 q
# t% O+ j9 j, E5 |5 ^! L7 ?

8 Z2 \# f! k  v2 z- @ECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。- \7 J8 `4 t# C5 ]2 i
2.png
, X0 V+ S, G5 Z7 o0 Z
8 H3 n5 N  X! A9 {9 K; V

: s7 Z  F3 [# e* `- b3 W: oFAR和FDR寄存器7 ^. U: v& h- w  ]
RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。) X% k) w$ l& ^& n  E
0 N$ Q1 w8 n6 ~2 a

  G2 v5 @+ h& r2 G( d使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。
4 {, G3 [2 E2 H
3 w* ^* {0 e! l6 H
  ^0 A/ g9 J( v+ |5 t- X( h
FAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:
% b' R- i' R; O: g/ H" t
9 ?7 L% _1 y' b/ S

6 i  Y7 \$ f. s* o+ B. h实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。7 `; h+ l8 H; e  O+ S8 g0 Y- Y

, A: `4 b0 m1 o' ?( ]& T# U3 g

2 K1 r5 t- J" SFDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。  s% D: I5 d$ s; u& E& O2 ?. h3 _: a
" N5 F3 |! h+ G6 E

2 |) b% \' U+ H我们可以看下面两个例子:- |  g2 d! Y2 D/ t

/ b# X' q8 I" P. U4 ~) I* j) }+ s

* Y( x# O: e9 z* m4 p例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。4 R5 P4 O5 w+ G$ \7 O" S
3.png
4 k( {2 Q$ s8 z* `9 r! h7 a6 Y* `& y" `/ V% p" D+ p6 B

) D2 }5 t5 v+ B1 c- y: D6 S这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。3 ~6 Q; Q3 ~/ o9 o8 Y! |6 c% q
& o5 k* u' A$ W9 W- y9 g# ?6 Z" G
' b6 b; y# Z+ b7 l& e' l  n
例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。3 Q6 W: z* F0 T' P# J
4.png 3 `! A3 ~! u, p
# M- t9 a8 r6 \* `

) f) t$ n+ @0 v1 N因为SRAM1是32位总线接口,所以这时N的值是4。3 G* ]4 q$ ?6 j; J- b) v8 u

6 b- D& B9 i' ^! P, p
- j/ R3 B; D3 h
# D3 A! Q: _* _" A1 d# z9 k

% I5 p' ^8 c; {% V2 _; H' p在应用中如何正确使用RAM ECC/ |) N2 }! c4 L" T. [
在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。5 Y& r9 E( i* H' Z8 b
' L6 J0 O6 z; A( y# m( T
* j" ~( Z: A9 c1 }4 ^2 y9 {
对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。. n& G- p/ d9 M
; a. P- M8 g- g) ]: {9 G$ f
) K- p  C6 p* E- L7 T6 e4 D
通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。) M, O4 K; k4 l3 m, W- A& G
  i$ ~0 w. z- k5 R! p# x
收藏 1 评论0 发布时间:2021-8-6 10:47

举报

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