国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記)

這篇具有很好參考價值的文章主要介紹了Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

IAP下載

IAP的引入

不同的程序下載方式

ICP

ICP(In Circuit Programing)。在電路編程,可通過 CPU 的 Debug Access Port 燒錄代碼,比如 ARM Cortex 的 Debug Interface 主要是 SWD(Serial Wire Debug) 或 JTAG(Joint Test Action Group);

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

ISP

ISP(In System Programing)。在系統(tǒng)編程,可借助 MCU 廠商預(yù)置的 Bootloader 實現(xiàn)通過板載 UART 或 USB 接口燒錄代碼,比如 STM32 存儲映射Code 分區(qū)中的 System memory 可以預(yù)置廠商的 Bootloader,讓 MCU 支持通過 UART 下載(不限于 UART,具體由廠商預(yù)置 Bootloader 實現(xiàn)而定);

寫入器將 code 燒入,不過,芯片可以在目標(biāo)板上,不用取出來,在設(shè)計目標(biāo)板的時候就將接口設(shè)計在上面,所以叫"在系統(tǒng)編程",即不用脫離系統(tǒng);

STM32 在出廠時由ST 在這個存儲區(qū)間內(nèi)部預(yù)置了一段 BootLoader(也即ISP 程序),這段程序出廠后無法修改。廠家提供的 BootLoader 一般支持UART 協(xié)議,可以讓我們直接通過串口將程序代碼燒錄到 Main Flash memory 中;

下載軟件
  • 常見的串口下載軟件有 FlyMcu 或 MCUISP

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

STM32 的 ISP 下載電路
  • 通過串口的DTR和RTS信號來自動配置BOOT0和RESET信號,不需要用戶手動切換它們的狀態(tài),直接串口軟件自動控制,可以方便的下載代碼。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

STM32 中的 ISP 下載介紹

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

  • 以ISP方式下載程序時需要把STM32的BOOT0引腳置1、BOOT1引腳置0,即從系統(tǒng)存儲區(qū)(System Memory)啟動。
  • 為什么設(shè)置從System Memory啟動就可以使用串口來下載我們的程序呢?那是因為在芯片出廠前ST官方已經(jīng)把一段自舉程序(BootLoader程序)固化到這一塊存儲區(qū)。
  • 對于STM32F103VET6來說,System Memory的起始地址為0x1FFFF000,可在芯片手冊的內(nèi)存映射圖里找到:
    • Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機
  • 其通過串口來接收數(shù)據(jù)并燒寫到用戶閃存存儲器的起始地址(0x08000000)。只能燒寫到這個地址,若keil里設(shè)置的地址不是這個地址,則編譯出來的文件將燒錄不成功。(用戶閃存,即User Flash,同時也稱為Main Flash)。
  • 這一段BootLoader程序源碼是沒有開源出來的,用戶是不可修改的。我們在上一篇筆記的IAP實驗中,IAP程序通過FlyMCU軟件進行燒錄,燒錄的地址就是0x08000000。
  • 注意:不同系列不同型號的STM32固化的BootLoader是不同的,即使用的通訊接口是不同的。如STM32F1xxx系列只支持USART1:
    • Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機
  • STM32F4xxx系列只支持USART1、USART3、CAN2等接口:
    • Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機
  • STM32其他型號的BootLoader支持的接口可查看AN2606文檔
STM32 的 ISP 下載

CH340G上電后DTR#和RTS#都為高電平,在用MCUISP燒寫軟件時,我們在軟件下方選擇“DTR的低電平復(fù)位,RTS高電平進BootLoader”,CH340G IC在實際操作時引腳的變化為“DTR#拉高,RTS#拉低”,即軟件設(shè)置和實際情況是取非的,相反的。

? 首先,F(xiàn)lyMcu軟件控制DTR輸出低電平,則DTR#引腳輸出高, 然后RTS置高,則RTS#引腳輸出低,這樣Q3導(dǎo)通了,BOOT0被拉高,即實現(xiàn)設(shè)置BOOT0為1,同時Q2也會導(dǎo)通,STM32的復(fù)位腳被拉低,實現(xiàn)復(fù)位。

? 然后,延時100ms后,F(xiàn)lyMcu軟件控制DTR為高電平,則DTR#引腳輸出低電平,RTS維持高電平,則RTS#引腳繼續(xù)為低電平,此時STM32的復(fù)位引腳,由于Q2不再導(dǎo)通,變?yōu)楦唠娖?,STM32結(jié)束復(fù)位,但是BOOT0還是維持為1,從而進入ISP模式,接著mcuisp就可以開始連接STM32,下載代碼了,從而實現(xiàn)一鍵下載。

