天天看點

關于STM32F4的IAP的一點點記錄

    看了原子的STM32的IAP 教程,一開始還以為bootloader是啥意思,差點跟uboot搞混淆了,其實stm32的“bootloader”不需要自己寫彙編和連結腳本,Boot和App都是單片機程式,隻是實作的功能不同,前者是為了引導App,後者是為了實作業務邏輯。隻不過boot是有寫flash或者sram的功能,再加上通信口(USB/USART etc. )來接收所謂的應用程式app代碼。然後跳轉到該代碼執行就好了,但是要重新設定一下中斷向量表的位置,要不然兩個程式的中斷可能會混淆。也就是說boot代碼的中斷要進boot代碼的irq handler 而 app代碼的中斷要進app代碼的irq handler。下邊就以flash iap為例來具體說說需要注意的兩點:

(1)boot代碼和app代碼在flash中的位置

兩個代碼都要正常運作那肯定不能在寫入app代碼到flash時把boot的代碼給覆寫了,要不然boot代碼就失效了。

STM32F429IG支援三種啟動方式 

1. FLASH啟動        上電複位後PC指針指向第一條指令位置——0x08000000

2. SRAM啟動        上電複位後PC指針指向第一條指令位置——0X20000000

3. 系統存儲器啟動 上電複位後PC指針指向第一條指令位置——0X1FFF0000

程式的起始位址預設是被放在FLASH的起始位址處,即0x08000000。

下圖為boot程式的flash設定:

關于STM32F4的IAP的一點點記錄

boot程式的位址不需要更改就是用預設的位址,理論上我們隻需要確定 APP 起始位址在 Boot 之後,并且偏移量為 0X200

的倍數即可。

設定boot的占用64k(0x10000),就是0X08000000 ~ 0X08010000的flash區間。

該晶片flash共1M,則app占用的起始位址設定為: 0X08010000,size為:1M-64k =960K (0XF0000)。

以下為app程式的flash設定: 

關于STM32F4的IAP的一點點記錄

(2)中斷向量表的重定位

我們都知道一般情況STM32複位後從0x08000000開始取指,中斷向量從0x08000004開始第一個為RESET向量 那APP工程的中斷向量就不能如此了 APP的向量位址要從0x08010000開始:

NVIC_SetVectorTable(FLASH_BASE, 0x10000);

這裡的0x10000根據實際情況更改即可。

繼續閱讀