大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家介紹的是Keil MDK工具下i.MXRT的串行NOR Flash下載演算法設計,
在i.MXRT硬體那些事系列之《在串行NOR Flash XIP除錯原理》一文中,痞子衡簡單提了一下串行NOR Flash下載演算法的概念,并沒有介紹具體設計細節,關于NOR Flash下載演算法每個IDE/工具都有自己的一套設計,雖然基本設計理念是一樣的,但是細節方面還是有區別,上一篇痞子衡介紹了《J-Link下演算法設計》,今天痞子衡就來細聊Keil MDK下的NOR Flash下載演算法:
一、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),
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的相關軟體支持包,
二、使用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寫了詳盡的檔案,但這種方式更適合芯片原廠去做):

搞定了合適的下載演算法檔案,最后還需要檢查下兩個地址范圍,一個是Flash對應的實際映射地址空間,另一個是下載演算法檔案運行RAM地址空間,這點跟上一篇介紹的J-Link演算法JLinkDevices.xml檔案里需要填的兩個地址空間設計是一致的,

三、NOR Flash下載演算法設計
Keil MDK下Flash下載演算法是開源的,有較詳細的檔案,檔案在arm-software的github主頁,根據這些檔案,我們基本可以了解其下載演算法設計細節,
- 演算法主頁: https://arm-software.github.io/CMSIS_5/Pack/html/flashAlgorithm.html
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組合呼叫流程:

- 演算法API詳解: https://arm-software.github.io/CMSIS_5/Pack/html/algorithmFunc.html
下一篇文章,痞子衡將帶大家繼續探究IAR EWARM下的下載演算法設計,讓我們把主流Cortex-M集成開發環境的演算法設計思路全部擼一遍,看看哪家更巧妙,
至此,Keil MDK工具下i.MXRT的串行NOR Flash下載演算法設計痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上,
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/179004.html
標籤:嵌入式
上一篇:痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬體那些事(2.4)- 串行NOR Flash下載演算法(Keil MDK工具篇)
下一篇:Linux服務器創建虛擬環境失敗
