對於大多數基於 Flash 的系統而言,在最終產品中安裝之後,能夠對固件進行更新,這一點非常重要。
這一功能被稱爲在應用中編程 (IAP in-applicationprogramming)。 通過微處理器內置 Flash 的 IAP
(可以認爲是boot代碼),STM32F4xx 微控制器能夠運行用戶指定固件。藉助這一特性,在重新編程
過程中可以使用任意類型的通信協議。下面的例子是利用串口下載一個可以執行的bin文件程序到開發板,
由於開發板已經內置好IAP程序,下載完bin文件後,用戶就可以選擇跳轉到相應flash地址去執行這個程序。
IAR或者MDK生產bin文件看這個帖子:https://blog.csdn.net/u012572552/article/details/84570552
STM32F407有如下12個扇區,這裏我們把扇區0,扇區1,扇區2,扇區3用來存儲IAP代碼,其餘扇區
用於用戶flash區。
/* 各個扇區首地址 */
#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbyte */
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbyte */
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbyte */
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbyte */
#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbyte */
#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbyte */
#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbyte */
#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbyte */
#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbyte */
#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbyte */
#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbyte */
#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbyte */
/*其中 扇區0 - 3用於IAP BOOT, 下面是用戶區首地址 */
#define APPLICATION_ADDRESS (uint32_t)0x08010000
下面我們要做的就是把可執行程序bin文件的首地址設置爲0x08010000 ,需要設置如下兩個地方再編譯:
第一步:打開超級終端,XP系統自帶超級終端,WIN7系統沒有自帶,可以下載這裏的超級終端:https://download.csdn.net/download/u012572552/10811177
。由於這個例子用到了Ymodem文件傳輸協議,所以要
使用超級終端,如果使用secureCRT的話,文件下載會失敗,主要是secureCRT使用的Ymodem協議與
超級終端使用的稍有區別。
第二步:打開超級終端
點擊確定後選擇波特率,停止位等(注意自己電腦可以用的串口號是com幾,就選擇com幾,當前我這裏是com4)
點擊確定後選擇波特率,停止位等選項,然後點擊應用,確定:
至此超級終端就設置完了。
第三步:下載固件
超級終端會顯示如下信息:
在鍵盤上面點擊數字1,彈出如下信息:
點擊菜單選項-->傳送-->發送文件:
點擊發送,彈出如下窗口:
發送完成後,上面的窗口會自動消息,並在超級終端顯示如下消息:
第四步:在電腦鍵盤上面點擊數字2,開發板就會執行前面下載的output.bin程序:
done