DTR#和RTS#信號的時序圖如下圖所示:

程序下載完畢后,如果設(shè)置了編程后執(zhí)行,STM32會再次被復(fù)位,此時DTR#引腳為高,RTS#引腳為低,STM32復(fù)位后,DTR#引腳設(shè)置為低,RTS#引腳設(shè)置為高,那么Q2和Q3都不導(dǎo)通,此時,STM32重新開始啟動后,檢測到BOOT0為0,程序開始正常運行,一鍵下載至此就完成了。

IAP

IAP(In Applicating Programing)。在應(yīng)用編程,由開發(fā)者實現(xiàn) Bootloader 功能,比如 STM32 存儲映射 Code 分區(qū)中的 Flash 本是存儲用戶應(yīng)用程序的區(qū)間(上電從此處執(zhí)行用戶代碼),開發(fā)者可以將自己實現(xiàn)的 Bootloader 存放到 Flash 區(qū)間,MCU 上電啟動先執(zhí)行用戶的 Bootloader 代碼,該代碼可為用戶應(yīng)用程序的下載、校驗、增量/補丁更新、升級、恢復(fù)等提供支持,如果用戶代碼提供了網(wǎng)絡(luò)訪問功能,IAP 還能通過無線網(wǎng)絡(luò)下載更新代碼,實現(xiàn) OTA 空中升級功能。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

IAP介紹補充

一片 STM32 芯片的 Code (代碼)區(qū)內(nèi)一般只有一個用戶程序。而 IAP 方案則是將代碼區(qū)劃分為兩部分,兩部分區(qū)域各存放一個程序,一個叫 bootloader (引導(dǎo)加載程序),另一個較 user application (用戶應(yīng)用程序)(之后簡稱 APP)

bootloader 在出廠時就固定下來了,在需要變更 APP 時只需要通過觸發(fā)bootloader 對 APP 的擦除和重新寫入即可完成用戶應(yīng)用的更換

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

在程序執(zhí)行初始進入 bootloader,在 bootloader 里面檢測條件是否被觸發(fā)(可通過按鍵是否被按下、串口是否接收到特定的數(shù)據(jù)、U盤是否插入等等),如果有則進行對APP 進行擦除和重新寫入操作,如果沒有則直接跳轉(zhuǎn)到 APP 執(zhí)行應(yīng)用;如果有則進行擦除用戶代碼并重新寫入新的用戶代碼。

IAP 特點
  • 支持任意一種通信接口(I/O端口、USB、CAN、UART、I2C、SPI等)。
  • 需要犧牲一部分用戶代碼空間。
  • 可以無需下載線

IAP方案設(shè)計

簡析

IAP 技術(shù)的核心在于 BootLoader 程序的設(shè)計,這段程序預(yù)先燒錄在單片機中,正常的 APP 程序可以使用 BootLoader 程序中的 IAP 功能寫入,也可以兩部分代碼一起寫入,以后需要程序更新時通過 IAP 進行代碼更新。每次板卡上電都會首先執(zhí)行 BootLoader 程序,在程序內(nèi)判斷進行固件升級還是跳轉(zhuǎn)到正常的 APP 程序。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

是否進行固件升級的判斷可以從硬件和軟件兩個方面進行考慮。

  1. 硬件實現(xiàn):
    • 實現(xiàn):通過撥碼開關(guān)、跳線帽等方式設(shè)定單片機某一引腳電平狀態(tài),程序通過讀取引腳電平判斷是否需要升級。
    • 優(yōu)缺點:此種方式需要接觸板卡進行操作,當(dāng)板卡被封閉在外殼中或安裝于不便于操作位置時很難實現(xiàn)。
  2. 軟件實現(xiàn)-1:
    • 實現(xiàn):軟件內(nèi)設(shè)定一標(biāo)志位(變量),通過判斷標(biāo)志位狀態(tài)判斷是否需要升級。該標(biāo)志位狀態(tài)掉電不能改變,故需要存儲在外部 EEPROM 或單片機內(nèi)部 FLASH 中。
    • 優(yōu)缺點:
      • 若存儲在外部 EEPROM,則需要增加額外的電路;
      • 若存儲在單片機內(nèi)部 FLASH,由于 FLASH 每次寫入都需要擦除一整頁,會造成資源浪費。
  3. 軟件實現(xiàn)-2:
    • 實現(xiàn):
      • 單片機每次上電首先進入 BootLoader 程序,在 BootLoader 中等待一定時間。
      • 若上位機軟件在該時間段內(nèi)發(fā)起通訊,則停留在 BootLoader 程序中等待固件升級;若該時間段內(nèi)無通訊,則跳轉(zhuǎn)到正常的 APP 程序。
    • 優(yōu)缺點:該方式每次上電都要等待一定時間,需要考慮是否可以接受。
  4. 軟件實現(xiàn)-3
    • 實現(xiàn):在 APP 內(nèi) 輪詢 或 中斷 外部升級信號,一旦信號來臨,則跳轉(zhuǎn) BootLoader 程序升級。
    • 優(yōu)缺點:增加 APP程序 代碼量(但可以減少 BootLoder 代碼量),并使 APP 與 BootLoader 之間的耦合增加。
  5. ……

