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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览
' k' o# e1 F- ^9 g1 b# a现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。: l) A% P" u3 q% @1 {% b

3 [6 @' ?8 o$ I1 P& J* |% g
3 K' u9 ^9 `: p2 m+ n
STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。
! r! K& Q# P$ |: o  j4 s
# c, T1 X; _6 k7 d
3 D% A1 ~8 |+ L3 g) V* `
$ }, R2 h' f) k1 j2 y& E0 \0 F

* _! T$ O/ B7 i% f" [( w# G/ dRAMECC外设; I8 o: r  @1 B8 O; c; ?: [
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。2 v- y: N; B+ s' t5 \
3 n7 U4 g% X) q7 e' J6 Q1 C
( L) |! f/ p' |( C+ d
STM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
; I( I2 p1 U. _; t% E
2 Z" ?1 `8 {: f: L) V
6 ?8 w0 X' [6 X" I" P. H
在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。
  b( ^, z/ K6 l( \; p* @" U) h. S8 _/ a3 k' i: f7 S: p4 g' o

" q7 @6 L$ A% e5 k1 \* W# rSTM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。
# D# q3 R0 k  R8 o: Y5 z. P 1.png
- r1 V; _' C+ o  u& M3 @) q" j
. \* i# h0 ^& _) u
/ ~) f% u- i- ~2 [3 g/ v
关于ECC Controller
4 c9 F' g6 d( I2 Q1 x  sSTM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。
# z/ P- b+ V" z5 l* d, s
0 g3 [0 E2 e% ^% j1 O: m. M! X5 D: b
# e" @' T. i& g$ N* v2 n) \
ECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。; F9 a7 Z2 |4 A$ s
5 b6 I% \7 m9 P8 D7 P; S( N  @. o

! b' z7 H, x6 Y$ y2 x* [" _
9 E& r" |" T- {9 ^+ D
" G1 q/ u. _/ V* I0 Q
关于ECC Monitor8 [6 }: H! \5 H$ J& w* q: F) i
STM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。
/ n% V( V# W/ G0 t8 M* a" p3 k0 L( S/ h, n; ^

2 g  F  d/ [" N9 i. DECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。
& B3 r( Y/ o' ?! z, f" C 2.png
0 H& ]' _9 N6 A4 i
& @+ C# ]& ^. s* _, d

/ A/ N( k* O) @/ ~5 @+ b- A" tFAR和FDR寄存器
" y7 d3 a, M# a0 @RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。: G+ C8 J5 t! A8 {. o5 T

/ K# I/ v0 ~" |: d! {
' Z- D: p$ Q( ]0 m3 w0 c0 R7 x
使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。: [8 q4 a8 [. B1 F8 W

8 g( a0 w8 H4 i, k" D

! b( f5 B0 S8 M) |, u# sFAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:
) l' ]3 h  {2 q* \
# @* M9 ]: w6 w  |6 |2 o/ N+ b

: C5 v6 ~+ y( ]. A3 n) k, q实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
& ]2 T) k7 Z; b
& y1 `- @, q1 G8 g7 P% S! ~9 e
1 b0 G6 }9 D; q
FDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。7 F/ d- X5 ?2 J" r

& Z3 P! l/ {2 V' k4 e
5 O. Z7 ~  y* B& n, ~
我们可以看下面两个例子:
+ _# E; E7 w: P- y, p. X
% @8 ?+ Q- A! b, \  g* v
- `% q3 t% V7 T  I
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。
  ]" t! U0 k* w9 Y4 ^- W' O& U; M9 J 3.png 0 J" b+ a& l! |) m9 b6 ]3 g

: j* Z* w' E- ?
6 f( @2 q$ T: O. N6 ?, p, ^1 C7 @
这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。) J" v" T8 H" H- N; L
# v" Z% J' u2 `6 R! k0 @1 g' M
- t. T7 G2 r, M9 F: l4 N" _
例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。
2 k% h4 ?5 x! M9 z1 T 4.png
+ a1 ?; e$ ?) U( H: Q- _# @; \: D  n8 _8 K  B

) B5 I8 I1 j* ?+ b因为SRAM1是32位总线接口,所以这时N的值是4。
0 Y3 x% ~0 n0 z( C' I( |1 H0 ]5 N! v8 |7 r4 S1 o1 m& M7 b# E8 p! m
& N1 m( d/ R/ B2 o1 ]

8 g+ D& }) B0 ?

! K1 e2 }) r. K1 T在应用中如何正确使用RAM ECC  P- W9 {2 l* {3 _8 S! {6 I* l
在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。
# C" B! a$ H8 E6 c# ~/ A2 M7 J' @$ Y5 r1 J
$ a5 V/ g0 S" `4 J0 v
对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。
- e8 K. j) Z2 |4 \$ Y6 d7 ]; ?# }
; P) ]' }6 C1 N' z: ?3 x4 Q3 A
  I/ o5 K1 O  Y1 U  i3 K; w
通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。
3 y% j8 O5 I$ v' Z' q6 e& C7 m4 s0 u' t) E% e+ p. S) ?" x
收藏 1 评论1 发布时间:2021-8-6 10:47

举报

1个回答
土拨鼠先生 回答时间:2024-12-24 09:47:27

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

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版