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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览
- z, r0 O4 [. ?  b现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。2 c# W& {: I0 R/ B9 K
9 w. U; w* k# q, t$ ?
+ ?# E  S& g2 {
STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。& E. S( @) [7 h  b

% b9 f! n) Q5 f( J# V
. o4 R' P$ i7 {4 k0 K$ I# `4 U; U
& t; y1 L/ e* D( j( L: N

' J( _! L. k. v( J& Z+ aRAMECC外设. i4 }$ V0 u, ?
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。
6 q( Q( w& D5 X
( s% H: F' i+ a! o! P
' D' T3 ^4 v7 m* M. j; Q
STM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。6 i+ Q" K2 ], N. e# S

, {7 |! N5 ^' \5 y  J( A; D% S
1 z' l- R3 f3 o; ~, D
在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。
/ n+ G( o6 b6 m* G
* s) a) T# q% Q1 |+ Z

$ o/ _3 a( J5 U# H- ?STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。
' t3 b- y; G7 j3 i$ [5 c& h 1.png : J  a4 ^2 s6 W& [. d+ E

0 q1 N! X( b$ [# i* o! G' f* J

: s0 x2 {, [9 I! E! I关于ECC Controller
/ m, `1 s* O, Z  {" y4 B, Q& bSTM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。
9 t7 e& \6 T( i8 j* E8 @) Q% Q1 j8 J& r

0 {7 W% i( t3 u0 N( S% eECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。  Y& N, X3 h! `0 j2 p+ \0 j
! i- f  R2 ]+ D6 O
8 E/ K8 |, \: n' j

$ u. |7 _8 Y: J# V! E
# d, t5 z; `5 |4 q& O8 X
关于ECC Monitor
( x$ H  @! p# t' `: F' |! jSTM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。5 j, v  i2 a, w& Z

* s, i8 ]% O- O! Z, B* w$ k. i

% \' ^( u7 w! r/ {+ l! |1 [ECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。
' i' b" I" M$ ~( U& l" p 2.png
% a( k7 G% f' E2 K4 [, V
, R: ]6 g: f5 j6 y0 s. H$ G/ l# L
" H# b. g: w" L! P- n
FAR和FDR寄存器
  L! S$ |+ K# m; B' {0 MRAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。9 j; d9 Q0 Q/ q1 Q8 u7 r- \
5 }" |; O# J5 t

! E: f; b. H& ]5 H  a使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。
5 X8 _" `* K" }# d/ d+ Q. [5 Q+ d# {6 K7 o3 T+ c% x

6 [! x5 u3 O9 k  fFAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:; A! _7 E: ~. f/ z. x9 f, S

( N; |8 \3 `1 h
" C0 h2 l8 T" w  Q3 a
实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
$ p  z! ?1 U& A2 G3 M
1 f; a) w9 S% Q+ \# A4 j# b1 r

$ f% A1 f4 n+ Z+ b$ Q1 fFDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。
4 ]$ l( n, t8 o1 n; f# k) }& `
+ z& e$ S$ H$ Z0 A! Z

8 S* |# ]% F  b  [' o; b+ d我们可以看下面两个例子:
' L6 j- p  q5 \0 ~4 X9 B! C8 @, r2 g0 ~( Y& W
$ {- [( A- S! A7 U  H) @2 P+ f* H
例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。
& W. u/ N$ R, d 3.png % R7 P9 E) U" u0 w2 n6 B) f! e
7 K# E& }. S. h' y! y

5 w5 f) v) b) O& @8 z这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。
, M3 m* }6 Y5 y
& b- P2 d' \4 C$ T) d( E
" j, |% n) {3 F: p3 L
例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。8 F$ @  v7 c7 I( O& H
4.png
* T6 p: Q' L/ j  h2 y, u: N
- Z( o7 S8 B6 c
! G( A# h3 l) B0 Q( h
因为SRAM1是32位总线接口,所以这时N的值是4。. B+ E+ j  e3 P2 {8 O+ N+ G- v0 n% f
( ^9 X5 X8 m* y- h
+ m) \: V  y$ l
$ d9 s# W6 N% ^, @# ~. h& a
; k- l2 c  d' Z- z) E
在应用中如何正确使用RAM ECC; {8 _; ]5 ^9 m, Q
在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。
8 V4 V* |# Y9 a# b; p5 M7 M8 l
/ t3 |7 n5 P( v1 B
9 @( T+ t, `5 i) x
对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。# O6 l+ Y+ T7 P' f6 h7 \- G4 f! ]

3 T6 \6 ?) `2 ~4 o# {/ A, L
3 H8 k) i8 V. [) o# C
通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。
3 m9 T8 W( z7 g: ?7 u, ]
4 p2 }2 `! t9 j. H7 \  [& f
收藏 1 评论1 发布时间:2021-8-6 10:47

举报

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

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

所属标签

相似分享

官网相关资源

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