在 IAP 過程中,單片機通過特定的通訊方式從上位機軟件接收程序數(shù)據(jù),并執(zhí)行 FLASH 擦寫操作對 APP 部分的程序進行更新。

對于 STM32 的 IAP 設(shè)計研究

不同型號STM32 FLASH大小

STM32 的 flash 啟動方式起始地址是 0x 0800 0000 ,根據(jù)不同的 STM32 單片機型號,有不同的 flash size 。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

對于不同容量的STM32F1系列產(chǎn)品,其FLASH頁大小是不同的,具體的容量劃分規(guī)則如下:

  • 小容量產(chǎn)品:FLASH容量在16K至32K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
  • 中容量產(chǎn)品:FLASH容量在64K至128K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
  • 大容量產(chǎn)品:FLASH容量在256K至512K字 節(jié)之間的STM32F101xx和STM32F103xx微控制器。

對于小容量和中容量的產(chǎn)品,其頁大小為1K,對于大容量產(chǎn)品,其頁大小為2K。

在進行FLASH空間劃分時,必須知道編寫的程序占用FLASH空間大小。用MDK軟件進行工程編譯之后會生成一個.map文件,在該文件末尾可找到程序需要占用的FLASH空間。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

查看程序占用空間大小

打開 .map 文件

在進行 FLASH 空間劃分時,必須知道編寫的程序占用 FLASH 空間大小。用 MDK 軟件進行工程編譯之后會生成一個 .map 文件,在該文件末尾可找到程序需要占用的 FLASH 空間。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

對于 cubemx 生成的 keil 工程

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

因為 cubemx 生成的 map 文件不在工程 主目錄 下,若要直接在 keil 軟件中打開,可以修改 map 文件生成的位置。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

改完后再編譯一下,就可以在直接在 keil 軟件中打開map文件啦!

具體map文件內(nèi)容分析

.map 文件分析

在實際設(shè)計過程中,主要是確定 BootLoader 程序占用空間,便于確定 APP 程序的起始地址。

在這時候可以先編寫部分 BootLoader 程序,再通過 map 文件查看當(dāng)前占用空間,從而預(yù)估 BootLoader 程序最終會占用的空間大小。

在實際空間分配過程中,可以稍微大一點,以便于后續(xù)對 BootLoader 的功能擴展。

如果對MDK的編譯過程以及文件類型感興趣,可以閱讀《[野火EmbedFire]《STM32庫開發(fā)實戰(zhàn)指南——基于野火霸道開發(fā)板》—20211109》第46章的內(nèi)容。

視頻鏈接:視頻鏈接

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

這個程序 flash 占用 6.95kB

分析并設(shè)置程序 flash 地址與大小

BootLoader 方面

在MDK軟件配置項中,可以對程序的起始位置以及大小進行設(shè)置。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

編寫完,BootLoader 程序編譯后,從 .map 文件獲取 BootLoader 程序大小,就可以分配 BoorLoader 存儲大小啦。

  • 這里獲取的是 6.95kB ,起始位置為 0x08000000 不變,芯片是 c8t6 屬于中容量,一頁是1kB。c8t6 有 64kB ,所以有64頁。

  • 7頁 > 6.95kB > 6頁,分配給他7頁即可。7頁是7kB,7*1024 = 7168 = 0x1C00。這個size可以填寫 0x1C00 以上大?。ㄗ钚挝皇?1頁 )。

APP 方面

