加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、MCUXpresso IDE 各版本對(duì) i.MXRT 的支持
    • 二、為當(dāng)前 MCUXpresso IDE 增加新下載算法支持
    • 三、NOR Flash 下載算法設(shè)計(jì)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

鮮為人知的MCUXpresso IDE下載算法設(shè)計(jì)

2020/12/30
580
閱讀需 14 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 MCUXpresso IDE 開(kāi)發(fā)環(huán)境下 i.MXRT 的串行 NOR Flash 下載算法設(shè)計(jì)。

在 i.MXRT 硬件那些事系列之《在串行 NOR Flash XIP 調(diào)試原理》一文中,痞子衡簡(jiǎn)單提了一下串行 NOR Flash 下載算法的概念,并沒(méi)有介紹具體設(shè)計(jì)細(xì)節(jié),關(guān)于 NOR Flash 下載算法每個(gè) IDE 都有自己的一套設(shè)計(jì),雖然基本設(shè)計(jì)理念是一樣的,但是細(xì)節(jié)方面還是有區(qū)別。在前面的文章里,痞子衡分別介紹過(guò)《J-Link 下算法設(shè)計(jì)》、《Keil MDK 下算法設(shè)計(jì)》、《IAR EWARM 下算法設(shè)計(jì)》,今天痞子衡就來(lái)細(xì)聊 MCUXpresso IDE 下的 NOR Flash 下載算法:

一、MCUXpresso IDE 各版本對(duì) i.MXRT 的支持

MCUXpresso IDE 是飛思卡爾和恩智浦合并之后推出的全新 IDE,這個(gè) IDE 是免費(fèi)的,可用于新恩智浦全系列 ARM Cortex-M 控制器(Kinetis、LPC、JN、QN、i.MXRT 等)。熟悉這兩家公司的人應(yīng)該知道,其實(shí) MCUXpresso IDE 就是原恩智浦 LPCXpresso IDE 與原飛思卡爾 Kinetis Design Studio IDE 的合體。

從恩智浦官網(wǎng)上看,目前最新的 MCUXpresso IDE 版本是 v11.2.1,其能夠支持目前所有已量產(chǎn)的 i.MXRT 系列。從 MCUXpresso IDE 歷史各版本 Release Note 上看,我們可以看到其各版本對(duì) i.MXRT 支持情況如下:

各版本下載地址:https://nxp.flexnetoperations.com/control/frse/product?child_plneID=756637&ver=ARC

MCUXpresso IDE 對(duì)新 MCU 型號(hào)的支持雖然并不是與自身版本嚴(yán)格綁定,但通過(guò)類(lèi)似打 patch 的方式比較復(fù)雜,且官方不支持這么做,反正這個(gè) IDE 是免費(fèi)的,升級(jí)又不要錢(qián),也不需要申請(qǐng) license,最好還是通過(guò)安裝最新版本的方式來(lái)實(shí)現(xiàn)新型號(hào)的支持。

二、為當(dāng)前 MCUXpresso IDE 增加新下載算法支持

痞子衡安裝的是最新的 v11.2.1,我們以為 RT600 這顆芯片新增 flash 下載算法為例介紹 MCUXpresso IDE 下的使用。在開(kāi)始之前要特別強(qiáng)調(diào)一下 MCUXpresso IDE 與 MDK/IAR 非常不同的地方,MDK/IAR 自帶的 flash 下載算法是跟具體硬件仿真器無(wú)關(guān)的,它可以在所有支持的仿真器(JLink/DAPLink 等)下正常使用,但是 MCUXpresso IDE 自帶的 flash 下載算法只能在 CMSIS-DAP 類(lèi)型的仿真器下使用。如果你在 MCUXPresso IDE 下使用 JLink,那么下載算法只能用 JLink 的算法。

現(xiàn)在我們隨便打開(kāi)一個(gè) i.MXRT600 SDK 工程,右擊工程進(jìn)入 Properties 設(shè)置界面,在 MCU Settings 下可以看到 LinkServer Flash Driver 的設(shè)置界面,這里就是選擇 flash 下載算法。MCUXpresso IDE 默認(rèn)自帶了非常多的 flash 下載算法(文件后綴名是 .cfx,其實(shí)就是可執(zhí)行文件 elf),即使是同一顆芯片 RT600,可以看到其有很多個(gè) .cfg 可選,這分別對(duì)應(yīng)了不同的 flash 種類(lèi)以及與主芯片連接端口。

如果默認(rèn)選擇的 Flash 下載算法文件不適用你的板子,那么你需要自己提供合適的算法文件(.cfx),并將其放入 MCUXpresso IDE 安裝目錄下(MCUXpressoIDE_11.2.1_4149idebinariesFlash),重新打開(kāi)工程選項(xiàng),新增的算法會(huì)自動(dòng)刷新到待選算法列表:

?

三、NOR Flash 下載算法設(shè)計(jì)

