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


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是Keil MDK工具下i.MXRT的串行NOR Flash下載算法設計html

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

1、Keil MDK5對i.MXRT的支持

  Keil μVision能夠說是MCU開發者最熟悉的IDE了,大部分人剛開始入行嵌入式學MCS-51系列單片機應該都是用得Keil C51環境(Keil μVision2),早期的Keil還只是一個小型的獨立軟件公司。2005年ARM收購了Keil,並於2006年集成了RealView編譯器開始支持ARM Cortex-M處理器,這即是後來的Keil MDK(Keil μVision3)。github

  2013年Keil μVision5發佈,與Keil MDK4及以前版本不一樣,Keil MDK5分紅MDK Core和Software Packs兩部分。MDK Core主要包含uVision5 IDE集成開發環境和ARM Compiler5。Software Packs則能夠在不更換MDK Core的狀況下,單獨管理(下載、更新、移除)設備支持包和中間件更新包。算法

  所以首次安裝的Keil MDK5並無直接支持i.MXRT,須要經過Software Packs組件來單獨安裝i.MXRT的相關軟件支持包。api

2、使用Pack Installer添加新i.MXRT型號支持

  Keil MDK5裏默認集成了Pack Installer,在IDE裏能夠直接打開其界面,手動添加所需的MCU主控相關軟件包。軟件包主要有兩個:Device Family Pack (DFP)和Board Support Pack (BSP) ,前者是對MCU芯片自己的支持,後者是對MCU開發板的支持。微信

  若是你不主動安裝MCU軟件包也行,當你打開SDK裏的任何一個例程(以i.MXRT1060爲例),若是該例程對應的MCU軟件包沒有安裝,IDE會自動觸發Pack的安裝。DFP是必需要安裝的,BSP要看你具體使用哪塊板卡,痞子衡用得官方i.MXRT1060-EVK,所以還須要再手動安裝NXP::EVK-MIMXRT1060_BSP:函數

  安裝完MCU軟件包後,即可以正常編譯SDK工程,而後在Flash下載和調試了。痞子衡使用的是恩智浦官方EVK,板子上自帶了DAPLink調試器,固然除了板載調試器,咱們也能夠外接J-Link調試器,在MDK工程選項裏不管選擇哪一種調試器,其默認Flash下載算法是同樣的,都來自於DFP包(\Keil_Packs\NXP\MIMXRT1062_DFP\12.2.0\arm\MIMXRT106x_QSPI_4KB_SEC.FLM)工具

  若是默認選擇的Flash下載算法文件不適用你的板子,那麼你須要本身提供合適的算法文件(.FLM),並將其放入MDK安裝目錄下(\Keil_v5\ARM\Flash),從新打開工程選項,新增的算法會自動刷新到待選算法列表(還有另外一種添加方式,即作一個完整的DFP包,包裏包含下載算法,雖然ARM寫了詳盡的文檔,但這種方式更適合芯片原廠去作):ui

  搞定了合適的下載算法文件,最後還須要檢查下兩個地址範圍,一個是Flash對應的實際映射地址空間,另外一個是下載算法文件運行RAM地址空間。這點跟上一篇介紹的J-Link算法JLinkDevices.xml文件裏須要填的兩個地址空間設計是一致的。.net

3、NOR Flash下載算法設計

  Keil MDK下Flash下載算法是開源的,有較詳細的文檔,文檔在arm-software的github主頁,根據這些文檔,咱們基本能夠了解其下載算法設計細節。

3.1 下載算法模板工程

  Keil MDK提供了一個Flash下載算法的基礎模板工程,工程在\Keil_v5\ARM\Flash\_Template\NewDevice.uvprojx,該工程僅支持MDK(不支持MDK-Lite)編譯,除了工程設置外,該模板工程僅包含四個文件:

\Keil_v5\ARM\Flash\FlashOS.h
\Keil_v5\ARM\Flash\_Template\FlashDev.c
\Keil_v5\ARM\Flash\_Template\FlashPrg.c
\Keil_v5\ARM\Flash\_Template\Target.lin

  拿到基礎模板工程,咱們須要根據目標MCU內核類型在工程選項裏將默認的ARMCM0內核改掉,而後在FlashDev.c和FlashPrg.c裏將算法API函數所有實現(默認是空的),最後編譯工程生成.FLM便是咱們要的算法文件(最終.FLM實際上是經過After Build裏的腳本命令將.axf直接更名的,FLM文件本質上就是axf格式文件)。

3.2 下載算法結構設計

  算法自己結構其實很簡單,在FlashDev.c文件中有一個名爲FlashDevice的結構體常量,其原型定義在FlashOS.h中。該結構體主要給IDE提供必要的Flash信息,其值必須根據實際板卡狀況填寫正確。

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "New Device 256kB Flash",   // Device Name 
   ONCHIP,                     // Device Type
   0x00000000,                 // Device Start Address
   0x00040000,                 // Device Size in Bytes (256kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x002000, 0x000000,         // Sector Size  8kB (8 Sectors)
   0x010000, 0x010000,         // Sector Size 64kB (2 Sectors) 
   0x002000, 0x030000,         // Sector Size  8kB (8 Sectors)
   SECTOR_END
};

  除了FlashDevice以外,最核心固然是FlashPrg.c裏的7個API函數,這些API函數提供了實際的Flash擦寫驗功能,IDE會自動按需調用這些API去實如今線下載。這些API原型是固定的,但具體函數實現是因板卡而異的。

  關於算法工程還有一個不得不提的設計,那就是工程選項C/C++(包括Asm)下都勾選了Read-Only Position Independent 和 Read-Write Position Independent,代表下載算法自己不是使用固定地址連接,而是位置無關連接(也叫相對地址連接),算法代碼機器碼是能夠被放到任意地址去執行的,這也是爲何你能夠在例程選項裏去指定RAM for Algorithm。

3.3 下載算法API調用流程

  當在IDE裏啓動在線下載時,IDE會先將算法文件.FLM裏的可執行機器碼加載進指定的RAM空間,而後組合調用來實現最重要的Flash擦除和寫入,只要用戶App被正確寫入Flash,IDE就能正常讀取Flash裏代碼指令進行單步調試了。以下圖即是擦除和寫入操做的實際API組合調用流程:

  下一篇文章,痞子衡將帶你們繼續探究IAR EWARM下的下載算法設計,讓咱們把主流Cortex-M集成開發環境的算法設計思路所有擼一遍,看看哪家更巧妙。

  至此,Keil MDK工具下i.MXRT的串行NOR Flash下載算法設計痞子衡便介紹完畢了,掌聲在哪裏~~~

歡迎訂閱

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

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

相關文章
相關標籤/搜索