大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是利用i.MXRT1xxx系列ROM整合的DCD功能可輕鬆設定指定外設。
關於 i.MXRT1xxx 系列晶片 BootROM 中整合的 DCD 功能這個話題,痞子衡早就想寫了,但是一直沒有動筆,畢竟這個話題比較生澀,單獨講會比較枯燥。最近痞子衡在支援一個 i.MXRT1170 客戶,需要在客戶板卡上跑其應用程式碼的壓力測試,但是客戶因為保密的緣故僅提供了應用可執行檔案,而我們又需要在客戶應用裡額外加一些設定程式碼做測試,測試過程中會涉及多次斷電上電,如果掛外部偵錯程式去做額外設定又太繁瑣,這時候 DCD 功能就派上用場了。
- Note:文中貼圖、程式碼主要以 i.MXRT1170 為例,其餘 i.MXRT1xxx 系列原理類似。
DCD 是 Device Configuration Data 縮寫,這是 i.MXRT1xxx 系列晶片 BootROM 裡帶的一個附加功能,主要用於 App 啟動前系統外設的使用者客製化化設定。我們知道 i.MXRT1xxx 系列晶片上電永遠都是 BootROM 程式碼先執行,然後由 BootROM 再去載入 App 執行。如果希望在 App 執行前系統就已經被設定到指定狀態(即不需要在 App 裡去做這方面系統設定),那就需要藉助 DCD 功能,你只需要按格式將 DCD 資料放到 Boot Device 指定偏移處即可,BootROM 會自動去解析執行。
翻看晶片參考手冊 Device Configuration Data (DCD) 章節,你會發現 DCD 資料設計特別簡單,它總共支援三類命令: Write data(Tag 是 0xCC)、Check data(Tag 是 0xCF)、NOP(Tag 是 0xC0),這三類命令就是為了讀寫晶片外設暫存器而設計的,我們需要做的就是組合這三類命令完成指定外設模組暫存器的設定序列。任意開啟一個 RT1170 SDK 範例工程,都會包含 dcd.c/h 檔案(僅當工程選項預編譯宏裡有 XIP_BOOT_HEADER_DCD_ENABLE=1 才會被使能)。
隨便摘其中兩句分析下,第一句表明是 Write data 命令的 *address = val_msk 動作合集,第二句是執行 *((uint32_t *)0x40CC0200) = 0x00000703,也就是 CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL = 0x703。
/* #1.1-129, command header bytes for merged 'Write - value' command */
0xCC, 0x04, 0x0C, 0x04,
/* #1.1, command: write_value, address: CCM_CLOCK_ROOT4_CONTROL, value: 0x703, size: 4 */
0x40, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x07, 0x03,
接著這個範例 dcd.c 內容繼續聊,這其實是設定晶片 SEMC 外設去初始化外部 SDRAM 的全部序列。有了這個 DCD 設定,那麼 App 裡就可以不用管外部 SDRAM 初始化工作了,直接讀寫存取 SDRAM 完成相應應用業務功能即可,這也是 DCD 的典型應用場景。如果應用程式碼直接是全部在 SDRAM 執行,在不設計使用者二級 Bootloader 做載入的情況下,DCD 是必選的解決方案。
現在回到客戶的實際案例,客戶 RT1170 板卡上用了一顆來自 MXIC 的 Octal Flash,程式碼是執行在 Flash 上,現在我們需要測試不同 FlexSPI1->DLLACR[SLVDLYTARGET] 設定下的工作情況,而我們手頭僅有客戶可執行檔案。
將客戶可執行檔案下載進板卡,並設定啟動模式為從 Flash 啟動(2'b10),然後掛上 JLINK 偵錯程式讀取 FlexSPI1->DLLACR 暫存器值(該暫存器地址是 0x400cc0c0),得到 0x00400079,其中 SLVDLYTARGET 是預設的理想值 4'b1111,這個值是 BootROM 自動設定的,我們無法通過 FDCB 啟動頭來更改設定。
為了做壓力測試,我們需要更改不同的 FlexSPI1->DLLACR[SLVDLYTARGET] 值,比如將其設為 4'b1000,這時候可以藉助 DCD 來實現,我們直接使用 MCUBootUtility 工具(需要使用 v4.1.1 版本及以上)來使能 DCD。
將客戶板卡啟動模式改為 Serial Download (2'b01),插上 UART/USB 下載線,開啟 MCUBootUtility 工具,在 DCD 設定介面裡啟用 "Use DCD description" 選項,並在動作框裡直接輸入下面語句(這裡直接是類 C 語法,會被工具自動轉成 DCD 資料),然後連線、下載。
*(uint32_t*)0x400cc0c0 = 0x00400041;
將板卡設為從 Flash 啟動模式後重新上電,掛上 JLINK 再去讀取,此時 FlexSPI1->DLLACR 已經是期望的 0x00400041,說明 DCD 功能生效了。這裡還有一個注意事項,即 BootROM 利用 FDCB 啟動頭設定 FlexSPI 外設在前,解析執行 DCD 資料在後,所以我們才能藉助 DCD 實現這樣的更改測試。
看起來 DCD 特別強大,那麼它能幫助操作 ARM 4GB 系統空間裡的全部地址嗎?答案是否定的,出於安全考慮,BootROM 裡做了地址限制,我們僅能用 DCD 操作如下指定的一些外設(不同 i.MXRT 系列有所不同):
至此,利用i.MXRT1xxx系列ROM整合的DCD功能可輕鬆設定指定外設痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維條碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公眾號【痞子衡嵌入式】,一個專注嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。
專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或諮詢業務合作請發郵件至 https://www.cnblogs.com/henjay724/p/[email protected]
可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式專案。
關於專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回覆免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。