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