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

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

[复制链接]
STMCU小助手 发布时间:2021-8-6 10:47
概览1 {1 {" ]1 @" Q% `3 P7 U
现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,RAM等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ECC电路来进行检测。/ j' _$ ~6 E3 l4 n# n
2 \2 U4 S9 K& J
6 h6 Z2 D2 ^  S
STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介绍SRAM ECC这部分功能以及应用中的注意事项。( x- y' t8 X; S

4 M& Q2 L, R! @& a9 P0 h4 N3 U

4 Z/ U4 U' W+ h" M( ?( X4 t7 I# C7 A% k7 p

8 W% E. x7 Z/ U2 |/ _- h0 z' `$ C) y0 tRAMECC外设: ^" X3 G+ T6 ?  v2 ?
在STM32H7系列MCU中,有一个叫RAMECC的外设,它是一个RAM ECC Monitor。RAMECC提供了一个接口给应用程序来检测当前RAM的ECC状态,以及当发生ECC错误后执行相应的恢复或者报错程序。
- U# `- S- _1 }1 A) u1 A7 M' h2 ~  R3 H

# ?5 i2 a* o- a7 S0 }) USTM32H7的RAM ECC支持纠正单比特的错误和检测双比特的错误。对于AXI SRAM和TCM RAM,每64位数据附加8位ECC码;其他的32位总线的SRAM,每32位数据附加7位ECC码。
, o& Q5 I) H- H: l$ w3 V  p0 s/ Z+ {9 U" u. B2 j* P

- z, Q1 E" `( R. U在对SRAM进行写操作的时候,硬件自动计算并保存ECC的值,在对SRAM进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。2 X6 x9 a! W0 N* n

4 ?% D3 X/ w+ W4 o/ ~( Z0 n5 B8 L
$ t- F5 u4 V3 {: d
STM32H7的RAM ECC功能的实现可以分成两个部分:RAM ECC Controller和RAM ECC Monitor单元,如下图所示。; t1 w+ |, A3 u  u# d5 H4 W. W
1.png
# V: `6 D0 x0 G1 L  U3 T; n1 i* H" o& l7 e  H* ?" @
- _3 s8 L! l' g4 H/ W( s9 Z
关于ECC Controller8 b; t8 k1 L/ P
STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,数据TCM RAM,指令TCM RAM和备份SRAM等几块。每个RAM块分别对应一个ECC Controller。) |9 N4 U8 c: P* X; A* I3 b

' ^" A3 a; F$ F8 f6 n- C, {0 f1 E" Y
) k4 A1 z( @% O, y# A
ECC Controller始终处于使能状态。它负责ECC代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。5 F7 A  I# \+ P* y* H
" L( Z  i$ |1 o* Y
4 [5 R7 C6 Q& F8 }* c$ m6 ]
$ u0 s! Z. C3 ]& p8 \