由于分配給 BootLoader 一部分的大小,所以 APP 在 flash 的起始地址會往后偏移,APP 所擁有的 flash 的空間大小也會減少。

  • APP 的偏移量就是 flash 的起始地址加上 BootLoader 的大小。

  • APP 的大小就是芯片 flash 的大小減去 BootLoader 的大小

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

設(shè)置中斷向量表的偏移量:
  1. 方法一:在主函數(shù)起始位置添加:

    SCB->VTOR = FLASH_BASE | 0x1C00; // 0x1C00 即 BootLoader 大?。ㄆ屏浚?/span>
    
  2. 方法二:

    • 第一步:打開 system_stm32f1xx.c ( f1 系列 STM32 是這個文件)
    • 第二步:找到 USER_VECT_TAB_ADDRESS 宏,解除注釋
    • 第三步:找到 VECT_TAB_OFFSET 宏,設(shè)置值為 Bootloaber 的大小
    • Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

對于方法二只是把方法一的代碼,在啟動代碼調(diào)用 SystemInit 函數(shù)時做了。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

為什么要有這個偏移呢

對于 STM32F103C8T6 的啟動方式有三種:內(nèi)置FLASH啟動、內(nèi)置SRAM啟動、系統(tǒng)存儲器ROM啟動,通過 BOOT0 和 BOOT1 引腳的設(shè)置可以選擇從哪中方式啟動,這里選擇內(nèi)置的 FLASH 啟動。其 FLASH 的地址為 0x0800 0000 — 0x0801 FFFF ,共128KB,這些都能從芯片數(shù)據(jù)手冊中直接得到。而這里首要的一個問題是中斷的問題。正常情況下發(fā)生中斷的過程為:發(fā)生中斷(中斷請求)到中斷向量表查找中斷函數(shù)入口地址跳轉(zhuǎn)到中斷函數(shù)執(zhí)行中斷函數(shù)中斷返回。也就是說在 STM32 的內(nèi)置的 Flash 中有一個中斷向量表來存放各個中斷服務(wù)函數(shù)的入口地址,內(nèi)置 Flash 的分配情況大致如下圖:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

在只有一個程序的情況下,程序執(zhí)行的走向應(yīng)該如圖所示:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

  • 代碼開始的 4 個字節(jié)存放的是堆棧棧頂?shù)牡刂罚?/li>
  • STM32F10x 有一個中斷向量表:
    • 這個中斷向量表存放在代碼開始部分的后 4 個字節(jié)處(即 0x0800 0004 )
    • 當(dāng)發(fā)生中斷后程序通過查找該表得到相應(yīng)的中斷服務(wù)程序入口地址,然后再跳到相應(yīng)的中斷服務(wù)程序中執(zhí)行。

圖像分析:

  • 復(fù)位中斷 到 main 函數(shù):
    1. 上電后從 0x08000004 處取出復(fù)位中斷向量的地址,
    2. 然后跳轉(zhuǎn)到復(fù)位中斷程序的入口(標(biāo)號①所示),
    3. 執(zhí)行結(jié)束后跳轉(zhuǎn)到 main 函數(shù)中(標(biāo)號②所示)。
  • 中斷時:在執(zhí)行 main 函數(shù)的過程中發(fā)生中斷,
    1. 則 STM32 強制將 PC 指針指回中斷向量表處(標(biāo)號③所示),從中斷向量表中找到相應(yīng)的中斷函數(shù)入口地址,
    2. 跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)函數(shù)(標(biāo)號④所示),
    3. 執(zhí)行完中斷函數(shù)后再返回到 main 函數(shù)中來(標(biāo)號⑤所示)。

若在 STM32F103x 中使用 IAP 方案,則內(nèi)置的 Flash 分配情況大致如下圖:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

在內(nèi)置的 Flash 里面添加一個 BootLoader 程序,BootLoader 程序和 APP 各有一個中斷向量表,假設(shè) BootLoader 程序占用的空間為 N+M 字節(jié),

則程序的走向如下圖所示:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

  1. 上電初始程序依然從 0x08000004 處取出復(fù)位中斷向量地址,
  2. 執(zhí)行復(fù)位中斷函數(shù)后跳轉(zhuǎn)到 IAP 的 main (標(biāo)號①所示),
  3. 在 IAP 的 main 函數(shù)執(zhí)行完成后強制跳轉(zhuǎn)到 0x08000004+N+M 處(標(biāo)號②所示),
  4. 最后跳轉(zhuǎn)到新的main函數(shù)中來(標(biāo)號③所示),
  5. 當(dāng)發(fā)生中斷請求后,程序跳轉(zhuǎn)到新的中斷向量表中取出新的中斷函數(shù)入口地址,再跳轉(zhuǎn)到新的中斷服務(wù)函數(shù)中執(zhí)行(標(biāo)號④⑤所示),執(zhí)行完中斷函數(shù)后再返回到main函數(shù)中來(標(biāo)號⑥所示)。

