3

痞子衡嵌入式:如果i.MXRT1xxx离线无法启动,请先查看SRC_SBMRx寄存器 - 痞子衡

 7 months ago
source link: https://www.cnblogs.com/henjay724/p/18007125
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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 复位时才会被置位,普通系统软复位不会改变其内容。
i.MXRT_SRC-SBMR_note.PNG

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

i.MXRT_SRC-SBMR_jlink_write.PNG

  但是很遗憾,这段内容是个美丽的错误,它是从 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 的值非常重要。

启动配置项 启动检查项
启动模式
BOOT_MODE[1:0]引脚
SRC_SBMR2[BMOD]
启动模式辅助项
Fuse BT_FUSE_SEL 位
SRC_SBMR2[BT_FUSE_SEL]
启动设备选择
BT_CFG[7:0]引脚 / Fuse BOOT_CFG1[7:0]
BT_CFG[11:8]引脚 / Fuse BOOT_CFG2[3:0]
SRC_SBMR1[7:0]
SRC_SBMR1[11:8]

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

i.MXRT_SRC-SBMR_jlink_read.PNG

  知道了启动配置检查方法,现在痞子衡告诉你这么做的意义,主要有以下两点。其中第二点就是文章开头那位开源社区大佬掉进坑里的原因(关于 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离线无法启动问题的意义痞子衡便介绍完毕了,掌声在哪里~~~

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

pzhMcu_qrcode_258x258.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK