IAP下載
IAP的引入
不同的程序下載方式
ICP
ICP(In Circuit Programing)。在電路編程,可通過 CPU 的 Debug Access Port 燒錄代碼,比如 ARM Cortex 的 Debug Interface 主要是 SWD(Serial Wire Debug) 或 JTAG(Joint Test Action Group);
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
STM32 的 ISP 下載電路
- 通過串口的DTR和RTS信號來自動配置BOOT0和RESET信號,不需要用戶手動切換它們的狀態(tài),直接串口軟件自動控制,可以方便的下載代碼。
STM32 中的 ISP 下載介紹
- 以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)存映射圖里找到:
- 其通過串口來接收數(shù)據(jù)并燒寫到用戶閃存存儲器的起始地址(0x08000000)。只能燒寫到這個地址,若keil里設(shè)置的地址不是這個地址,則編譯出來的文件將燒錄不成功。(用戶閃存,即User Flash,同時也稱為Main Flash)。
- 這一段BootLoader程序源碼是沒有開源出來的,用戶是不可修改的。我們在上一篇筆記的IAP實驗中,IAP程序通過FlyMCU軟件進行燒錄,燒錄的地址就是0x08000000。
- 注意:不同系列不同型號的STM32固化的BootLoader是不同的,即使用的通訊接口是不同的。如STM32F1xxx系列只支持USART1:
- STM32F4xxx系列只支持USART1、USART3、CAN2等接口:
- 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 空中升級功能。
IAP介紹補充
一片 STM32 芯片的 Code (代碼)區(qū)內(nèi)一般只有一個用戶程序。而 IAP 方案則是將代碼區(qū)劃分為兩部分,兩部分區(qū)域各存放一個程序,一個叫 bootloader (引導(dǎo)加載程序),另一個較 user application (用戶應(yīng)用程序)(之后簡稱 APP)
bootloader 在出廠時就固定下來了,在需要變更 APP 時只需要通過觸發(fā)bootloader 對 APP 的擦除和重新寫入即可完成用戶應(yīng)用的更換
在程序執(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 程序。
是否進行固件升級的判斷可以從硬件和軟件兩個方面進行考慮。
- 硬件實現(xiàn):
- 實現(xiàn):通過撥碼開關(guān)、跳線帽等方式設(shè)定單片機某一引腳電平狀態(tài),程序通過讀取引腳電平判斷是否需要升級。
- 優(yōu)缺點:此種方式需要接觸板卡進行操作,當(dāng)板卡被封閉在外殼中或安裝于不便于操作位置時很難實現(xiàn)。
- 軟件實現(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 每次寫入都需要擦除一整頁,會造成資源浪費。
- 軟件實現(xiàn)-2:
- 實現(xiàn):
- 單片機每次上電首先進入 BootLoader 程序,在 BootLoader 中等待一定時間。
- 若上位機軟件在該時間段內(nèi)發(fā)起通訊,則停留在 BootLoader 程序中等待固件升級;若該時間段內(nèi)無通訊,則跳轉(zhuǎn)到正常的 APP 程序。
- 優(yōu)缺點:該方式每次上電都要等待一定時間,需要考慮是否可以接受。
- 實現(xiàn):
- 軟件實現(xiàn)-3
- 實現(xiàn):在 APP 內(nèi) 輪詢 或 中斷 外部升級信號,一旦信號來臨,則跳轉(zhuǎn) BootLoader 程序升級。
- 優(yōu)缺點:增加 APP程序 代碼量(但可以減少 BootLoder 代碼量),并使 APP 與 BootLoader 之間的耦合增加。
- ……
在 IAP 過程中,單片機通過特定的通訊方式從上位機軟件接收程序數(shù)據(jù),并執(zhí)行 FLASH 擦寫操作對 APP 部分的程序進行更新。
對于 STM32 的 IAP 設(shè)計研究
不同型號STM32 FLASH大小
STM32 的 flash 啟動方式起始地址是 0x 0800 0000 ,根據(jù)不同的 STM32 單片機型號,有不同的 flash size 。
對于不同容量的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空間。
查看程序占用空間大小
打開 .map 文件
在進行 FLASH 空間劃分時,必須知道編寫的程序占用 FLASH 空間大小。用 MDK 軟件進行工程編譯之后會生成一個 .map 文件,在該文件末尾可找到程序需要占用的 FLASH 空間。
對于 cubemx 生成的 keil 工程
因為 cubemx 生成的 map 文件不在工程 主目錄 下,若要直接在 keil 軟件中打開,可以修改 map 文件生成的位置。
改完后再編譯一下,就可以在直接在 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)容。
視頻鏈接:視頻鏈接
這個程序 flash 占用 6.95kB
分析并設(shè)置程序 flash 地址與大小
BootLoader 方面
在MDK軟件配置項中,可以對程序的起始位置以及大小進行設(shè)置。
編寫完,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 的大小
設(shè)置中斷向量表的偏移量:
-
方法一:在主函數(shù)起始位置添加:
SCB->VTOR = FLASH_BASE | 0x1C00; // 0x1C00 即 BootLoader 大?。ㄆ屏浚?/span>
-
方法二:
- 第一步:打開 system_stm32f1xx.c ( f1 系列 STM32 是這個文件)
- 第二步:找到 USER_VECT_TAB_ADDRESS 宏,解除注釋
- 第三步:找到 VECT_TAB_OFFSET 宏,設(shè)置值為 Bootloaber 的大小
對于方法二只是把方法一的代碼,在啟動代碼調(diào)用 SystemInit 函數(shù)時做了。
為什么要有這個偏移呢
對于 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 的分配情況大致如下圖:
在只有一個程序的情況下,程序執(zhí)行的走向應(yīng)該如圖所示:
- 代碼開始的 4 個字節(jié)存放的是堆棧棧頂?shù)牡刂罚?/li>
- STM32F10x 有一個中斷向量表:
- 這個中斷向量表存放在代碼開始部分的后 4 個字節(jié)處(即 0x0800 0004 )
- 當(dāng)發(fā)生中斷后程序通過查找該表得到相應(yīng)的中斷服務(wù)程序入口地址,然后再跳到相應(yīng)的中斷服務(wù)程序中執(zhí)行。
圖像分析:
- 復(fù)位中斷 到 main 函數(shù):
- 上電后從 0x08000004 處取出復(fù)位中斷向量的地址,
- 然后跳轉(zhuǎn)到復(fù)位中斷程序的入口(標(biāo)號①所示),
- 執(zhí)行結(jié)束后跳轉(zhuǎn)到 main 函數(shù)中(標(biāo)號②所示)。
- 中斷時:在執(zhí)行 main 函數(shù)的過程中發(fā)生中斷,
- 則 STM32 強制將 PC 指針指回中斷向量表處(標(biāo)號③所示),從中斷向量表中找到相應(yīng)的中斷函數(shù)入口地址,
- 跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)函數(shù)(標(biāo)號④所示),
- 執(zhí)行完中斷函數(shù)后再返回到 main 函數(shù)中來(標(biāo)號⑤所示)。
若在 STM32F103x 中使用 IAP 方案,則內(nèi)置的 Flash 分配情況大致如下圖:
在內(nèi)置的 Flash 里面添加一個 BootLoader 程序,BootLoader 程序和 APP 各有一個中斷向量表,假設(shè) BootLoader 程序占用的空間為 N+M 字節(jié),
則程序的走向如下圖所示:
- 上電初始程序依然從 0x08000004 處取出復(fù)位中斷向量地址,
- 執(zhí)行復(fù)位中斷函數(shù)后跳轉(zhuǎn)到 IAP 的 main (標(biāo)號①所示),
- 在 IAP 的 main 函數(shù)執(zhí)行完成后強制跳轉(zhuǎn)到 0x08000004+N+M 處(標(biāo)號②所示),
- 最后跳轉(zhuǎn)到新的main函數(shù)中來(標(biāo)號③所示),
- 當(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ù)
- 通信
- Flash擦寫
- APP跳轉(zhuǎn)
通信需要考慮的問題
- 選用何種通信方式:串口、CAN、以太網(wǎng)…
- 通信協(xié)議:數(shù)據(jù)分發(fā)、幀頭幀尾校驗
- 配套上位機
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); 的來源
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)牙串口燒錄:
有以下文件:
以上搞定后,以下開始移植
移植實例
以下是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ù)都是枚舉值;
枚舉通過數(shù)組找到具體按鍵。
直接把數(shù)組修改成對應(yīng)的按鍵 端口、引腳、時鐘值即可。
修改 STM_EVAL_PBGetState 按鍵初始化代碼
與 修改 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 ) ;
傳入的一個 COM1 ,跳進函數(shù)看,基本上所有的初始化都是調(diào)用一個COM值引導(dǎo)的數(shù)組值,所以我們只需要修改數(shù)組值的內(nèi)容,就可以使用其他串口來遠(yuǎn)程燒錄啦!
怎么修改?
跳轉(zhuǎn)到這些數(shù)組這里,看到數(shù)組內(nèi)容是一些宏,我們?nèi)バ薷倪@些宏:
原來是串口3,我修改成串口2了。
以上就修改完畢了,直接燒錄到到單片機中,然后看如何使用吧!
在使用之前先下載一個軟件 SecureCRT
對于flash 偏移方面
根據(jù) flash_if.h 中的偏移來設(shè)置應(yīng)用代碼的偏移(建議用設(shè)置中斷向量表的偏移量中的方法二)。
下載 SecureCRT
下載與破解請看博客:
SecureCRT8.5安裝教程_securecrt安裝教程_汗滴禾下除的博客-CSDN博客
iap使用
iap 與 SecureCRT 使用請看博客:文章來源:http://www.zghlxwxcb.cn/news/detail-740536.html
使用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)!