現(xiàn)代電子系統(tǒng)中,由于“軟”錯誤引起的系統(tǒng)故障比永久性硬件失效引起的系統(tǒng)故障要更多。“軟”錯誤是指可以恢復(fù)的故障或者失效。這一類錯誤容易發(fā)生在寄存器,RAM等上面,由于受到電磁干擾或者封裝材料中的α粒子,宇宙射線等的影響而造成位值翻轉(zhuǎn)。針對這個問題,可以在硬件上加奇偶校驗(yàn),ECC電路來進(jìn)行檢測。
STM32H7系列MCU的Flash,SRAM和CACHE都支持ECC的功能。在本文中,主要介紹SRAM ECC這部分功能以及應(yīng)用中的注意事項(xiàng)。
RAMECC外設(shè)
在STM32H7系列MCU中,有一個叫RAMECC的外設(shè),它是一個RAM ECC Monitor。RAMECC提供了一個接口給應(yīng)用程序來檢測當(dāng)前RAM的ECC狀態(tài),以及當(dāng)發(fā)生ECC錯誤后執(zhí)行相應(yīng)的恢復(fù)或者報(bào)錯程序。
STM32H7的RAM ECC支持糾正單比特的錯誤和檢測雙比特的錯誤。對于AXI SRAM和TCM RAM,每64位數(shù)據(jù)附加8位ECC碼;其他的32位總線的SRAM,每32位數(shù)據(jù)附加7位ECC碼。
在對SRAM進(jìn)行寫操作的時候,硬件自動計(jì)算并保存ECC的值,在對SRAM進(jìn)行讀操作或者非對齊的寫操作(讀-改-寫)的時候會自動進(jìn)行校驗(yàn),并且出錯的地址和數(shù)據(jù)可以通過寄存器讀出。
STM32H7的RAM ECC功能的實(shí)現(xiàn)可以分成兩個部分:RAM ECC Controller和RAM ECC Monitor單元,如下圖所示。
關(guān)于ECC Controller
STM32H7的SRAM分成AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4,數(shù)據(jù)TCM RAM,指令TCM RAM和備份SRAM等幾塊。每個RAM塊分別對應(yīng)一個ECC Controller。
ECC Controller始終處于使能狀態(tài)。它負(fù)責(zé)ECC代碼的計(jì)算存儲,比較和錯誤檢測,可以完成單比特錯誤糾正和雙比特錯誤檢測的功能。
關(guān)于ECC Monitor
STM32H7一共有三個ECC Monitor,各負(fù)責(zé)一個域。ECC Monitor接收來自ECC Controller的診斷事件,并根據(jù)寄存器的配置產(chǎn)生對應(yīng)的中斷信號。
ECC Controller與ECC Monitor之間的映射關(guān)系見下圖。例如D1的RAMECC Monitor單元,一共有5個通道,每個通道對應(yīng)一個SRAM塊的ECC controller。每個通道都有自己的一組寄存器,圖中的Address offset就是寄存器組的偏移地址。如果要打開AXI SRAM的ECC Monitor單元,使得當(dāng)檢測到AXI SRAM的ECC錯誤時產(chǎn)生對應(yīng)的中斷,就需要操作AXI SRAM對應(yīng)的寄存器組。
FAR和FDR寄存器
RAMECC支持單比特ECC錯誤中斷,雙比特ECC錯誤中斷和非對齊寫操作(Byte Write)引起的ECC中斷。在RAMECC的IER和CR寄存器中可以分別配置和使能這些中斷。在SR寄存器中可以查看這些中斷的狀態(tài)。這幾個寄存器的操作都一目了然,這里想說明的是另外兩個寄存器:出錯地址寄存器FAR和出錯數(shù)據(jù)寄存器FDR。
使能了CR寄存器里的ECCELEN位后,當(dāng)ECC錯誤(單比特/雙比特錯誤)發(fā)生后,出錯的地址和數(shù)據(jù)就會被鎖定到FAR和FDR寄存器里。
FAR寄存器里保存的是相對地址。實(shí)際出錯地址的計(jì)算公式如下:
實(shí)際的出錯地址= SRAM的起始地址 + FAR寄存器的值 * N(N=4或者8)。
FDR寄存器有兩個,對于64位總線的SRAM數(shù)據(jù),F(xiàn)DRL寄存器保存低4字節(jié)的數(shù)據(jù),F(xiàn)DRH保存高4字節(jié)的數(shù)據(jù)。對于32位總線的SRAM數(shù)據(jù),數(shù)據(jù)保存在FDRL寄存器中,F(xiàn)DRH的值為0。
我們可以看下面兩個例子:
例子1:使能AXI-SRAM對應(yīng)的Monitor功能(如何使能請參考STM32H7CUBE庫中的RAMECC_ErrorCount例程)。上電后AXI-SRAM先不初始化,然后直接進(jìn)行讀操作就會觸發(fā)ECC錯誤。這時候我們在調(diào)試狀態(tài)下查看FAR和FDR的值,見下圖。
這里因?yàn)锳XI-SRAM是64位總線接口,所以計(jì)算實(shí)際出錯地址時,N的值是8。
例子2:使能SRAM1(0X30000000)對應(yīng)的Monitor功能。上電后不進(jìn)行初始,然后直接進(jìn)行讀操作就會觸發(fā)ECC錯誤。這時候我們在調(diào)試狀態(tài)下查看FAR和FDR的值,如下圖。
因?yàn)镾RAM1是32位總線接口,所以這時N的值是4。
在應(yīng)用中如何正確使用RAM ECC
在使用支持ECC的RAM時,一定要注意的是要對RAM進(jìn)行初始化,否則就可能會報(bào)ECC錯誤。就像我們在上一節(jié)的實(shí)驗(yàn)中做的那樣,通過不初始化的做法,我們可以模擬出ECC錯誤。在AN5342中給出了建議的初始化步驟。
對于單比特的ECC錯誤可以在讀出的過程中自動糾正,但僅僅只是讀出的數(shù)據(jù)是正確的,為了防止錯誤累積,導(dǎo)致從單比特的錯誤變成雙比特的錯誤,可以在檢測到單比特錯誤后,將正確的值寫回到SRAM中去。這里有兩種方式,一種如果原本SRAM中保存的值在Flash有備份,那么直接將Flash中的值再次寫到SRAM中去;或者利用前面提到的FAR和FDR寄存器將正確的值寫回SRAM中。
通過周期性的ECC檢測來主動發(fā)現(xiàn)SRAM的故障也是提高系統(tǒng)可靠性的方法。ECC檢測可以通過讀SRAM的值來進(jìn)行。檢測不需要一次性完成,可以在系統(tǒng)空閑時,分段的對SRAM進(jìn)行檢測。請參考AN5342了解更多的細(xì)節(jié)。
責(zé)任編輯:haq
-
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119814 -
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354289
原文標(biāo)題:工程師筆記 | STM32H7 RAMECC功能及應(yīng)用
文章出處:【微信號:STM_IPGChina,微信公眾號:意法半導(dǎo)體PDSA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論