痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT開發板(2) - 在Flash除錯及離線啟動

痞子衡發表於2021-12-26

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT1062 TencentOS Tiny EVB_AIoT開發板在Flash除錯與離線啟動

  騰訊 TencentOS 團隊於2021年12月8日聯合恩智浦半導體、安謀科技發起了一個線上開發者活動 - TencentOS Tiny AIoT 應用創新大賽。為了這個大賽,騰訊 TencentOS 團隊聯合恩智浦半導體、厚德物聯網設計了一款高效能 AIoT 評估板,用於 TencentOS tiny 基礎核心和 AIoT 應用功能體驗和評估。

  痞子衡受邀為這個大賽準備一場直播課程(12月30日晚7點),主題是板載主控恩智浦 i.MXRT1062 晶片快速開發指南,由於課程時間限定在40分鐘,要講的內容又比較多,註定只能走馬觀花,所以這個系列文章就圍繞 EVB_AIoT 開發板給這場直播做一個鋪墊和補充。上一篇我們講了 《開發環境搭建與點燈》,本文是第二篇,我們來講講在 Flash 除錯與離線啟動:

一、跑通串列埠列印

  上一篇文章我們藉助板載 DAP-Link 偵錯程式在晶片內部 RAM 裡以線上除錯的方式跑通了最入門的點燈實驗,今天我們換個同樣也非常經典的串列埠列印例程,恩智浦 SDK 包裡有模板工程(記得用 MCUXpresso IDE 匯出):

  • 串列埠例程:\SDK_2.10.1_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world

  hello_world 模板工程裡使能的是 i.MXRT1062 UART1(管腳是 GPIO_AD_B0[13:12]]),我們檢視 EVB_AIoT 板原理圖,這兩個 UART1 訊號同樣被引了出來(即下圖 AT_PC_UART 訊號),不過用了模擬開關 BCT4699 做了切換設計,這裡我們需要改一下預設設定,將母板上 SW1 開關撥到 1-2,這樣 UART1 就被連到了板載偵錯程式虛擬串列埠上:

1. 開關 SW1 選擇 2-3(出廠預設設定):
   - 母板接插無線模組連通母板 DAP-Link 偵錯程式虛擬串列埠 
2. 開關 SW1 選擇 1-2:
   - 子板主控 UART2 連通母板接插無線模組
   - 子板主控 UART1 連通母板 DAP-Link 偵錯程式虛擬串列埠

  雖然不用更改 hello_world 模板工程的原始碼,但是我們還是要按照第一篇文章 《開發環境搭建與點燈》 第 2.3 小節裡指示在工程屬性裡勾選上 Link application to RAM 選項,此外還要調整一下工程屬性 Memory details 視窗裡 SRAM_DTC 的位置,不同於 led_blinky 模板工程預設用 SRAM_DTC 作主連結 RAM,這個 hello_world 模板工程預設是用外接 SDRAM 作為主連結 RAM,這個會涉及 SDRAM 初始化指令碼載入問題,我們先不考慮這個問題,直接將 RAM3 移動到 RAM 位置:

  改完後編譯工程,使用板載 DAP-Link 下載工程除錯,然後用串列埠除錯助手軟體開啟板載 DAP-Link 偵錯程式虛擬出的 mbed Serial Port,在 IDE 裡按 F8(Resume)鍵讓程式跑起來,這時候應該能看到 'hello world.' 的列印輸出。