7 f; r4 N- X  z7 {- {, n1 u  ^关于ECC Monitor* N: R# v) F# ]) e- T* |
STM32H7一共有三个ECC Monitor,各负责一个域。ECC Monitor接收来自ECC Controller的诊断事件,并根据寄存器的配置产生对应的中断信号。
$ Z: ^! f# {' X% I- k# k/ z5 Y8 [9 g$ a1 [- t5 b& \% C, j6 h

5 m; Q9 [9 g: b$ n3 @ECC Controller与ECC Monitor之间的映射关系见下图。例如D1的RAMECC Monitor单元,一共有5个通道,每个通道对应一个SRAM块的ECC controller。每个通道都有自己的一组寄存器,图中的Address offset就是寄存器组的偏移地址。如果要打开AXI SRAM的ECC Monitor单元,使得当检测到AXI SRAM的ECC错误时产生对应的中断,就需要操作AXI SRAM对应的寄存器组。
/ u& d8 J3 \$ W  N 2.png
2 o4 [0 w8 h7 a+ N- f% ]
9 r& V& r. u8 C( [4 J. ]( G8 @. m4 r
, K+ {' O4 ?4 b, W# S& I. o' u
FAR和FDR寄存器* N- I3 ^) D( G" u7 G7 ?
RAMECC支持单比特ECC错误中断,双比特ECC错误中断和非对齐写操作(Byte Write)引起的ECC中断。在RAMECC的IER和CR寄存器中可以分别配置和使能这些中断。在SR寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器FAR和出错数据寄存器FDR。
: N' j& s# D% R3 z5 p/ \, P- _# l: b& X8 k0 A$ g8 ?

: h& F3 v4 W1 e" J! E使能了CR寄存器里的ECCELEN位后,当ECC错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到FAR和FDR寄存器里。
/ G/ z' T$ f- K( f5 H7 Z
' R  j6 u" F, f# }5 K5 |

) x/ r) y3 P7 L  q9 XFAR寄存器里保存的是相对地址。实际出错地址的计算公式如下:
4 t. u, N. {! |9 E
* l9 C# T1 Q& C( ]$ y$ S1 r) t
; V3 l' P8 K/ t5 U" A
实际的出错地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
9 H7 T5 A/ Q/ f! i' @8 n' R1 d! e1 p: x; g" n  S' `, d! y: V; R

" `6 Z. B8 S4 mFDR寄存器有两个,对于64位总线的SRAM数据,FDRL寄存器保存低4字节的数据,FDRH保存高4字节的数据。对于32位总线的SRAM数据,数据保存在FDRL寄存器中,FDRH的值为0。
* Y: |; K/ u" Z2 j! M9 V1 u
. t8 j- a' q. @

' ^* h  Y. l) ~) m( P  [( M* p我们可以看下面两个例子:
  S) ]; ~9 I3 d; B( c' s; S+ C4 T# G: D4 O+ z! |% A

3 S4 O# @- W; t. ?2 {1 s  j1 o例子1:使能AXI-SRAM对应的Monitor功能(如何使能请参考STM32H7CUBE库中的RAMECC_ErrorCount例程)。上电后AXI-SRAM先不初始化,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,见下图。9 r" G' y- ?) Y6 S/ P
3.png : g8 ]' w; R1 ]7 P4 y+ _, g
  L) E8 H5 }# g0 L% g/ m
% u( N: |3 c! a, s/ G
这里因为AXI-SRAM是64位总线接口,所以计算实际出错地址时,N的值是8。
% T8 O* H9 b; ]. @
& y# X% l  ]* p# C1 y2 i( ]
/ r5 ?4 M, }4 J
例子2:使能SRAM1(0X30000000)对应的Monitor功能。上电后不进行初始,然后直接进行读操作就会触发ECC错误。这时候我们在调试状态下查看FAR和FDR的值,如下图。* K  P5 H! |, _. ?1 q4 P( ]0 b+ Z
4.png
. s$ [3 d* f) h4 k; |8 o* W6 J' [; H+ [6 p9 ]
- Y$ A3 S" D8 C2 c8 K; n9 k8 h8 e. [
因为SRAM1是32位总线接口,所以这时N的值是4。9 d5 c% R" P) l* L. d: A# A
2 g; ~! V3 w7 l) {, M& |! O. U3 `
2 i% x9 G1 Y8 i9 T

* J3 n8 F8 u- b7 k5 s2 h( n  E. Q
( C5 [7 f4 s# \( ^$ s
在应用中如何正确使用RAM ECC8 d' J4 z+ G- W9 R+ c& ~+ ~7 l4 Z
在使用支持ECC的RAM时,一定要注意的是要对RAM进行初始化,否则就可能会报ECC错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ECC错误。在AN5342中给出了建议的初始化步骤。
9 w- n( W4 f1 Z  S8 A
! z7 b% U3 O! @: t6 U
% A. |" |6 A3 s! Q* [
对于单比特的ECC错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到SRAM中去。这里有两种方式,一种如果原本SRAM中保存的值在Flash有备份,那么直接将Flash中的值再次写到SRAM中去;或者利用前面提到的FAR和FDR寄存器将正确的值写回SRAM中。
6 r( k* n: U& ]& p; A6 I' Y) K( t& v
0 K+ {1 j/ N% w$ x% Q

  I, n8 T. N7 X$ A- c, u2 [7 A通过周期性的ECC检测来主动发现SRAM的故障也是提高系统可靠性的方法。ECC检测可以通过读SRAM的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对SRAM进行检测。请参考AN5342了解更多的细节。; {. Z% a% e9 z9 P) j- A6 [1 J! ^

$ ]$ O+ Q7 D) w; E
收藏 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 手机版