MCUXpresso IDE 下 Flash 下載算法是公開(kāi)的,MCUXpressoIDE_11.2.1_4149MCUXpresso_IDE_User_Guide.pdf 文檔的 LinkServer Flash Support 章節(jié)有一些使用方面的介紹,可以看一下。

3.1 下載算法模板工程

雖然下載算法本身是公開(kāi)的,但設(shè)計(jì)文檔很少,只給了示例工程。但對(duì)于工程師來(lái)說(shuō),還有什么比給代碼來(lái)得更直接呢。

  • 示例算法工程路徑:MCUXpressoIDE_11.2.1_4149ideExamplesFlashdriversNXPiMXRT

我們就以 iMXRT1050_QSPI.zip 示例包里代碼來(lái)分析其結(jié)構(gòu)設(shè)計(jì)。這個(gè)示例包包含兩個(gè)工程(LPCXFlashDriverLib 和 iMXRT1050_QSPI),需要先編譯 LPCXFlashDriverLib 工程生成 libLPCXFlashDriverLib.a,這個(gè)庫(kù)是 iMXRT1050_QSPI 工程的源文件,然后編譯 iMXRT1050_QSPI 工程生成我們需要的算法文件 MIMXRT1050-EVK_IS25WP064A.cfx。

MCUXpresso IDE 下載算法這種兩級(jí)編譯的設(shè)計(jì),與 IAR/MDK 下載算法結(jié)構(gòu)完全不同,這么設(shè)計(jì)的主要原因是恩智浦 ARM Cortex-M 內(nèi)核 MCU 產(chǎn)品線眾多,而 MCUXpresso IDE 需要支持所有 MCU,因此將公共設(shè)計(jì)的部分提取到了 LPCXFlashDriverLib 工程里(為了通用性,工程采用 CM0 指令集來(lái)編譯)。此外,從工程名你就能看出,還保留著上一代 LPCXpresso IDE 的基因。

LPCXFlashDriverLib 工程有很多 build,可以根據(jù) ServiceMessages.c 文件里的條件編譯宏了解到它們的差異,其中 Release_SectorHashing 工程是默認(rèn)選擇用于最終生成 .cfx 的,這個(gè) build 主要是利用 32 bit Fowler/Noll/Vo FNV-1a 哈希算法對(duì)每個(gè) Sector 的數(shù)據(jù)下載做了校驗(yàn)。

再到 iMXRT1050_QSPI 工程,這個(gè)工程就是采用具體 MCU 的內(nèi)核指令集(CM7)來(lái)編譯,在工程設(shè)置里可以看到鏈接了 LPCXFlashDriverLib 工程的 Release_SectorHashing 生成的 .a 文件,如果 LPCXFlashDriverLib 工程選擇了其他 build,這里也要相應(yīng)改一下。

?

3.2 下載算法結(jié)構(gòu)設(shè)計(jì)

算法本身設(shè)計(jì)算是幾個(gè)常用 IDE 里最復(fù)雜的一個(gè)了。iMXRT1050_QSPI 工程除了一般的 FlexSPI 驅(qū)動(dòng)外,有兩個(gè)源文件 FlashDev.c 和 FlashPrg.c,對(duì)這文件名有沒(méi)有很熟悉?是的,這就是標(biāo)準(zhǔn)的 CMSIS 開(kāi)源 flash 算法 API 定義,里面的內(nèi)容也是類(lèi)似的,這里就不贅述了,需要特別強(qiáng)調(diào)的是這些 Flash 擦寫(xiě) API 并不是 MCUXpresso IDE 在下載時(shí)實(shí)際調(diào)用入口。

算法最核心的設(shè)計(jì)在 LPCXFlashDriverLib 工程,先看 lpcx_flash_memdev.c 里內(nèi)容,這個(gè)文件里定義了一個(gè)重要的常量結(jié)構(gòu)體 MemoryDevice,這個(gè) MemoryDevice 會(huì)被鏈接在算法執(zhí)行區(qū)域(前 64KB 的 DTCM)的起始位置(0x20000000),給 MCUXpresso IDE 調(diào)試器提供算法全部的信息。

//?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 有一個(gè)成員是 ServiceMessages()函數(shù),這個(gè)函數(shù)可以說(shuō)是算法最靈魂的部分了,它才是 MCUXpresso IDE 調(diào)試器調(diào)用 Flash 擦寫(xiě) API 的真正入口,調(diào)試器通過(guò)傳入 msg 參數(shù)(所謂 Mailbox 結(jié)構(gòu))讓算法來(lái)執(zhí)行具體 Flash 操作并得到執(zhí)行結(jié)果。這種特殊的設(shè)計(jì)可能也是 MCXPpresso IDE 算法僅能在 CMSIS-DAP 類(lèi)型仿真器下使用的原因吧。

至此,MCUXpresso IDE 開(kāi)發(fā)環(huán)境下 i.MXRT 的串行 NOR Flash 下載算法設(shè)計(jì)痞子衡便介紹完畢了,掌聲在哪里~~~

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門(mén),擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會(huì)定期分享嵌入式相關(guān)文章