今天痞子衡給大家分享的是i.MXRT1170 MECC64功能特點(diǎn)及其保護(hù)片內(nèi)OCRAM1,2之道。
ECC是 “Error Correcting Code” 的簡(jiǎn)寫,ECC 能夠?qū)崿F(xiàn)錯(cuò)誤檢查和糾正,含有 ECC 功能的內(nèi)存一般稱為 ECC 內(nèi)存,使用了 ECC 內(nèi)存的系統(tǒng)在穩(wěn)定性和可靠性上得到很大提升。相比前幾代不帶 ECC 的 i.MXRT10xx 型號(hào),新一代 i.MXRT1170 在ECC上做了全面武裝,從 eFuse 到 FlexRAM,從 OCRAM 到外部存儲(chǔ)空間全都加上了 ECC 功能。如下表所示,不同類型的存儲(chǔ)由不同的 ECC 控制器來守護(hù):
今天痞子衡給大家簡(jiǎn)單介紹一下 i.MXRT1170 上用于保護(hù)片內(nèi) OCRAM1,2 的 MECC64 功能:
一、MECC64功能簡(jiǎn)介
1.1 MECC64特點(diǎn)
從用戶角度來說,其實(shí) MECC64 的設(shè)計(jì)特別簡(jiǎn)單,當(dāng) MECC64 使能后,任何對(duì)受保護(hù)的 OCRAM1/2 發(fā)起的 AXI 訪問都會(huì)被 MECC64 模塊接管,MECC64 組件負(fù)責(zé)根據(jù)用戶寫入的數(shù)據(jù)產(chǎn)生 ECC 校驗(yàn)值并將其存放于專用 OCRAM1/2_ECC 里,讀訪問時(shí)根據(jù)用戶讀取的地址從相應(yīng) OCRAM1/2_ECC 地址處獲取 ECC 檢驗(yàn)值并做檢驗(yàn)處理后再返回?cái)?shù)據(jù)。
從模塊框圖里看一個(gè) MECC64 里有四個(gè) ECC 校驗(yàn)流程(也對(duì)應(yīng)四個(gè) RAM Bank 控制器),這其實(shí)是跟單個(gè) 512KB OCRAM 由四個(gè) 128KB Bank 組成一一對(duì)應(yīng)的,這樣便于轉(zhuǎn)化 AXI64 接口到 RAM 接口。
1. OCRAM 四個(gè) Bank 掛載在 AXI64 系統(tǒng)總線上,AXI[1:0] 決定了訪問得是 Bank0-3,這樣的設(shè)計(jì)可以支持對(duì)不同 Bank 的讀、寫操作同時(shí)進(jìn)行。 2. ECC 計(jì)算單元是 64bits,這 64bits 數(shù)據(jù)必須在同一 Bank 里,這個(gè)設(shè)計(jì)對(duì) ECC 初始化操作影響較大,因此避免用 memset 函數(shù)去做初始化(STR指令是 byte access)。
![c0f4c2f2-a621-11ee-8b88-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/BA/7E/wKgaomWOf2-AC_oxAAFAqjsn8nc184.png)
MECC64 模塊一共有兩個(gè),分別是 MECC1、MECC2,分別對(duì)應(yīng)保護(hù) OCRAM1、OCRAM2。此外還有兩個(gè)專用 OCRAM1_ECC、 OCRAM2_ECC 存放 ECC 校驗(yàn)值(當(dāng) MECC64 沒使能時(shí),OCRAM1/2_ECC 也可當(dāng)作普通 OCRAM 使用)。
MECC1 base address: 4001_4000h MECC2 base address: 4001_8000h
1.2 關(guān)于MECC64設(shè)計(jì)細(xì)節(jié)
關(guān)于 MECC64 基本概念,參看《簡(jiǎn)析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特點(diǎn)、開啟步驟、性能影響》 的 1.2節(jié),這里不予贅述。
1.2.1 MECC64檢驗(yàn)?zāi)芰?/p>
MECC64 中每 64bits 數(shù)據(jù)就會(huì)計(jì)算出一個(gè) ECC 校驗(yàn)值(8bits),ECC 算法用得是經(jīng)典的 Hsiao Hamming。
存儲(chǔ)類型 | ECC校驗(yàn)數(shù)據(jù)塊大小 | ECC校驗(yàn)值長(zhǎng)度 | ECC校驗(yàn)?zāi)芰?/th> |
---|---|---|---|
Raw NAND | 512 bytes | 4 bytes | 5-bit檢錯(cuò),4-bit糾錯(cuò) |
MECC64 | 64bits | 8bits | 2-bit檢錯(cuò),1-bit糾錯(cuò) |
1.2.2 ECC錯(cuò)誤觸發(fā)處理
ECC 錯(cuò)誤分兩種,分別是 1-bit 錯(cuò)誤和 2-bit 錯(cuò)誤(針對(duì) 64bits 數(shù)據(jù)而言)。從軟件層面來看,1-bit 錯(cuò)誤可以不用管,MECC64 模塊會(huì)自動(dòng)糾錯(cuò)。我們主要處理 2-bit 錯(cuò)誤,由于 2-bit 錯(cuò)誤僅能檢錯(cuò),無法糾錯(cuò),所以發(fā)生了這個(gè)錯(cuò)誤,就意味著讀取的數(shù)據(jù)不可靠了。對(duì)于 1/2 bit錯(cuò)誤,MECC64 均提供了中斷響應(yīng)(MECCx_INT_IRQn / MECCx_FATAL_INT_IRQn)。
這里還需要特別提醒一下,當(dāng)讀訪問是 64bits 時(shí),發(fā)生 ECC 錯(cuò)誤僅產(chǎn)生一次 ECC 中斷,但是如果是 32/16/8bits 讀訪問則會(huì)連續(xù)產(chǎn)生兩次 ECC 中斷,因?yàn)?ECC 校驗(yàn)總是以 64bits 為基本數(shù)據(jù)單元。
二、開啟MECC64的步驟
2.1 激活MECC64特性
芯片出廠,默認(rèn)是沒有激活 MECC64 特性的,如果需要開啟 MECC64,需要燒寫 efuse,fusemap 中 0x840[2] 對(duì)應(yīng)的是 MECC_ENABLE bit,我們需要將這個(gè) bit 燒寫成 1,才能激活 MECC64 特性。
2.2 SDK驅(qū)動(dòng)初始化MECC64
然后可以直接利用 SDK 里的 fsl_mecc 驅(qū)動(dòng)對(duì) MECC64 模塊進(jìn)行初始化,代碼非常簡(jiǎn)單,如下示例代碼就是初始化 MECC1,使能 OCRAM1 區(qū)域的讀寫 ECC 功能:
#include"fsl_mecc.h" voidinit_mecc(void) { mecc_config_tconfig; MECC_GetDefaultConfig(&config); //使能MECC64,并且指明受保護(hù)的OCRAM空間 config.enableMecc=true; config.Ocram1StartAddress=0x20240000; config.Ocram1EndAddress=0x202BFFFF; //初始化MECC64模塊,并且初始化OCRAM區(qū)域?yàn)槿? MECC_Init(MECC1,&config); }
進(jìn) MECC_Init() 函數(shù)內(nèi)部可以看到其對(duì) OCRAM 區(qū)域的初始化用得是 64bits 賦值,這樣可以保證正確生成首次 ECC 校驗(yàn)值,等 OCRAM 區(qū)域全部初始化過后,底下就可以對(duì) OCRAM 進(jìn)行任意數(shù)據(jù)長(zhǎng)度的訪問了。
2.3 AXI方式讀寫OCRAM區(qū)域
現(xiàn)在我們直接調(diào)試 SDK_2_14_0_MIMXRT1170-EVKBoardsevkbmimxrt1170driver_examplesmeccmecc_single_errorcm7iar 工程,跑到 MECC 初始化結(jié)束后,打開 Memory 窗口,可以看到 OCRAM1 區(qū)域(0x20240000 - 0x202BFFFF) 已經(jīng)是全 0,OCRAM1_ECC 區(qū)域(0x20340000 - 0x2034FFFF)也是全 0。但是往 0x20240020 處寫入 8 字節(jié)測(cè)試數(shù)據(jù)后,并沒有看到 OCRAM1_ECC 區(qū)域有數(shù)據(jù)上的變化,說明 ECC 校驗(yàn)碼數(shù)據(jù)是受保護(hù)的,僅能被 MECC64 模塊訪問,對(duì)用戶不可見。
三、激活MECC64特性后的影響
前面講到 fusemap 中 0x840[2] 對(duì)應(yīng)的是 MECC_ENABLE bit,這個(gè) bit 被燒錄為 1 后,我們還需要初始化 MECC64 模塊里(打開MECC->PIPE_ECC_EN[ECC_EN])才能真正開啟 OCRAM ECC 功能,但是別忘了芯片參考手冊(cè)里 MECC64 章節(jié)有一個(gè)提醒:
是的,BootROM 上電運(yùn)行,第一件事就是檢查 fuse MECC_ENABLE bit 位,如果已經(jīng)置 1,那就立刻開啟 MECC1 和 MECC2 模塊的 PIPE_ECC_EN[ECC_EN],即啟用 OCRAM ECC,但是 BootROM 并沒有初始化全部 OCRAM1 和 OCRAM2 區(qū)域,僅僅初始化了 OCRAM1 前 48KB,這部分是 BootROM 程序的 RW 區(qū)。
痞子衡找了兩塊 RT1170 板卡做了對(duì)比測(cè)試(芯片設(shè)為 Serial Downloader模式,掛上 JLink 讀取內(nèi)存),未激活 MECC64 特性的芯片 OCRAM 區(qū)域讀取出來全是隨機(jī)值,而激活了 MECC64 特性的芯片僅 ROM RW 區(qū)被初始化了以及 OCRAMx_ECC 不可訪問外,其余區(qū)域全是隨機(jī)值(這里的讀取其實(shí)不太可靠,畢竟使能了 ECC 后首次訪問必須是寫,然后才能正常被讀寫)。
對(duì)于激活了 MECC64 特性之后的芯片,無論是設(shè)計(jì)下載算法還是 IDE 里的初始化腳本,或者 App 應(yīng)用里的變量訪問,如果涉及到 ROM RW 區(qū)之外的 OCRAM1,OCRAM2 區(qū)域,建議一律做先寫后讀處理,否則可能會(huì)出現(xiàn)奇怪的錯(cuò)誤。
至此,i.MXRT1170 MECC64功能特點(diǎn)及其保護(hù)片內(nèi)OCRAM1,2之道痞子衡便介紹完畢了,掌聲在哪里~~~
審核編輯:劉清
-
控制器
+關(guān)注
關(guān)注
112文章
16445瀏覽量
179444 -
RAM
+關(guān)注
關(guān)注
8文章
1369瀏覽量
115002 -
ECC
+關(guān)注
關(guān)注
0文章
97瀏覽量
20640
原文標(biāo)題:MECC64給i.MXRT1170片內(nèi)OCRAM帶來了哪些變化?
文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
i.MXRT1170 的時(shí)鐘架構(gòu)
i.MXRT1170的相關(guān)資料分享
i.MXRT1170 eFuse空間訪問可靠性的保護(hù)策略是什么
i.MXRT1010, 1170型號(hào)上不一樣的SNVS GPR寄存器讀寫控制設(shè)計(jì)資料分享
求助,如何在沒有互聯(lián)網(wǎng)的情況下通過以太網(wǎng)電纜將一個(gè)簡(jiǎn)單的十六進(jìn)制數(shù)從I.MXRT1170板發(fā)送到PC?
如何在IMXRT1170 CM7處理器上啟用OCRAM MECC?
s32k144evb如何與i.MXRT通信?
如何確保 i.MXRT1176 從低功耗模式快速恢復(fù)?
J-Link工具下i.MXRT的串行NOR Flash下載算法設(shè)計(jì)
痞子衡嵌入式:終于可以放開聊一聊i.MXRT1170這顆劃時(shí)代MCU了
![痞子衡嵌入式:終于可以放開聊<b class='flag-5'>一</b>聊<b class='flag-5'>i.MXRT1170</b>這顆劃時(shí)代MCU了](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
"痞子衡嵌入式:i.MXRT1010, 1170型號(hào)上不一樣的SNVS GPR寄存器讀寫控制設(shè)計(jì)"
!["痞子衡嵌入式:<b class='flag-5'>i.MXRT</b>1010, <b class='flag-5'>1170</b>型號(hào)<b class='flag-5'>上</b>不<b class='flag-5'>一</b>樣的SNVS GPR寄存器讀寫控制設(shè)計(jì)"](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
i.MXRT1170上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)
MCU時(shí)鐘相關(guān)功能引腳作用介紹
在i.MXRT1060和RT1170上使用高效神經(jīng)網(wǎng)絡(luò)進(jìn)行多人檢測(cè)
![在<b class='flag-5'>i.MXRT</b>1060和RT<b class='flag-5'>1170</b><b class='flag-5'>上</b>使用高效神經(jīng)網(wǎng)絡(luò)進(jìn)行多人檢測(cè)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
不同J-Link版本對(duì)于i.MXRT1170連接復(fù)位后處理行為
![不同J-Link版本對(duì)于<b class='flag-5'>i.MXRT1170</b>連接復(fù)位后處理行為](https://file1.elecfans.com/web2/M00/01/48/wKgZoma0c_SAXCb9AATkDG50Jgo556.jpg)
評(píng)論