IAP設(shè)計

IAP(BootLoader)編程關(guān)鍵技術(shù)

  1. 通信
  2. Flash擦寫
  3. APP跳轉(zhuǎn)
通信需要考慮的問題
  1. 選用何種通信方式:串口、CAN、以太網(wǎng)…
  2. 通信協(xié)議:數(shù)據(jù)分發(fā)、幀頭幀尾校驗
  3. 配套上位機
Flash寫入流程

1 解鎖

HAL_StatusTypeDef HAL_FLASH_Unlock(void);	//解鎖

2 擦除

// 根據(jù) 配置選擇 整頁 或 全片 擦除
HAL_StatusTypeDef  HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError);

3 寫入

// 在 指定地址 編程 半字、字或雙字
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

4 上鎖

HAL_StatusTypeDef HAL_FLASH_Lock(void);

接收多少數(shù)據(jù)寫入一次?

FLASH 寫入之前必須進行頁擦除

STM32F103 FLASH 頁大?。?k 或 2k

接收滿1頁大小的數(shù)據(jù)寫入一次

APP跳轉(zhuǎn)

正點原子串口 IAP 實驗 IAP 跳轉(zhuǎn)代碼

void iap_load_app(u32 appxaddr)
{
    // 在 RAM 的范圍內(nèi)( 0x20000000 - 0x20010000 )
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//檢查棧頂?shù)刂肥欠窈戏?
	{ 
        // 0x08000004 是位于 flash 中的中斷向量表,
        // 表內(nèi)存儲的是具體的 中斷函數(shù)地址(位于 RAM 中)
		jump2app=(iapfun)*(vu32*)(appxaddr+4);		//用戶代碼區(qū)第二個字為程序開始地址(復(fù)位地址)		
		MSR_MSP(*(vu32*)appxaddr);					//初始化APP堆棧指針(用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
		jump2app();									//跳轉(zhuǎn)到APP.
	}
}

參考安富萊代碼之后更改的 IAP 跳轉(zhuǎn)代碼(這個更嚴(yán)謹(jǐn),能避免一些錯誤。)

void iap_load_app(u32 appxaddr)
{
    int i = 0;
    
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//檢查棧頂?shù)刂肥欠窈戏?
	{ 
        /* 首地址是MSP,地址+4是復(fù)位中斷服務(wù)程序地址 */
		jump2app=(iapfun)*(vu32*)(appxaddr+4);
            
         /* 關(guān)閉全局中斷 */
        __set_PRIMASK(1); 
                 
        /* 關(guān)閉滴答定時器,復(fù)位到默認(rèn)值 */
        SysTick->CTRL = 0;
        SysTick->LOAD = 0;
        SysTick->VAL = 0;
        
        /* 設(shè)置所有時鐘到默認(rèn)狀態(tài) */
        RCC_DeInit();
        
        /* 關(guān)閉所有中斷,清除所有中斷掛起標(biāo)志 */  
        for (i = 0; i < 8; i++)
        {
            NVIC->ICER[i]=0xFFFFFFFF;
            NVIC->ICPR[i]=0xFFFFFFFF;
        }
        
        /* 使能全局中斷 */ 
        __set_PRIMASK(0);
        
        /* 這個設(shè)置在 RTOS 應(yīng)用程序中比較重要,因為基于 Cortex-M 內(nèi)核的 RTOS 任務(wù)堆?;径际鞘褂镁€程堆棧指針 PSP。但系統(tǒng) bootLoader 使用的是主堆棧指針 MSP,所以務(wù)必要設(shè)置下,同時讓 M 內(nèi)核工作于特權(quán)級。此寄存器的作用 */
        __set_CONTROL(0);
        
        MSR_MSP(*(vu32*)appxaddr);					//初始化APP堆棧指針(用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
		jump2app();									//跳轉(zhuǎn)到APP.
        
        /* 跳轉(zhuǎn)成功的話,不會執(zhí)行到這里,用戶可以在這里添加代碼 */
        while (1)
        {

        }
	}
}

下圖是安富萊代碼中的 __set_CONTROL(0); 的來源

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

