大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是 MCUXpresso IDE 開發(fā)環(huán)境下 i.MXRT 的串行 NOR Flash 下載算法設計。
在 i.MXRT 硬件那些事系列之《在串行 NOR Flash XIP 調試原理》一文中,痞子衡簡單提了一下串行 NOR Flash 下載算法的概念,并沒有介紹具體設計細節(jié),關于 NOR Flash 下載算法每個 IDE 都有自己的一套設計,雖然基本設計理念是一樣的,但是細節(jié)方面還是有區(qū)別。在前面的文章里,痞子衡分別介紹過《J-Link 下算法設計》、《Keil MDK 下算法設計》、《IAR EWARM 下算法設計》,今天痞子衡就來細聊 MCUXpresso IDE 下的 NOR Flash 下載算法:
一、MCUXpresso IDE 各版本對 i.MXRT 的支持
MCUXpresso IDE 是飛思卡爾和恩智浦合并之后推出的全新 IDE,這個 IDE 是免費的,可用于新恩智浦全系列 ARM Cortex-M 控制器(Kinetis、LPC、JN、QN、i.MXRT 等)。熟悉這兩家公司的人應該知道,其實 MCUXpresso IDE 就是原恩智浦 LPCXpresso IDE 與原飛思卡爾 Kinetis Design Studio IDE 的合體。
從恩智浦官網上看,目前最新的 MCUXpresso IDE 版本是 v11.2.1,其能夠支持目前所有已量產的 i.MXRT 系列。從 MCUXpresso IDE 歷史各版本 Release Note 上看,我們可以看到其各版本對 i.MXRT 支持情況如下:
各版本下載地址:https://nxp.flexnetoperations.com/control/frse/product?child_plneID=756637&ver=ARC
MCUXpresso IDE 對新 MCU 型號的支持雖然并不是與自身版本嚴格綁定,但通過類似打 patch 的方式比較復雜,且官方不支持這么做,反正這個 IDE 是免費的,升級又不要錢,也不需要申請 license,最好還是通過安裝最新版本的方式來實現新型號的支持。
二、為當前 MCUXpresso IDE 增加新下載算法支持
痞子衡安裝的是最新的 v11.2.1,我們以為 RT600 這顆芯片新增 flash 下載算法為例介紹 MCUXpresso IDE 下的使用。在開始之前要特別強調一下 MCUXpresso IDE 與 MDK/IAR 非常不同的地方,MDK/IAR 自帶的 flash 下載算法是跟具體硬件仿真器無關的,它可以在所有支持的仿真器(JLink/DAPLink 等)下正常使用,但是 MCUXpresso IDE 自帶的 flash 下載算法只能在 CMSIS-DAP 類型的仿真器下使用。如果你在 MCUXPresso IDE 下使用 JLink,那么下載算法只能用 JLink 的算法。
現在我們隨便打開一個 i.MXRT600 SDK 工程,右擊工程進入 Properties 設置界面,在 MCU Settings 下可以看到 LinkServer Flash Driver 的設置界面,這里就是選擇 flash 下載算法。MCUXpresso IDE 默認自帶了非常多的 flash 下載算法(文件后綴名是 .cfx,其實就是可執(zhí)行文件 elf),即使是同一顆芯片 RT600,可以看到其有很多個 .cfg 可選,這分別對應了不同的 flash 種類以及與主芯片連接端口。
如果默認選擇的 Flash 下載算法文件不適用你的板子,那么你需要自己提供合適的算法文件(.cfx),并將其放入 MCUXpresso IDE 安裝目錄下(MCUXpressoIDE_11.2.1_4149idebinariesFlash),重新打開工程選項,新增的算法會自動刷新到待選算法列表:
?
三、NOR Flash 下載算法設計
MCUXpresso IDE 下 Flash 下載算法是公開的,MCUXpressoIDE_11.2.1_4149MCUXpresso_IDE_User_Guide.pdf 文檔的 LinkServer Flash Support 章節(jié)有一些使用方面的介紹,可以看一下。
3.1 下載算法模板工程
雖然下載算法本身是公開的,但設計文檔很少,只給了示例工程。但對于工程師來說,還有什么比給代碼來得更直接呢。
- 示例算法工程路徑:MCUXpressoIDE_11.2.1_4149ideExamplesFlashdriversNXPiMXRT
我們就以 iMXRT1050_QSPI.zip 示例包里代碼來分析其結構設計。這個示例包包含兩個工程(LPCXFlashDriverLib 和 iMXRT1050_QSPI),需要先編譯 LPCXFlashDriverLib 工程生成 libLPCXFlashDriverLib.a,這個庫是 iMXRT1050_QSPI 工程的源文件,然后編譯 iMXRT1050_QSPI 工程生成我們需要的算法文件 MIMXRT1050-EVK_IS25WP064A.cfx。
MCUXpresso IDE 下載算法這種兩級編譯的設計,與 IAR/MDK 下載算法結構完全不同,這么設計的主要原因是恩智浦 ARM Cortex-M 內核 MCU 產品線眾多,而 MCUXpresso IDE 需要支持所有 MCU,因此將公共設計的部分提取到了 LPCXFlashDriverLib 工程里(為了通用性,工程采用 CM0 指令集來編譯)。此外,從工程名你就能看出,還保留著上一代 LPCXpresso IDE 的基因。
LPCXFlashDriverLib 工程有很多 build,可以根據 ServiceMessages.c 文件里的條件編譯宏了解到它們的差異,其中 Release_SectorHashing 工程是默認選擇用于最終生成 .cfx 的,這個 build 主要是利用 32 bit Fowler/Noll/Vo FNV-1a 哈希算法對每個 Sector 的數據下載做了校驗。
再到 iMXRT1050_QSPI 工程,這個工程就是采用具體 MCU 的內核指令集(CM7)來編譯,在工程設置里可以看到鏈接了 LPCXFlashDriverLib 工程的 Release_SectorHashing 生成的 .a 文件,如果 LPCXFlashDriverLib 工程選擇了其他 build,這里也要相應改一下。
?
3.2 下載算法結構設計
算法本身設計算是幾個常用 IDE 里最復雜的一個了。iMXRT1050_QSPI 工程除了一般的 FlexSPI 驅動外,有兩個源文件 FlashDev.c 和 FlashPrg.c,對這文件名有沒有很熟悉?是的,這就是標準的 CMSIS 開源 flash 算法 API 定義,里面的內容也是類似的,這里就不贅述了,需要特別強調的是這些 Flash 擦寫 API 并不是 MCUXpresso IDE 在下載時實際調用入口。
算法最核心的設計在 LPCXFlashDriverLib 工程,先看 lpcx_flash_memdev.c 里內容,這個文件里定義了一個重要的常量結構體 MemoryDevice,這個 MemoryDevice 會被鏈接在算法執(zhí)行區(qū)域(前 64KB 的 DTCM)的起始位置(0x20000000),給 MCUXpresso IDE 調試器提供算法全部的信息。
//?MemoryDevice?Instance?(fill?it?in)
EXTERN_MEMORY_DEVICE
MemoryDeviceMsg_t?MemoryDevice?=
{
??MEM_FLASH_VER2_MAJ+0x0,???????//?Version?of?flash?interface
????????????????????????????????//?Magic?number?to?identify?flash?driver
????????????????????????????????//?interface
??{?0x01,?0x23,?0x45,?0x00,?0x00,?0x54,?0x32,?0x10?},
??(uint32_t)&__load_base,?????????//?Driver?load?address
??(uint32_t)&__image_size,????????//?Size?of?.text?and?.data
??(uint32_t)&__cache,?????????????//?RAM?buffer?location
??(uint32_t)&__cache_size,????????//?RAM?buffer?size
??(uint32_t)&__initial_sp,????????//?Stack?top
??(uint32_t)&__stack_size,????????//?Stack?size
??(uint32_t)&__opmap_val,?????????//?Bitmap?of?available?operations?-?0?=?everything?there
??&FlashDevice,???????????????????//?Flash?Device?configuration
??ServiceMessages,????????????????//?Service?mailbox?flash?operation?message
??0???????????????????????????????//?Reserved
};
MemoryDevice 有一個成員是 ServiceMessages()函數,這個函數可以說是算法最靈魂的部分了,它才是 MCUXpresso IDE 調試器調用 Flash 擦寫 API 的真正入口,調試器通過傳入 msg 參數(所謂 Mailbox 結構)讓算法來執(zhí)行具體 Flash 操作并得到執(zhí)行結果。這種特殊的設計可能也是 MCXPpresso IDE 算法僅能在 CMSIS-DAP 類型仿真器下使用的原因吧。
至此,MCUXpresso IDE 開發(fā)環(huán)境下 i.MXRT 的串行 NOR Flash 下載算法設計痞子衡便介紹完畢了,掌聲在哪里~~~