下載算法對(duì)于大部分工程師來說,只需要會(huì)使用即可,也不用過多去關(guān)心里面實(shí)現(xiàn)的方法。當(dāng)然,對(duì)于有時(shí)間的工程師來說,了解下載算法還是有一定好處的。
?
之前給大家分享過基于 Keil MDK 環(huán)境的下載算法制作,今天就來給大家分享一篇基于 IAR、STM32 的下載算法的制作。
1、環(huán)境 IDE 環(huán)境
IAR EWARM 8.32 單片機(jī):STM32H750VBT6 外部 Flash:W25Q64
2、背景、知識(shí)介紹我們?yōu)槭裁葱枰螺d算法?下載算法是在哪里使用的?
如上圖所示,我們想通過 C-SPY 將固件直接下載到 Flash 是不被允許的,那我們?cè)趺床拍軐?shí)現(xiàn)將固件下載進(jìn) Flash 呢?
IAR 官方文檔《FlashLoaderGuide.ENU.pdf》告訴我們說,我們需要先將固件放在 RAM 緩存里面,然后通過一個(gè)名叫"Flash Loader"的小程序,將代碼不斷的從 RAM 搬運(yùn)到 Flash(這里的 Flash 可以是內(nèi)部 Flash,也是可以是外部 Flash)。
上文中提到的"Flash Loader"就是需要我們針對(duì)不同的硬件去分別實(shí)現(xiàn)的代碼,也就是所謂的 Flash 下載算法。
知識(shí)介紹:IAR 下載算法一共包括 4 個(gè)文件(.out 文件、.flash 文件、.board 文件、.mac 文件)。
1、.out 文件是由"Flash Loader"代碼生成的,里面包含了我們對(duì) QPSI 管腳的定義,函數(shù) FlashInit()、函數(shù) FlashWrite()、函數(shù) FlashErase()的實(shí)現(xiàn)。
2、.flash 文件是一個(gè) XML 文件,里面包含了一些必要的元素和一些不必要的元素,僅針對(duì)必要元素做一個(gè)簡(jiǎn)單介紹
exe:指向 .out 文件
flash_base:Flash 的基礎(chǔ)地址
page:Flash 每頁的大小
block:對(duì)應(yīng) Flash 有多少個(gè)扇區(qū),每個(gè)扇區(qū)多大。(block 元素對(duì)應(yīng) Flash 的扇區(qū)還是塊,待考證)
3、.board 文件同樣也是一個(gè) XML 文件。可以由
4、IAR 每次仿真下載完程序是從當(dāng)前工程的 main 函數(shù)開始運(yùn)行的。如果我們將代碼下載到了 0x90000000 地址處,我們并沒有開啟內(nèi)存映射,是不可以仿真的。這時(shí)候就需要采樣 .mac 文件作為一個(gè)啟動(dòng)腳本,當(dāng)程序仿真下載完成后,跳轉(zhuǎn)到 0x08000000 處開始運(yùn)行。在 0x08000000 處進(jìn)行內(nèi)存映射,然后馬上跳轉(zhuǎn)到 0x90000000 處,就可以進(jìn)行仿真了。
3、制作思想
下載"Flash Loader"開源代碼
創(chuàng)建一個(gè)空工程,將"Flash Loader"開源代碼里面的文件添加到工程
完成函數(shù) FlashInit()、函數(shù) FlashWrite()、函數(shù) FlashErase()。
生成 .out 文件
制作 .flash 文件
制作 .borad 文件
根據(jù)需要制作 .mac 文件
4、源碼說明上面已經(jīng)介紹了下載算法制作的一些基礎(chǔ)知識(shí)及制作思想,下面我們正式開始動(dòng)手制作下載算法。
1、下載 FlashLoder 開源代碼。傳送門:https://files.iar.com/public/cmsis/
下載后的文件內(nèi)容如下圖所示:
“flash_loader.c”、“flash_loader.h”、“flash_loader_asm.s”、"flash_loader_extra.h"四個(gè)文件是供 C-SPY 調(diào)用的,我們不應(yīng)該去修改文件內(nèi)容。真正需要我們?nèi)バ薷牡膬?nèi)容是"template"文件夾下的"flash_loader_ram.c"文件。
2、為了方便,我找到 IAR 安裝路徑(“C:Program Files (x86)IAR SystemsEmbedded Workbench 8.3armsrcflashloaderST”)下的"FlashSTM32H7xx_QSPI"文件夾,對(duì)這個(gè)文件內(nèi)容進(jìn)行更改。我們將"FlashLoder"代碼添加進(jìn)去,并添加相應(yīng)的路徑。
(注:“flash_loader_ram.c"文件當(dāng)前工程下被改名為"FlashSTM32H7xx_QSPI.c”)。
3、補(bǔ)充函數(shù)內(nèi)容 A. 補(bǔ)充 FlashInit 函數(shù)內(nèi)容
B. 補(bǔ)充 FlashWrite 函數(shù)內(nèi)容
C. 補(bǔ)充 FlashErase 函數(shù)內(nèi)容
4、生成 .out 文件由三個(gè)需要注意的地方 A. 我們需要將代碼下載到 RAM 里面執(zhí)行,IAR->Option->Linker->Config 配置如下:
B.IAR->Option->Linker->Output 配置的是輸出 .out 文件的內(nèi)容:
C. 當(dāng)前工程沒有 main 函數(shù),程序運(yùn)行的第一個(gè)函數(shù)將是 FlashInit 函數(shù),對(duì) IAR->Option->Linker->Library 配置如下:
5、制作 .flash 文件,如下圖:
6、制作 .board 文件,如下圖:
7、對(duì)于 H750 內(nèi)存映射外部 Flash 還需要制作 .mac 文件,內(nèi)容如下:
文件內(nèi)容就很好理解了,下載完成后,pc 指針指向中斷向量表的 Reset_Handler 函數(shù),堆棧指針指向程序運(yùn)行的首地址。這樣每次程序仿真下載完成后,就從 0x08000000 處開始運(yùn)行。我們可以把 Boot 程序放在這個(gè)地址,Boot 程序里面進(jìn)行內(nèi)存映射,然后跳轉(zhuǎn)到 0x90000000 處。
5、效果展示我們制作好上訴四個(gè)文件過后,創(chuàng)建一個(gè)工程(該工程要運(yùn)行在 0x90000000 處),對(duì)這個(gè)工程進(jìn)行簡(jiǎn)單配置。
IAR->Option->Debugger->Download 下,配置如下:
IAR->Option->Debugger->Setup 下,配置如下:
IAR->Option->Linker->Edit 下,配置如下:
在代碼初始的地址,還需要加上中斷向量表地址 SCB->VTOR = 0x90000000;
做完上訴配置后,我們進(jìn)行仿真下載,如下圖所示,我們可以看到 main 函數(shù)已經(jīng)存在與 0x90003588 處,并且可以進(jìn)行仿真,說明我們配置是正確的。
將代碼全速運(yùn)行,可以看見串口顯示正式我們程序設(shè)置的輸出。
至此,關(guān)于 IAR 下下載算法的制作與驗(yàn)證就全部介紹完了。
參考資料:
FlashLoaderGuide.ENU.pdfEWARM_DebuggingGuide.ENU.pdfFlashLoader 源碼