IAP 實現(xiàn)

ST官方IAP代碼

以下是STM32官方IAP代碼:

串口IAP:

  • STM32F10xxx in-application programming using the USART (AN2557)
  • STM32F2xx in-application programming using the USART (AN3374)
  • STM32F4 in-application programming (IAP) using the USART (AN3965)
  • STM32L1xx in-application programming (IAP) using the USART (AN3310)
  • STM32F3xx in-application programming (IAP) using the USART (AN4045)
  • STM32F3xx in-application programming (IAP) using the USART (AN4045)
  • STM32F0xx in-application programming using the USART (AN4065)

其他IAP:

  • STM32F107 in-application programming (IAP) over Ethernet (AN3226)
  • STM32F2x7 in-application programming (IAP) over Ethernet based on LwIP TCP/IP stack (AN3376)
  • LwIP TCP/IP stack demonstration for STM32F2x7 microcontrollers based on LwIP TCP/IP stack and FreeRTOS (AN3384)
  • LwIP TCP/IP stack demonstration for STM32F2x7 microcontrollers based on LwIP TCP/IP stack and FreeRTOS (AN3384)

下載實例

以F4單片機為例子,通過藍(lán)牙串口燒錄:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

有以下文件:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

以上搞定后,以下開始移植

移植實例

以下是main函數(shù)的內(nèi)容:

int main(void)
{
  /* 解鎖Flash程序擦除控制器 */
  FLASH_If_Init();

  /* 初始化在STM324xG EVAL板上的按鍵 */
  STM_EVAL_PBInit(BUTTON_WAKEUP, BUTTON_MODE_GPIO);

  /* 測試STM324xG EVAL板上的按鍵是否被按下 */
  if (STM_EVAL_PBGetState(BUTTON_WAKEUP) == 0x00)
  {
    /* 執(zhí)行IAP驅(qū)動程序以重新編程閃存 */
    IAP_Init();
    /* 顯示主菜單 */
    Main_Menu ();
  }
  /* 保持用戶應(yīng)用程序運行 */
  else
  {
    /* 測試用戶代碼是否從地址“APPLICATION_address”開始編程 */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    { 
      /* 跳轉(zhuǎn)到用戶應(yīng)用程序 */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* 初始化用戶應(yīng)用程序的堆棧指針 */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      Jump_To_Application();
    }
  }

  while (1)
  {}
}

大致就是在復(fù)位的時候,判斷一個按鍵是否被按下,如果按下則等待串口傳入數(shù)據(jù),如果沒按下則直接跳轉(zhuǎn)到應(yīng)用程序。

else 的內(nèi)容就是跳轉(zhuǎn)到應(yīng)用程序的代碼。而在 if 中,就是初始化串口以及菜單選擇部分。

修改 STM_EVAL_PBInit 按鍵初始化代碼

STM_EVAL_PBInit ( BUTTON_WAKEUP, BUTTON_MODE_GPIO ) ;

傳進去的兩個參數(shù)都是枚舉值;

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

枚舉通過數(shù)組找到具體按鍵。

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

直接把數(shù)組修改成對應(yīng)的按鍵 端口、引腳、時鐘值即可。

修改 STM_EVAL_PBGetState 按鍵初始化代碼

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

與 修改 STM_EVAL_PBInit 同理。

修改 IAP_Init 串口初始化代碼

從以下這部分代碼來看就是一個初始化串口的操作:

/**
  * @brief  初始化IAP:配置USART。
  */
