痞子衡嵌入式:如果i.MXRT1xxx離線無法啓動,請先查看SRC_SBMRx寄存器


  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是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 的值非常重要。

啓動配置項 啓動檢查項
啓動模式
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)。

  知道了啓動配置檢查方法,現在痞子衡告訴你這麼做的意義,主要有以下兩點。其中第二點就是文章開頭那位開源社區大佬掉進坑裏的原因(關於 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主頁知乎主頁微信公衆號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章