二、i.MXRT1062 離線啟動

  目前為止,我們跑的兩個例程 led_blinky 和 hello_world 均是在 i.MXRT1062 內部 TCM 裡線上除錯,板子斷電後程式就丟失了。那麼如何去使能離線啟動呢?

  這裡就開始涉及 i.MXRT1062 啟動話題了,建議先通讀痞子衡舊文 《i.MXRT Boot簡介》。i.MXRT1062 內部並沒有非易失性程式碼儲存器,所以你會在 EVB_AIoT 子板上看到有兩顆華邦 W25Q64JVSIQ Flash,一顆連到了晶片 FlexSPI1 外設(管腳 GPIO_SD_B1[11:06],這並不是唯一的啟動連線 pinmux 選擇,詳見 《i.MXRT1060 FlexSPI NOR啟動連線方式大全》 ),另一顆連到了晶片 LPSPI3 外設(管腳 GPIO_AD_B0[3:0]),這兩顆 Flash 都可以用於儲存應用程式程式碼去啟動,只不過前一種連線方式能支援 XiP,後者不支援 XiP,一般情況下我們更多是用 FlexSPI 連線的 NOR Flash 去做離線啟動:

  i.MXRT1062 的啟動工作主要是由固化在晶片內部的 ROM bootloader 來實現的,因為 ROM bootloader 在設計時要求支援非常多種類的儲存器(串並行NOR/串並行NAND/SD卡/eMMC等)去啟動,所以其定義了一套啟動頭來輔助啟動,詳見 《i.MXRT Bootable image格式與載入》一文。

  對於連線在 FlexSPI 外設上的序列 NOR Flash,其至少需要三個啟動頭,包括 qspiflash_config、image_vector_table、boot_data,它們需要被燒寫到 Flash 中的固定偏移位置:0x0、0x1000、0x1020,這三個啟動頭已經在模板工程目錄 xip 資料夾裡的原始檔裡了。image_vector_table、boot_data 頭正常不需要改動,qspiflash_config 頭因連線的 Flash 而異:

三、MCUXpresso IDE下在Flash除錯

  要實現在 Flash 除錯,首先 IDE 要能把應用程式下載進 Flash,其次被下載的應用程式要能夠從 Flash 中正常啟動。前者需要一個合適的 Flash 下載演算法(請閱讀 《MCUXpresso IDE序列NOR Flash下載演算法》一文),後者需要正確的啟動頭以及晶片啟動模式設定(請閱讀 《MCUXpresso IDE下線上除錯時使用不同復位策略的現象總結》 一文)。

  板級設定方面只需要檢查下子板上的 J2 撥碼開關狀態是不是 1-off, 2-on,即主控晶片 BOOT_MODE[1:0] 為 2'b10 - 從 Flash 啟動模式,注意這個 J2 撥碼開關的設定僅 POR 復位有效。

  因為 EVB_AIoT 板上使用的這顆華邦 W25Q64JVSIQ 與恩智浦官方 MIMXRT1060-EVK 評估板上使用的芯成 IS25WP064AJBLE 特性類似,均是符合 JESD216A 標準的四線序列 NOR Flash,而且管腳連線也一致,所以它倆對於 i.MXRT 來說下載演算法和啟動頭是一樣的,我們不需要做任何改動,直接使用模板工程配置就行了。

  在 MCUXpresso IDE 工程裡去掉 Link application to RAM 選項,再檢查下 LinkServer flash driver 的設定,這個預設 MIMXRT1060_SFDP_QSPI.cfx 下載演算法直接可以用於下載除錯 EVB_AIoT 子板上的華邦 Flash。試試看你可以在 Flash 裡單步除錯這個 hello_world 例程的。

四、獨立燒錄工具

  除了在 MCUXpresso IDE 裡通過偵錯程式去下載程式進 Flash 啟動,恩智浦還提供了獨立的上位機工具來完成程式燒錄,這主要藉助了 i.MXRT1062 的 ROM bootloader 以及二級 Flashloader 設計,這個功能不是依靠 SWD 除錯口來下載程式,而是主控晶片上指定的 UART1(GPIO_AD_B0[13:12]) 或者 USB OTG1 口去下載。

  EVB_AIoT 母板上將 USB OTG1 訊號引到了 PCIe 接頭上,所以我們不方便用 USB 口去下載程式,只能用連到母板板載 DAP-Link 偵錯程式虛擬串列埠上的 UART1 去下載了(這也是第一小節跑通串列埠列印例程的用意,確認下串列埠沒問題)。

  使用獨立燒錄工具下載前,必須先將子板上的 J2 撥碼開關狀態設為 1-on, 2-off,即主控晶片 BOOT_MODE[1:0] 為 2'b01 - 序列下載模式,再次提醒這個 J2 撥碼開關的設定僅 POR 復位有效。下載完成後需要將 J2 切回到 1-off,2-on 看晶片啟動效果。

  獨立燒錄軟體均支援常見的應用程式映象檔案格式(.elf/.axf/.srec/.hex/.bin),你隨便用哪種格式都可以完成下載,非常方便。

4.1 MCUBootUtility

4.2 MCUXpresso Secure Provisioning Tool

  至此,i.MXRT1062 TencentOS Tiny EVB_AIoT開發板在Flash除錯與離線啟動痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

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

相關文章