void IAP_Init(void)
{
 USART_InitTypeDef USART_InitStructure;

  /* USART resources configuration (Clock, GPIO pins and USART registers) ----*/
  /* USART configured as follow:
        - BaudRate = 115200 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  STM_EVAL_COMInit(COM1, &USART_InitStructure);
}

但是初始化的是哪一個串口?

可以看到最后一行代碼:STM_EVAL_COMInit ( COM1, &USART_InitStructure ) ;

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

傳入的一個 COM1 ,跳進函數(shù)看,基本上所有的初始化都是調(diào)用一個COM值引導(dǎo)的數(shù)組值,所以我們只需要修改數(shù)組值的內(nèi)容,就可以使用其他串口來遠(yuǎn)程燒錄啦!

怎么修改?

跳轉(zhuǎn)到這些數(shù)組這里,看到數(shù)組內(nèi)容是一些宏,我們?nèi)バ薷倪@些宏:

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

原來是串口3,我修改成串口2了。

以上就修改完畢了,直接燒錄到到單片機中,然后看如何使用吧!

在使用之前先下載一個軟件 SecureCRT

對于flash 偏移方面

根據(jù) flash_if.h 中的偏移來設(shè)置應(yīng)用代碼的偏移(建議用設(shè)置中斷向量表的偏移量中的方法二)。
Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記),STM32,Keil,日常,stm32,嵌入式硬件,單片機

下載 SecureCRT

下載與破解請看博客:

SecureCRT8.5安裝教程_securecrt安裝教程_汗滴禾下除的博客-CSDN博客

iap使用

iap 與 SecureCRT 使用請看博客:

使用stm32進行ota升級_stm32ota升級_JIAAN99的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-740536.html

參考

  • STM32的ISP下載原理
  • STM32燒錄程序方式_stm32燒錄方式_宇宙小蝦米的博客-CSDN博客
  • IAP程序升級(全網(wǎng)最全)_關(guān)于在線升級iap的基礎(chǔ)知識_果果小師弟的博客-CSDN博客
  • ISP、IAP、ICP三種燒錄方式的區(qū)別
  • STM32的完整啟動流程分析_stm32啟動方式選擇_隋邊邊的博客-CSDN博客
  • 單片機三種燒錄方式ICP、IAP和ISP詳解 - 知乎 (zhihu.com)
  • STM32的IAP技術(shù),基于CAN總線的STM32F103 BootLoader設(shè)計
  • STM32升級方法(一):IAP升級_騎著蝸牛寫代碼的博客-CSDN博客
  • Keil | 解決Keil雙擊工程名無法打開.map的問題

到了這里,關(guān)于Keil MDK編程環(huán)境下的 STM32 IAP下載(學(xué)習(xí)筆記)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32 keil MDK配置FPU詳解

    STM32 keil MDK配置FPU詳解

    記錄下keil對FPU的配置,及對應(yīng)的宏參數(shù)。 FPU單元是芯片上一個獨立于CPU處理的浮點運算單元,整個單元可以被使能和關(guān)閉。 STM32F4帶有32位單精度硬件FPU支持浮點指令集。相比Cortex-M3、Cortex-M0等無FPU的芯片高出數(shù)十倍甚至上百倍的運算性能。 STM32F7/H7及以上處理器帶有雙精度

    2024年02月11日
    瀏覽(78)
  • MDK keil5新建STM32工程文件--實踐篇

    MDK keil5新建STM32工程文件--實踐篇

    一、先下載芯片支持包 第一步 :當(dāng)然是先百度搜索我們的keil官網(wǎng)(網(wǎng)址):https://www.keil.com/ ? 第二步 :點擊首頁的Project,會跳轉(zhuǎn)如界面,再次點擊Arm Cortex-M,如圖所示: ?? 第三步 :點擊后會再次跳轉(zhuǎn),這時候我們再次點擊Public Software Packs,如圖所示: 第四步 :點擊后

    2024年02月16日
    瀏覽(101)
  • 【STM32】keil MDK-Arm 5.38 功能詳解

    【STM32】keil MDK-Arm 5.38 功能詳解

    keil 是ARM的軟件子公司, MDK-Arm 是keil的一個產(chǎn)品,把它稱作keil也是可以的。 arm 鏈接:https://developer.arm.com/Tools%20and%20Software/Keil%20MDK#Overview keil:https://www.keil.com/download/ keil MDK是一個完整的軟件開發(fā)解決方案,用于創(chuàng)建,構(gòu)建和調(diào)試基于Arm的微控制器的嵌入式應(yīng)用程序。keil

    2024年02月11日
    瀏覽(1062)
  • 【STM32F407】Note_01 STM32 編程環(huán)境搭建 -- Keil與VS code組合

    【STM32F407】Note_01 STM32 編程環(huán)境搭建 -- Keil與VS code組合

    在使用進行STM32F407開發(fā)的時候,一般被推薦使用的是Keil。經(jīng)過一整子的Keil洗禮,我真的要崩潰了,在界面、調(diào)試、代碼跳轉(zhuǎn)、代碼格式化、開發(fā)效率等方面一直很抓狂。之前一直使用vs code開發(fā),用著還蠻順心,界面風(fēng)格很討人喜歡。因此,嘗試在vs code上進行STM32開發(fā)。接下

    2024年02月16日
    瀏覽(19)
  • MDK Keil5 創(chuàng)建Stm32工程-理論篇(這里以Stm32F103Zet6為例)

    MDK Keil5 創(chuàng)建Stm32工程-理論篇(這里以Stm32F103Zet6為例)

    整個工程可以粗略的劃分為幾個文件夾: BSP 底層驅(qū)動比如GPIOTimer等驅(qū)動文件 CMSIS 內(nèi)核相關(guān)的文件 Firmware 生成的固件下載文件 Mycode 用戶編寫的相關(guān)文件,主要編寫的文件都在這個文件夾里 Project 工程文件 startup 芯片啟動文件 STM32F10x_FWLib 標(biāo)準(zhǔn)庫文件 USER 主函數(shù)等文件 readm

    2023年04月24日
    瀏覽(95)
  • 【STM32】Keil V5聯(lián)合VSCode配置代碼編寫與下載環(huán)境,解決報錯問題

    【STM32】Keil V5聯(lián)合VSCode配置代碼編寫與下載環(huán)境,解決報錯問題

    最近重新?lián)炱鹆薙TM32的開發(fā)工作,由于之前一年多的時間一直在從事PC端與Linux下的開發(fā),習(xí)慣了VSCode的開發(fā)界面以及各種方便的插件,再次打開keil的界面時倍感丑陋。于是花了不少心思配置了VSCode中的代碼編寫環(huán)境,再次特做記錄。 VSCode的插件商店中其實包含了支持Keil的插

    2024年02月06日
    瀏覽(88)
  • 【STM32】使用RTE ,從 0 開始創(chuàng)建一個 (keil) ARM MDK工程(純keil,標(biāo)準(zhǔn)庫,以STM32F103C8T6為例)

    【STM32】使用RTE ,從 0 開始創(chuàng)建一個 (keil) ARM MDK工程(純keil,標(biāo)準(zhǔn)庫,以STM32F103C8T6為例)

    學(xué)習(xí)相關(guān)的基礎(chǔ)知識請閱讀本專欄其他文章,一定有你想要的。 https://blog.csdn.net/weixin_43764974/category_11021363.html 本文軟硬件: STM32F103C8T6 ARM MDK 5.38 ARM complier 6 ST-Link v2 StdPeriph Drivers(標(biāo)準(zhǔn)庫) 文章開始前,我想再次說一下: keil 、 μvision 、 ARM MDK 這幾個名詞(盡管前面的額文

    2024年02月16日
    瀏覽(499)
  • STM32H723 + DP83848 + LWIP + RT-Thread(FreeRTOS) + STM32CubeMX + Keil MDK 超詳細(xì)

    STM32H723 + DP83848 + LWIP + RT-Thread(FreeRTOS) + STM32CubeMX + Keil MDK 超詳細(xì)

    MCU:STM32H723ZGT ETH PHY :DP83848 RT-Thread:RT-Thread nano 3.1.5 Software Pack:STM32CubeH7 Firmware Package V1.10.0 / 11-February-2022 STM32H723配置以太網(wǎng)+Freertos注意事項 STM32H723+Lwip+ETH+CUBE 完整配置(排了巨多坑?。?Cube配置STM32H743+DP83848以太網(wǎng)工程 STM32H743+CubeMX-梳理MPU的設(shè)置 首先使用 CubeMX配置相關(guān)外

    2024年02月13日
    瀏覽(95)
  • STM32-IAP基本原理及應(yīng)用 | ICP、IAP程序下載流程 | 程序執(zhí)行流程 | 配置IAP到STM32F4xxx

    STM32-IAP基本原理及應(yīng)用 | ICP、IAP程序下載流程 | 程序執(zhí)行流程 | 配置IAP到STM32F4xxx

    ①在線編程(ICP,In-Circuit Programming) :通過JTAG/SWD協(xié)議或者系統(tǒng)加載程序(Bootloader, 串口 )下載用戶應(yīng)用程序到微控制器中。 ②在程序中編程(IAP,In Application Programming) :通過任何一種通信接口(如IO端口,USB,CAN,UART,I2C,SPI等)下載程序或者應(yīng)用數(shù)據(jù)到存儲器中( 需要在此前通過在線編

    2024年02月07日
    瀏覽(27)
  • STM32之Bootloader、USB、IAP/DFU下載

    STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式2) STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式1) STM32程序下載4:通過STM32CubePro-USB下載 STM32程序下載3:通過STM32CubePro-UART下載 STM32程序下載2:通過STM32CubePro-ST-Link下載 如何使用串口來給STM32下載程序 通過STM32內(nèi)置的U

    2024年02月02日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包