SRAM ECC功能以及应用中的注意事项

现代电子系统中,由于“软”错误引起的系统故障比永久性硬件失效引起的系统故障要更多。“软”错误是指可以恢复的故障或者失效。这一类错误容易发生在寄存器,ram等上面,由于受到电磁干扰或者封装材料中的α粒子,宇宙射线等的影响而造成位值翻转。针对这个问题,可以在硬件上加奇偶校验,ecc电路来进行检测。
stm32h7系列mcu的flash,sram和cache都支持ecc的功能。在本文中,主要介绍sram ecc这部分功能以及应用中的注意事项。
ramecc外设
在stm32h7系列mcu中,有一个叫ramecc的外设,它是一个ram ecc monitor。ramecc提供了一个接口给应用程序来检测当前ram的ecc状态,以及当发生ecc错误后执行相应的恢复或者报错程序。
stm32h7的ram ecc支持纠正单比特的错误和检测双比特的错误。对于axi sram和tcm ram,每64位数据附加8位ecc码;其他的32位总线的sram,每32位数据附加7位ecc码。
在对sram进行写操作的时候,硬件自动计算并保存ecc的值,在对sram进行读操作或者非对齐的写操作(读-改-写)的时候会自动进行校验,并且出错的地址和数据可以通过寄存器读出。
stm32h7的ram ecc功能的实现可以分成两个部分:ram ecc controller和ram ecc monitor单元,如下图所示。
关于ecc controller
stm32h7的sram分成axi sram,sram1,sram2,sram3,sram4,数据tcm ram,指令tcm ram和备份sram等几块。每个ram块分别对应一个ecc controller。
ecc controller始终处于使能状态。它负责ecc代码的计算存储,比较和错误检测,可以完成单比特错误纠正和双比特错误检测的功能。
关于ecc monitor
stm32h7一共有三个ecc monitor,各负责一个域。ecc monitor接收来自ecc controller的诊断事件,并根据寄存器的配置产生对应的中断信号。
ecc controller与ecc monitor之间的映射关系见下图。例如d1的ramecc monitor单元,一共有5个通道,每个通道对应一个sram块的ecc controller。每个通道都有自己的一组寄存器,图中的address offset就是寄存器组的偏移地址。如果要打开axi sram的ecc monitor单元,使得当检测到axi sram的ecc错误时产生对应的中断,就需要操作axi sram对应的寄存器组。
far和fdr寄存器
ramecc支持单比特ecc错误中断,双比特ecc错误中断和非对齐写操作(byte write)引起的ecc中断。在ramecc的ier和cr寄存器中可以分别配置和使能这些中断。在sr寄存器中可以查看这些中断的状态。这几个寄存器的操作都一目了然,这里想说明的是另外两个寄存器:出错地址寄存器far和出错数据寄存器fdr。
使能了cr寄存器里的eccelen位后,当ecc错误(单比特/双比特错误)发生后,出错的地址和数据就会被锁定到far和fdr寄存器里。
far寄存器里保存的是相对地址。实际出错地址的计算公式如下:
实际的出错地址= sram的起始地址 + far寄存器的值 * n(n=4或者8)。
fdr寄存器有两个,对于64位总线的sram数据,fdrl寄存器保存低4字节的数据,fdrh保存高4字节的数据。对于32位总线的sram数据,数据保存在fdrl寄存器中,fdrh的值为0。
我们可以看下面两个例子:
例子1:使能axi-sram对应的monitor功能(如何使能请参考stm32h7cube库中的ramecc_errorcount例程)。上电后axi-sram先不初始化,然后直接进行读操作就会触发ecc错误。这时候我们在调试状态下查看far和fdr的值,见下图。
这里因为axi-sram是64位总线接口,所以计算实际出错地址时,n的值是8。
例子2:使能sram1(0x30000000)对应的monitor功能。上电后不进行初始,然后直接进行读操作就会触发ecc错误。这时候我们在调试状态下查看far和fdr的值,如下图。
因为sram1是32位总线接口,所以这时n的值是4。
在应用中如何正确使用ram ecc
在使用支持ecc的ram时,一定要注意的是要对ram进行初始化,否则就可能会报ecc错误。就像我们在上一节的实验中做的那样,通过不初始化的做法,我们可以模拟出ecc错误。在an5342中给出了建议的初始化步骤。
对于单比特的ecc错误可以在读出的过程中自动纠正,但仅仅只是读出的数据是正确的,为了防止错误累积,导致从单比特的错误变成双比特的错误,可以在检测到单比特错误后,将正确的值写回到sram中去。这里有两种方式,一种如果原本sram中保存的值在flash有备份,那么直接将flash中的值再次写到sram中去;或者利用前面提到的far和fdr寄存器将正确的值写回sram中。
通过周期性的ecc检测来主动发现sram的故障也是提高系统可靠性的方法。ecc检测可以通过读sram的值来进行。检测不需要一次性完成,可以在系统空闲时,分段的对sram进行检测。请参考an5342了解更多的细节。


物联网导致了互联网大势已去了吗
基于STM32的平衡小车设计过程分享(2)
万达凑热闹布局区块链,贾跃亭晒FF91雪地测试照
IGBT过流检测保护电路图
产业链合力探屏幕突破极限的技术奥秘
SRAM ECC功能以及应用中的注意事项
东芝白电牵手创维 强强联手布局中国市场
你付出耐心,它回报好声音—达音科 Dunu 隼 耳机开箱
手机界的“全球第一”大盘点
iOS11第一个公测版上线推出 各种新功能块用起来
索尼全新两款XPeria全新上线,配置外形曝光!索尼只给全中国的手机和iphone供应摄像头,其他的全都pass?
盘点国内VR技术较成熟的互动娱乐公司
蔚来NIO Phone体验报告:智能体验超出预期,车手互联颇有惊喜
5g专网是什么 5G虚拟专网是无线全覆盖吗
光电管的简介
二分频扬声器电路故障处理
多家LED厂商披露财报 业绩表现相比去年都有所下降
数字电源市场发展趋势
光栅化的基础思想与三维场景的基本流程
未来几年全球智能传感器市场规模有望达到数千亿