|

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170内部RAM的ECC初始化工作可全部由ROM完成。- r% [" E9 F9 [/ v* W; y$ n' `
痞子衡之前写了三篇文章 《M7 FlexRAM ECC》、《M4 L-MEM ECC》、《MECC64》 分别介绍了 i.MXRT1170 片上 2MB RAM 的不同 ECC 控制器用法,尤其是第三篇文章最后介绍了当 MECC64 特性被激活之后,BootROM 虽然使能了 MECC1&2 但并没有一步到位初始化相应的全部 RAM 区域(仅初始化了 48KB ROM RW 区),这给后续调试和应用开发带来了一定隐患。- }( p0 I5 l8 }" B" x; a
难道 BootROM “挑了事”就这么不负责任吗?当然不是!我们需要主动让 BootROM 负全责,今天痞子衡就聊一聊这个话题:$ Y1 f4 _" D8 p Y
一、RAM ECC初始化相关Fuse位前面的文章讲了 Fuse MECC_ENABLE bit 主要控制 MECC64 模块是否被激活,但其实它还有另外一层关于 RAM ECC 初始化控制。痞子衡在此列出了如下跟 RAM ECC 初始化相关的全部 Fuse bit,其中最核心的是 ROM_ECC_PRELOAD_POR bit,这个 bit 决定是否在芯片 POR 上电时让 ROM 去做额外的 RAM ECC 初始化工作。) _4 G8 ~; c- C0 }1 r
Fuse 0x840[2] - MECC_ENABLE bit, 是否开启MECC模块(默认0即不开启)
' J0 F+ ] \/ E- H2 j ROM做ECC初始化是否包括M7 FlexRAM OCRAM、M4 TCM、M4 OCRAM(默认0即不包含), |. I- f9 H. |" s" d* \
Fuse 0x840[15] - TCM_ECC_ENABLE bit, ROM做ECC初始化是否包括M7 TCM(默认0即不包含)9 H6 S. y E" f; h" w: T
Fuse 0x850[7] - OCRAM1_DISABLE bit, ROM做ECC初始化是否包括扣去ROM RW区之后的OCRAM1(默认0即包含)
" Z+ _9 J' o& `9 u( W U! nFuse 0x850[6] - OCRAM2_DISABLE bit, ROM做ECC初始化是否包括OCRAM2(默认0即包含)
% H6 T' D2 j2 q6 `7 \% @ a2 RFuse 0x950[0] - ROM_ECC_PRELOAD_POR bit,是否在POR时让ROM去初始化RAM ECC(默认0即不做)9 r4 H; y7 h7 q* u4 C n
上述区域里关于 OCRAM1 ECC 初始化需要特别说一下,因为前 48KB 是 ROM RW 区,其在 ROM 刚执行就被初始化过了,这里 ROM_ECC_PRELOAD_POR bit 控制的初始化就不再重复操作 ROM RW 区了。因为如果包含这个区域,那就会破坏 ROM 程序的正常执行了。
) h: J* w J, ]+ n: k i; j! x6 l6 y二、检验ROM做RAM ECC初始化工作为了检验 BootROM 是否很好地完成了 RAM ECC 初始化工作,痞子衡找了块 RT1170 板卡使用 MCUBootUtility 工具将 Fuse 0x840、0x850、0x950 全部设成 RAM ECC 初始化使能状态: |
|