痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.6)- 串行NOR Flash下載算法(MCUXpresso IDE篇)


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是MCUXpresso IDE開發環境下i.MXRT的串行NOR Flash下載算法設計html

  在i.MXRT硬件那些事系列之《在串行NOR Flash XIP調試原理》一文中,痞子衡簡單提了一下串行NOR Flash下載算法的概念,並無介紹具體設計細節,關於NOR Flash下載算法每一個IDE都有本身的一套設計,雖然基本設計理念是同樣的,可是細節方面仍是有區別。在前面的文章裏,痞子衡分別介紹過《J-Link下算法設計》《Keil MDK下算法設計》《IAR EWARM下算法設計》,今天痞子衡就來細聊MCUXpresso IDE下的NOR Flash下載算法:算法

1、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支持狀況以下:ide

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

  MCUXpresso IDE對新MCU型號的支持雖然並非與自身版本嚴格綁定,但經過相似打patch的方式比較複雜,且官方不支持這麼作,反正這個IDE是免費的,升級又不要錢,也不須要申請license,最好仍是經過安裝最新版本的方式來實現新型號的支持。flex

2、爲當前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的算法。ui

  如今咱們隨便打開一個i.MXRT600 SDK工程,右擊工程進入Properties設置界面,在MCU Settings下能夠看到LinkServer Flash Driver的設置界面,這裏就是選擇flash下載算法。MCUXpresso IDE默認自帶了很是多的flash下載算法(文件後綴名是.cfx,其實就是可執行文件elf),即便是同一顆芯片RT600,能夠看到其有不少個.cfg可選,這分別對應了不一樣的flash種類以及與主芯片鏈接端口。.net

  若是默認選擇的Flash下載算法文件不適用你的板子,那麼你須要本身提供合適的算法文件(.cfx),並將其放入MCUXpresso IDE安裝目錄下(\MCUXpressoIDE_11.2.1_4149\ide\binaries\Flash),從新打開工程選項,新增的算法會自動刷新到待選算法列表:設計

3、NOR Flash下載算法設計

  MCUXpresso IDE下Flash下載算法是公開的,\MCUXpressoIDE_11.2.1_4149\MCUXpresso_IDE_User_Guide.pdf 文檔的 LinkServer Flash Support 章節有一些使用方面的介紹,能夠看一下。3d

3.1 下載算法模板工程

  雖然下載算法自己是公開的,但設計文檔不多,只給了示例工程。但對於工程師來講,還有什麼比給代碼來得更直接呢。

  • 示例算法工程路徑:\MCUXpressoIDE_11.2.1_4149\ide\Examples\Flashdrivers\NXP\iMXRT

  咱們就以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會被連接在算法執行區域(前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結構)讓算法來執行具體Flash操做並獲得執行結果。這種特殊的設計可能也是MCXPpresso IDE算法僅能在CMSIS-DAP類型仿真器下使用的緣由吧。

  至此,MCUXpresso IDE開發環境下i.MXRT的串行NOR Flash下載算法設計痞子衡便介紹完畢了,掌聲在哪裏~~~

歡迎訂閱

文章會同時發佈到個人 博客園主頁CSDN主頁知乎主頁微信公衆號 平臺上。

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

相關文章
相關標籤/搜索