大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是Keil MDK工具下i.MXRT的串行NOR Flash下載算法設(shè)計。
在i.MXRT硬件那些事系列之《在串行NOR Flash XIP調(diào)試原理》一文中,痞子衡簡單提了一下串行NOR Flash下載算法的概念,并沒有介紹具體設(shè)計細(xì)節(jié),關(guān)于NOR Flash下載算法每個IDE/工具都有自己的一套設(shè)計,雖然基本設(shè)計理念是一樣的,但是細(xì)節(jié)方面還是有區(qū)別。上一篇痞子衡介紹了《J-Link下算法設(shè)計》,今天痞子衡就來細(xì)聊Keil MDK下的NOR Flash下載算法:
一、Keil MDK5對i.MXRT的支持Keil μVision可以說是MCU開發(fā)者最熟悉的IDE了,大部分人剛開始入行嵌入式學(xué)MCS-51系列單片機應(yīng)該都是用得Keil C51環(huán)境(Keil μVision2),早期的Keil還只是一個小型的獨立軟件公司。2005年ARM收購了Keil,并于2006年集成了RealView編譯器開始支持ARM Cortex-M處理器,這便是后來的Keil MDK(Keil μVision3)。
2013年Keil μVision5發(fā)布,與Keil MDK4及之前版本不同,Keil MDK5分成MDK Core和Software Packs兩部分。MDK Core主要包含uVision5 IDE集成開發(fā)環(huán)境和ARM Compiler5。Software Packs則可以在不更換MDK Core的情況下,單獨管理(下載、更新、移除)設(shè)備支持包和中間件更新包。
因此首次安裝的Keil MDK5并沒有直接支持i.MXRT,需要通過Software Packs組件來單獨安裝i.MXRT的相關(guān)軟件支持包。
二、使用Pack Installer添加新i.MXRT型號支持Keil MDK5里默認(rèn)集成了Pack Installer,在IDE里可以直接打開其界面,手動添加所需的MCU主控相關(guān)軟件包。軟件包主要有兩個:Device Family Pack (DFP)和Board Support Pack (BSP) ,前者是對MCU芯片本身的支持,后者是對MCU開發(fā)板的支持。
如果你不主動安裝MCU軟件包也行,當(dāng)你打開SDK里的任何一個例程(以i.MXRT1060為例),如果該例程對應(yīng)的MCU軟件包沒有安裝,IDE會自動觸發(fā)Pack的安裝。DFP是必須要安裝的,BSP要看你具體使用哪塊板卡,痞子衡用得官方i.MXRT1060-EVK,因此還需要再手動安裝NXP::EVK-MIMXRT1060_BSP:
安裝完MCU軟件包后,便可以正常編譯SDK工程,然后在Flash下載和調(diào)試了。痞子衡使用的是恩智浦官方EVK,板子上自帶了DAPLink調(diào)試器,當(dāng)然除了板載調(diào)試器,我們也可以外接J-Link調(diào)試器,在MDK工程選項里無論選擇哪種調(diào)試器,其默認(rèn)Flash下載算法是一樣的,都來自于DFP包(\Keil_Packs\NXP\MIMXRT1062_DFP\12.2.0\arm\MIMXRT106x_QSPI_4KB_SEC.FLM)
如果默認(rèn)選擇的Flash下載算法文件不適用你的板子,那么你需要自己提供合適的算法文件(.FLM),并將其放入MDK安裝目錄下(\Keil_v5\ARM\Flash),重新打開工程選項,新增的算法會自動刷新到待選算法列表(還有另一種添加方式,即做一個完整的DFP包,包里包含下載算法,雖然ARM寫了詳盡的文檔,但這種方式更適合芯片原廠去做):
搞定了合適的下載算法文件,最后還需要檢查下兩個地址范圍,一個是Flash對應(yīng)的實際映射地址空間,另一個是下載算法文件運行RAM地址空間。這點跟上一篇介紹的J-Link算法JLinkDevices.xml文件里需要填的兩個地址空間設(shè)計是一致的。
三、NOR Flash下載算法設(shè)計Keil MDK下Flash下載算法是開源的,有較詳細(xì)的文檔,文檔在arm-software的github主頁,根據(jù)這些文檔,我們基本可以了解其下載算法設(shè)計細(xì)節(jié)。
3.1 下載算法模板工程Keil MDK提供了一個Flash下載算法的基礎(chǔ)模板工程,工程在\Keil_v5\ARM\Flash\_Template\NewDevice.uvprojx,該工程僅支持MDK(不支持MDK-Lite)編譯,除了工程設(shè)置外,該模板工程僅包含四個文件:
\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
拿到基礎(chǔ)模板工程,我們需要根據(jù)目標(biāo)MCU內(nèi)核類型在工程選項里將默認(rèn)的ARMCM0內(nèi)核改掉,然后在FlashDev.c和FlashPrg.c里將算法API函數(shù)全部實現(xiàn)(默認(rèn)是空的),最后編譯工程生成.FLM即是我們要的算法文件(最終.FLM其實是通過After Build里的腳本命令將.axf直接改名的,F(xiàn)LM文件本質(zhì)上就是axf格式文件)。
3.2 下載算法結(jié)構(gòu)設(shè)計算法本身結(jié)構(gòu)其實很簡單,在FlashDev.c文件中有一個名為FlashDevice的結(jié)構(gòu)體常量,其原型定義在FlashOS.h中。該結(jié)構(gòu)體主要給IDE提供必要的Flash信息,其值必須根據(jù)實際板卡情況填寫正確。
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之外,最核心當(dāng)然是FlashPrg.c里的7個API函數(shù),這些API函數(shù)提供了實際的Flash擦寫驗功能,IDE會自動按需調(diào)用這些API去實現(xiàn)在線下載。這些API原型是固定的,但具體函數(shù)實現(xiàn)是因板卡而異的。
關(guān)于算法工程還有一個不得不提的設(shè)計,那就是工程選項C/C++(包括Asm)下都勾選了Read-Only Position Independent 和 Read-Write Position Independent,表明下載算法本身不是使用固定地址鏈接,而是位置無關(guān)鏈接(也叫相對地址鏈接),算法代碼機器碼是可以被放到任意地址去執(zhí)行的,這也是為什么你可以在例程選項里去指定RAM for Algorithm。
3.3 下載算法API調(diào)用流程當(dāng)在IDE里啟動在線下載時,IDE會先將算法文件.FLM里的可執(zhí)行機器碼加載進指定的RAM空間,然后組合調(diào)用來實現(xiàn)最重要的Flash擦除和寫入,只要用戶App被正確寫入Flash,IDE就能正常讀取Flash里代碼指令進行單步調(diào)試了。如下圖便是擦除和寫入操作的實際API組合調(diào)用流程:
責(zé)任編輯:haq
-
mcu
+關(guān)注
關(guān)注
146文章
16922瀏覽量
349995 -
FlaSh
+關(guān)注
關(guān)注
10文章
1614瀏覽量
147667 -
keil
+關(guān)注
關(guān)注
68文章
1210瀏覽量
166602
發(fā)布評論請先 登錄
相關(guān)推薦
評論