大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是超級下載下傳算法開發筆記番外篇之JLinkScript妙用。
JLinkScript 檔案是配套 J-Link 調試器使用的腳本,這個腳本适用于需要定制 J-Link 執行操作的場景,它可以幫助使用者完成 J-Link 标準工具做不到的一些事情(比如 J-Link 連接配接順序或者執行複位的方式,或者一些定制的硬體闆需要一些特殊處理),關于 JLinkScript 檔案詳細解釋參見痞子衡舊文 《JLink Script檔案基礎》。
痞子衡在開發 《RT-UFL - 一個适用全平台i.MXRT的超級下載下傳算法設計》 項目時,遇到幾個難點問題,幸好有 JLinkScript 檔案幫忙才得以輕松解決,今天痞子衡就跟大家分享一下解決問題過程:
超級下載下傳算法工程是 MIMXRT_FLEXSPI_UV5.uvprojx,基于 Keil MDK uVision5,在工程選項設定裡,IROM空間是 0x1000 位址開始的 60KB(0x0 - 0xFFF空間留有它用)、IRAM 空間是 0x20000000 開始的 64KB,總空間大小是 124KB。

在整個 i.MXRT 系列裡,i.MXRT1011的内部 RAM 空間最小,但也有 128KB,大小符合超級下載下傳算法需求。但是其預設 RAM 配置設定是 32KB ITCM(0x0 - 0x7FFF), 32KB DTCM(0x20000000 - 0x20007FFF), 64KB OCRAM(0x20200000 - 0x2020FFFF),這就不符合超級下載下傳算法需求了。PS: 除了i.MXRT1011之外,其他 i.MXRT 型号預設 RAM 空間都符合算法要求。
如何解決這個預設 RAM 空間配置設定不适的問題?當然是調整 FlexRAM 配置了,在《百變星君FlexRAM》 一文裡,我們知道 i.MXRT1011 裡有兩種調整 FlexRAM 配置設定的方式,一種是燒寫 eFuse(靜态方式,一次性地,冷啟動系統自動完成),另一種是改寫 IOMUXC_GPR 寄存器(動态方式,可多次,軟複位仍然保持有效),是以很自然地我們想到了通過 JLinkScript 檔案來改寫 IOMUXC_GPR 寄存器方式來達成目的,這樣對晶片後續運作沒有根本性影響。檔案路徑在 JLinkDevices.xml 裡指定:
iMXRT1011_CortexM7.JLinkScript 内容就比較簡單了,按要求改寫 IOMUXC_GPR16/17 即可:
Note:這種方法也可以用來解決客戶應用程式存在動态調整 FlexRAM 的代碼導緻軟複位後 IDE 無法再次下載下傳的問題,因為下載下傳算法需要的 RAM 空間被重新配置設定掉了,我們需要在 JLinkScript 再将其改回來。
在 《 識别目前i.MXRT型号》 一文中,痞子衡較長的描述了超級下載下傳算法設計裡是如何識别具體 i.MXRT 型号的,簡單概括就是因為晶片本身沒有固定位址寄存器來标明型号,是以我們用比對 ROM 空間裡指定位址内容的方式來替代(每個 i.MXRT 型号 ROM 内容都不一樣,且同核心型号 ROM 起始位址是一緻的),文中僅用 RT600 和 RT1060 兩個型号來做了示例,但在增加 i.MXRT1010 和 i.MXRT1170 兩款型号支援時,我們發現這兩款 ROM 可讀空間竟然沒有重疊。
i.MXRT1011 的 ROM 空間是 0x200000 - 0x20FFFF(64KB),i.MXRT117x 的 ROM 空間是 0x200000 - 0x23FFFF(256KB),乍一看,這不是有重疊的嘛。但是很可惜的是,i.MXRT117x 前 64KB ROM 空間被刻意保護起來了,代碼無法通路,是以比對 ROM 空間内容的方法對 i.MXRT1170 來說就失效了,必須新找其他方法來做型号識别。
痞子衡有考慮過用讀晶片外設寄存器的方式來區分 i.MXRT 型号(找有差異的那個即可),但是在 Memory Map 裡找了一圈也沒找到合适寄存器,因為 i.MXRT10xx 與 i.MXRT11xx 在外設寄存器位址配置設定上差異很大,也是幾乎沒有位址重疊的外設。
無奈之下,痞子衡又想到了通過 JLinkScript 檔案來在固定 RAM 位址處寫辨別的方式來達成目的,痞子衡選擇了 0xFFFC - 0xFFFF 位址空間裡的四個位元組來存放辨別,是以我們在超級下載下傳算法工程選項設定裡将這個位址先留出來:
然後對超級下載下傳算法源代碼裡 ufl_get_imxrt_chip_id() 函數做一點小改動,這裡我們用了 0x5AA60FF0 來辨別 I.MXRT1170,實測是可行的,當然如果覺得不放心,可以将辨別空間再拓大一些,辨別符也相應長一些。
與第一小節一樣,在 JLinkDevices.xml 裡指定好 JLinkScript 檔案路徑,然後 iMXRT117x_CortexM7.JLinkScript 内容也比較簡單,按要求将辨別符寫進 RAM 裡即可:
Note:辨別符似乎不能放在 0x0 - 0xFFF 空間裡,這個空間在目前超級下載下傳算法設計裡被 JLink 占用了,痞子衡測試了 0x0 - 0x3 和 0xFFC - 0xFFF 兩處空間位址,均失敗了。
至此,超級下載下傳算法開發筆記番外篇之JLinkScript妙用痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。