RT无法离线启动?请先查看这两个寄存器

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义

最近有一位开源社区大佬在使能 RT1050 BEE 加密过程中遇到无法启动问题,折腾到一度崩溃,甚至想要弃坑。痞子衡哪能让这位“老乡”跑掉,连忙给予紧急支持,一番了解下来,其实这位大佬已经做好了大部分的工作,但是卡在了一个非常小的启动配置问题上面(他以为他配置好了 BOOT_CFG1[1] - EncryptedXIP,但其实配置并没有生效),这不禁让痞子衡思考,为什么大佬会卡在这里?于是便有了今天的文章,希望通过本篇文章,让所有的 RT 开发者再遇到无法启动问题时,养成第一时间检查 SRC_SBMR1/2 寄存器的意识。

Note: 本文适用全部的 RT10xx 以及 RT1160/1170。

一、从参考手册中的美丽误会说起

在进入正题之前,痞子衡先让大家看一段参考手册里的文字,这段文字存在于全部 RT10xx 的参考手册里(比如 RT1050 RM Rev.5 里)。这段文字讲得是当 SRC_GPR10[28] 位被置起来的时候,BootROM 用 SRC_GPR9 寄存器来替代 SRC_SBMR1 来决定启动设备以及相关配置。

Note: SRC 模块的寄存器仅在 POR 复位时才会被置位,普通系统软复位不会改变其内容。

如果这段文字是真的,那我们就可以通过调试器直接改写 SRC_GPR9/10 的值再软复位从而切换启动设备,不再需要像往常那样重设 BOOT_CFG pins/fuse 再硬复位来做切换了。就像这样:

但是很遗憾,这段内容是个美丽的错误,它是从 i.MX6ULL 参考手册里直接复制过来的,我们知道 RT 就是脱胎于 6ULL 的架构,但是 RT 的 BootROM 里并没有真的实现这个功能。

二、SRC_SBMRx寄存器作用

如果你注意看,上面那个参考手册里的美丽误会其实告诉了我们一件事,那就是 BootROM 其实是通过 SRC_SBMR1 寄存器来获取启动设备以及相关配置(BOOT_CFG)的。既然如此,当我们配置了 BOOT_CFG pins/fuse 的时候,不妨通过 SRC_SBMR1 寄存器来检查一下配置是否真的生效。除此以外,BootROM 也是通过 SRC_SBMR2 来获取启动模式的,因此这两个寄存器 SRC_SBMR1/2 的值非常重要。

通过调试器获取这两个寄存器的值非常简单,如果是 J-LINK,只需要连上之后使用 mem32 命令读取即可(注意 RT10xx 上的 SRC_SBMR1/2 地址分别是 0x400F8004/0x400F801C,但是 RT1160/1170 上是 0x40C04008/0x40C0401C)。

知道了启动配置检查方法,现在痞子衡告诉你这么做的意义,主要有以下两点。其中第二点就是文章开头那位开源社区大佬掉进坑里的原因(关于 BT_FUSE_SEL 位的解释详见痞子衡旧文 《Boot配置(BOOT Pin/eFUSE)》 1.2 小节)。

意义一:有时候因为上电采样时序或者设定后仅软复位原因,BOOT_MODE[1:0] 以及 BT_CFG[11:0] 引脚设定并没有如期生效,所以需要通过 SRC_SBMR2 来确认。

意义二:Fuse BT_FUSE_SEL 位在不同 BOOT_MODE[1:0] 下作用不同,这会影响启动设备 BOOT_CFG 最终设定(有时候是 BT_CFG[11:0] 引脚生效,有时候是 Fuse BOOT_CFG1/2 值生效),所以需要通过 SRC_SBMR1 来确认。

至此,SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义痞子衡便介绍完毕了,掌声在哪里~~~

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 3
关注 27
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