加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1、環(huán)境 IDE 環(huán)境
    • 2、背景、知識介紹我們?yōu)槭裁葱枰螺d算法?下載算法是在哪里使用的?
    • 3、制作思想
    • 4、源碼說明上面已經(jīng)介紹了下載算法制作的一些基礎(chǔ)知識及制作思想,下面我們正式開始動手制作下載算法。
    • 5、效果展示我們制作好上訴四個文件過后,創(chuàng)建一個工程(該工程要運(yùn)行在 0x90000000 處),對這個工程進(jìn)行簡單配置。
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

手把手教你制作基于IAR、STM32H7的下載算法

2020/12/08
490
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

下載算法對于大部分工程師來說,只需要會使用即可,也不用過多去關(guān)心里面實現(xiàn)的方法。當(dāng)然,對于有時間的工程師來說,了解下載算法還是有一定好處的。
?

之前給大家分享過基于 Keil MDK 環(huán)境的下載算法制作,今天就來給大家分享一篇基于 IAR、STM32 的下載算法的制作。

1、環(huán)境 IDE 環(huán)境

IAR EWARM 8.32 單片機(jī):STM32H750VBT6 外部 Flash:W25Q64

2、背景、知識介紹我們?yōu)槭裁葱枰螺d算法?下載算法是在哪里使用的?

如上圖所示,我們想通過 C-SPY 將固件直接下載到 Flash 是不被允許的,那我們怎么才能實現(xiàn)將固件下載進(jìn) Flash 呢?

IAR 官方文檔《FlashLoaderGuide.ENU.pdf》告訴我們說,我們需要先將固件放在 RAM 緩存里面,然后通過一個名叫"Flash Loader"的小程序,將代碼不斷的從 RAM 搬運(yùn)到 Flash(這里的 Flash 可以是內(nèi)部 Flash,也是可以是外部 Flash)。

上文中提到的"Flash Loader"就是需要我們針對不同的硬件去分別實現(xiàn)的代碼,也就是所謂的 Flash 下載算法。

知識介紹:IAR 下載算法一共包括 4 個文件(.out 文件、.flash 文件、.board 文件、.mac 文件)。

1、.out 文件是由"Flash Loader"代碼生成的,里面包含了我們對 QPSI 管腳的定義,函數(shù) FlashInit()、函數(shù) FlashWrite()、函數(shù) FlashErase()的實現(xiàn)。

2、.flash 文件是一個 XML 文件,里面包含了一些必要的元素和一些不必要的元素,僅針對必要元素做一個簡單介紹

exe:指向 .out 文件

flash_base:Flash 的基礎(chǔ)地址

page:Flash 每頁的大小

block:對應(yīng) Flash 有多少個扇區(qū),每個扇區(qū)多大。(block 元素對應(yīng) Flash 的扇區(qū)還是塊,待考證)

3、.board 文件同樣也是一個 XML 文件??梢杂?pass> *** 進(jìn)行多個 .flash 文件設(shè)置。每個 pass 內(nèi)包含了兩個必要的屬性 range:表面了 Flash 的起始地址及結(jié)束地址 loader:當(dāng)前 pass 調(diào)用那個下載算法的路徑

4、IAR 每次仿真下載完程序是從當(dāng)前工程的 main 函數(shù)開始運(yùn)行的。如果我們將代碼下載到了 0x90000000 地址處,我們并沒有開啟內(nèi)存映射,是不可以仿真的。這時候就需要采樣 .mac 文件作為一個啟動腳本,當(dāng)程序仿真下載完成后,跳轉(zhuǎn)到 0x08000000 處開始運(yùn)行。在 0x08000000 處進(jìn)行內(nèi)存映射,然后馬上跳轉(zhuǎn)到 0x90000000 處,就可以進(jìn)行仿真了。

3、制作思想

下載"Flash Loader"開源代碼

創(chuàng)建一個空工程,將"Flash Loader"開源代碼里面的文件添加到工程

完成函數(shù) FlashInit()、函數(shù) FlashWrite()、函數(shù) FlashErase()。

生成 .out 文件

制作 .flash 文件

制作 .borad 文件

根據(jù)需要制作 .mac 文件

4、源碼說明上面已經(jīng)介紹了下載算法制作的一些基礎(chǔ)知識及制作思想,下面我們正式開始動手制作下載算法。

1、下載 FlashLoder 開源代碼。傳送門:https://files.iar.com/public/cmsis/
下載后的文件內(nèi)容如下圖所示:

“flash_loader.c”、“flash_loader.h”、“flash_loader_asm.s”、"flash_loader_extra.h"四個文件是供 C-SPY 調(diào)用的,我們不應(yīng)該去修改文件內(nèi)容。真正需要我們?nèi)バ薷牡膬?nèi)容是"template"文件夾下的"flash_loader_ram.c"文件。

2、為了方便,我找到 IAR 安裝路徑(“C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\arm\src\flashloader\ST”)下的"FlashSTM32H7xx_QSPI"文件夾,對這個文件內(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 文件由三個需要注意的地方 A. 我們需要將代碼下載到 RAM 里面執(zhí)行,IAR->Option->Linker->Config 配置如下:

B.IAR->Option->Linker->Output 配置的是輸出 .out 文件的內(nèi)容:

C. 當(dāng)前工程沒有 main 函數(shù),程序運(yùn)行的第一個函數(shù)將是 FlashInit 函數(shù),對 IAR->Option->Linker->Library 配置如下:

5、制作 .flash 文件,如下圖:

6、制作 .board 文件,如下圖:

7、對于 H750 內(nèi)存映射外部 Flash 還需要制作 .mac 文件,內(nèi)容如下:

文件內(nèi)容就很好理解了,下載完成后,pc 指針指向中斷向量表的 Reset_Handler 函數(shù),堆棧指針指向程序運(yùn)行的首地址。這樣每次程序仿真下載完成后,就從 0x08000000 處開始運(yùn)行。我們可以把 Boot 程序放在這個地址,Boot 程序里面進(jìn)行內(nèi)存映射,然后跳轉(zhuǎn)到 0x90000000 處。

5、效果展示我們制作好上訴四個文件過后,創(chuàng)建一個工程(該工程要運(yùn)行在 0x90000000 處),對這個工程進(jì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 下下載算法的制作與驗證就全部介紹完了。

參考資料:

FlashLoaderGuide.ENU.pdfEWARM_DebuggingGuide.ENU.pdfFlashLoader 源碼

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

作者黃工,從事嵌入式軟件開發(fā)工作8年有余,高級嵌入式軟件工程師,業(yè)余維護(hù)公眾號『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。