最近在做一個項目,想使用uSD卡來實現在應用編程,首先需要一些知識
我所使用的單片機是STM32F103ZE,內部flash,超始地址為0x8000000,大小為0x80000(0x80000/1024也就是512kByte)要實現IAP,那么我需要一個bootloader,什么是bootloader呢,其實可以理解為我們PC的引導程序,我們需要在flash中為這個引導程序分配一個空間,起始於flash的起始地址(0x80000000)結束於0x80007F00,這樣就分配了32KByte的空間,注意這個空間的分配一定要大於等於bootloader所占用的flash空間的大小。可以用stlink Utility來確定實際大小,也可以用編譯工具編譯結束后輸出的信息。
除了bootloader還有最終單片機需要跑的用戶應用程序。這個程序就可以分配在bootloader之后的空間里,從0x80008000開始,到0x80080000全部可用。
了解了上面的信息,那么可以知道它的實現原理:單片機上電,運行bootloader,檢查某一個按鈕是否按下,如果按下,就做一些初始化的工作,比如SDIO,FATFS,完成后讀取SD卡中指定的BIN文件,並轉移到開始地址為0x80008000的FLASH中。如果按鈕沒有按下,bootloader去檢查0x80008000為首的FLASH區域是否有應用程序,如果有就執行。
else//未檢測到按鈕 { /*檢查用戶應用程序的起始地址是否有正確的內容*/ if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); JumpToApplication(); } }
PS:
BIN文件的生成
在調試好應用程序之后,方可生成BIN文件拷貝到SD卡中,那么如何生成這個文件呢,還是MDK ARM工具 OPTION->USER->Run #1 打勾,填入
E:\Keil\ARM\ARMCC\bin\fromelf.exe --bin -o .\STM3210E_EVAL\STM3210E_EVAL.bin .\STM3210E_EVAL\STM3210E_EVAL.axf
以上具體的路徑根據自己的實際情況更改,只不過生志的BIN文件和AXF文件需要和MDK工程名一致這點要注意。
更改生成文件的超始地址:
Option->Target->IROM1 的起始地址是否為0x80008000。

還有最重要的一點,用戶應用程序在調試好之后生成BIN文件之前,需要更改中斷向量表的偏移,使用STM32 HAL庫的情況下,找到system_stm32f1xx.c這個文件,修改宏定義:
#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
以上是默認值,這里需要更改為你所設置的偏移量,在這里就是用戶應用程序相對於基址0x80000000的偏移,用戶應用的基址是0x80008000,那么偏移量為0x8000所以這里改成:
#define VECT_TAB_OFFSET 0X8000
