痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬體那些事(2.6)- 序列NOR Flash下載演算法(MCUXpresso IDE篇)
阿新 • • 發佈:2020-12-25
----
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**MCUXpresso IDE開發環境下i.MXRT的序列NOR Flash下載演算法設計**。
在i.MXRT硬體那些事系列之[《在序列NOR Flash XIP除錯原理》](https://www.cnblogs.com/henjay724/p/11791498.html)一文中,痞子衡簡單提了一下序列NOR Flash下載演算法的概念,並沒有介紹具體設計細節,關於NOR Flash下載演算法每個IDE都有自己的一套設計,雖然基本設計理念是一樣的,但是細節方面還是有區別。在前面的文章裡,痞子衡分別介紹過[《J-Link下演算法設計》](https://www.cnblogs.com/henjay724/p/13770137.html)、[《Keil MDK下演算法設計》](https://www.cnblogs.com/henjay724/p/13837050.html)、[《IAR EWARM下演算法設計》](https://www.cnblogs.com/henjay724/p/14142813.html),今天痞子衡就來細聊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](https://www.nxp.com.cn/docs/en/release-note/MCUXpresso-RN.pdf) 上看,我們可以看到其各版本對i.MXRT支援情況如下:
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_all_versions.PNG)
> 各版本下載地址: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,其實就是可執行檔案elf),即使是同一顆晶片RT600,可以看到其有很多個.cfg可選,這分別對應了不同的flash種類以及與主晶片連線埠。
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_debugger_settings.PNG)
如果預設選擇的Flash下載演算法檔案不適用你的板子,那麼你需要自己提供合適的演算法檔案(.cfx),並將其放入MCUXpresso IDE安裝目錄下(\MCUXpressoIDE_11.2.1_4149\ide\binaries\Flash),重新開啟工程選項,新增的演算法會自動重新整理到待選演算法列表:
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_cust_flash_algo_file.PNG)
### 三、NOR Flash下載演算法設計
MCUXpresso IDE下Flash下載演算法是公開的,\\MCUXpressoIDE_11.2.1_4149\MCUXpresso_IDE_User_Guide.pdf 文件的 **LinkServer Flash Support** 章節有一些使用方面的介紹,可以看一下。
#### 3.1 下載演算法模板工程
雖然下載演算法本身是公開的,但設計文件很少,只給了示例工程。但對於工程師來說,還有什麼比給程式碼來得更直接呢。
> * 示例演算法工程路徑:\MCUXpressoIDE_11.2.1_4149\ide\Examples\Flashdrivers\NXP\iMXRT
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_RT_temp_project.PNG)
我們就以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的資料下載做了校驗。
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_LPCXFlashDriver_Builds.PNG)
再到iMXRT1050_QSPI工程,這個工程就是採用具體MCU的核心指令集(CM7)來編譯,在工程設定裡可以看到連結了LPCXFlashDriverLib工程的Release_SectorHashing生成的.a檔案,如果LPCXFlashDriverLib工程選擇了其他build,這裡也要相應改一下。
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_QSPI_LibrarySettings.PNG)
#### 3.2 下載演算法結構設計
演算法本身設計算是幾個常用IDE裡最複雜的一個了。iMXRT1050_QSPI工程除了一般的FlexSPI驅動外,有兩個原始檔FlashDev.c和FlashPrg.c,對這檔名有沒有很熟悉?是的,這就是標準的CMSIS開源flash演算法API定義,裡面的內容也是類似的,這裡就不贅述了,需要特別強調的是這些Flash擦寫API並不是MCUXpresso IDE在下載時實際呼叫入口。
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_proj_file.png)
演算法最核心的設計在LPCXFlashDriverLib工程,先看lpcx_flash_memdev.c裡內容,這個檔案裡定義了一個重要的常量結構體MemoryDevice,這個MemoryDevice會被連結在演算法執行區域(前64KB的DTCM)的起始位置(0x20000000),給MCUXpresso IDE偵錯程式提供演算法全部的資訊。
```C
// 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結構)讓演算法來執行具體Flash操作並得到執行結果。這種特殊的設計可能也是MCXPpresso IDE演算法僅能在CMSIS-DAP型別模擬器下使用的原因吧。
![](http://henjay724.com/image/cnblogs/i.MXRT_HW_Flashloader_MCUX_ServiceMessages.PNG)
至此,MCUXpresso IDE開發環境下i.MXRT的序列NOR Flash下載演算法設計痞子衡便介紹完畢了,掌聲在哪裡~~~
### 歡迎訂閱
文章會同時釋出到我的 [部落格園主頁](https://www.cnblogs.com/henjay724/)、[CSDN主頁](https://blog.csdn.net/henjay724)、[知乎主頁](https://www.zhihu.com/people/henjay724)、[微信公眾號](http://weixin.sogou.com/weixin?type=1&query=痞子衡嵌入式) 平臺上。
微信搜尋"__痞子衡嵌入式__"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
![](http://henjay724.com/image/github/pzhMcu_qrcode_258x2