MCU内部SRAM的ECC初始化竟可由ROM完成

描述

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170内部RAM的ECC初始化工作可全部由ROM完成

痞子衡之前写了三篇文章 《M7 FlexRAM ECC》、《M4 L-MEM ECC》、《MECC64》 分别介绍了 i.MXRT1170 片上 2MB RAM 的不同 ECC 控制器用法,尤其是第三篇文章最后介绍了当 MECC64 特性被激活之后,BootROM 虽然使能了 MECC1&2 但并没有一步到位初始化相应的全部 RAM 区域(仅初始化了 48KB ROM RW 区),这给后续调试和应用开发带来了一定隐患。

难道 BootROM “挑了事”就这么不负责任吗?当然不是!我们需要主动让 BootROM 负全责,今天痞子衡就聊一聊这个话题:

一、RAM ECC初始化相关Fuse位

前面的文章讲了 Fuse MECC_ENABLE bit 主要控制 MECC64 模块是否被激活,但其实它还有另外一层关于 RAM ECC 初始化控制。痞子衡在此列出了如下跟 RAM ECC 初始化相关的全部 Fuse bit,其中最核心的是 ROM_ECC_PRELOAD_POR bit,这个 bit 决定是否在芯片 POR 上电时让 ROM 去做额外的 RAM ECC 初始化工作。

 

Fuse 0x840[2]  - MECC_ENABLE bit,        是否开启MECC模块(默认0即不开启)
                                          ROM做ECC初始化是否包括M7 FlexRAM OCRAM、M4 TCM、M4 OCRAM(默认0即不包含)

Fuse 0x840[15] - TCM_ECC_ENABLE bit,     ROM做ECC初始化是否包括M7 TCM(默认0即不包含)

Fuse 0x850[7]  - OCRAM1_DISABLE bit,     ROM做ECC初始化是否包括扣去ROM RW区之后的OCRAM1(默认0即包含)
Fuse 0x850[6]  - OCRAM2_DISABLE bit,     ROM做ECC初始化是否包括OCRAM2(默认0即包含)

Fuse 0x950[0]  - ROM_ECC_PRELOAD_POR bit,是否在POR时让ROM去初始化RAM ECC(默认0即不做)

 

上述区域里关于 OCRAM1 ECC 初始化需要特别说一下,因为前 48KB 是 ROM RW 区,其在 ROM 刚执行就被初始化过了,这里 ROM_ECC_PRELOAD_POR bit 控制的初始化就不再重复操作 ROM RW 区了。因为如果包含这个区域,那就会破坏 ROM 程序的正常执行了。

二、检验ROM做RAM ECC初始化工作

为了检验 BootROM 是否很好地完成了 RAM ECC 初始化工作,痞子衡找了块 RT1170 板卡使用 MCUBootUtility 工具将 Fuse 0x840、0x850、0x950 全部设成 RAM ECC 初始化使能状态:

芯片

芯片保持 Serial Downloader 模式,挂上 JLink 读取内存,好家伙,内部 RAM 全部整齐划一地保持全 0 队形,不再是随机值了,看起来 ROM 很好地完成了 ECC 初始化工作。

芯片

这时候尝试在 DTCM 里写入一些测试数据,然后做软件复位,再回读发现测试数据依然保持着,这说明 ROM 只在 POR 硬复位时做一次 RAM ECC 初始化,其后发生软复位导致 ROM 再执行时就会跳过 ECC 初始化。

芯片

至此,i.MXRT1170内部RAM的ECC初始化工作可全部由ROM完成痞子衡便介绍完毕了,掌声在哪里~~~

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分