STM32 iap移植筆記

 

1.IAP概述

對於大多數基於 Flash 的系統而言,在最終產品中安裝之後,能夠對固件進行更新,這一點非常重要。這一功能被稱爲在應用中編程 (IAP)。STM32F4xx 微控制器能夠運行用戶指定的固件,從而執行微處理器內置 Flash 的 IAP。藉助這一特性,在重新編程過程中可以使用任意類型的通信協議。 

1.1 原理

         使用所選的開發工具通過 JTAG/SWD 接口,或使用系統存儲區中工廠內置的自舉程序將IAP 驅動程序編程到 Flash 的基址。用戶程序設置在flash的第二個塊中,並設置中斷向量表偏移量爲第一個flash塊大小。芯片上電後會先執行IAP驅動程序,用戶可使用預設的通信方式,下傳用戶代碼,IAP驅動檢測到代碼正常後會將其寫入相應flash中,然後跳轉到用戶代碼區執行用戶代碼。

注:cortex-m0內核無法通過設置向量表偏移寄存器重映射中斷向量表,需重映射爲從ram啓動。

注:

         用這種方式更新代碼時,需要直接向flash中寫入二進制文件(.bin文件),可由keil直接生成;由於官方例程中使用的事Ymodem傳輸協議,因此需要能夠支持此協議傳輸的超級終端,例如:SecureCRT。

1.2  代碼移植(非M0內核)

1.2.1 修改官方例程

         下載ST官網串口IAP源碼,是個基於評估板的例程(包含IAP驅動程序,及用戶APP例程),IAP驅動可以修改串口後直接使用。爲適應公司驅動代碼並且能夠更靈活的選擇串口,可將bsp_usart代碼植入:

1)新建一個裸機工程,提取公司的基礎版本,USER目錄下刪除除stm32f4xx_conf、stm32f4xx_it.c、stm32f4xx_it.h(防止不兼容)的文件,BSP目錄下只保留bsp_usart.c、bsp_usart.h文件,把APP目錄下的app_cfg.h複製到USER目錄下,刪除APP、KAL、UCOSII文件夾。

2)新建IAP文件夾,向其中複製ST官方例程中的STM32F4xx_AN3965_V1.0.0\Project\ STM32F4xx_IAP目錄下的src和inc文件夾,將main文件放到USER目錄下,刪除stm32相關文件:

 

3)工程中刪除多餘文件,添加新文件後編譯。

4)stm32f4xx_conf.h文件中,註釋掉#include "ucos_ii.h",添加#include "app_cfg.h"

5)mian文件中,刪除串口初始化函數和按鍵相關調用; 在bsp_usart中定義EVAL_COM,替換掉工程中的EVAL_COM1,再將bsp_usart.h包含到common.c和main.c中。重新編譯,調整代碼直到編譯成功。

6)按照啓動文件修改PendSV_Handler和SysTick_Handler函數名。

7)修改flash_if.h中flash結構,及用戶APP存放位置。

8)修改IAP啓動處理邏輯,官方例程需要按鍵控制,需改爲密鑰激活方式。當前版本代碼只實現IAP下載程序功能,芯片復位後需在3s內發送密鑰zy123456,才能收到反饋‘C’,超時將直接執行用戶代碼。

9)查看工程的.map文件,確認預留flash空間充足。例如,在flash_if.h中定義了用戶APP地址爲0x08004000,而flash起始地址爲0x08000000(手冊),因此IAP驅動預留空間有16K,而IAP驅動有10.69K,空間充足:

 

1.2.2 修改用戶代碼

Main函數中重新設置中斷向量表地址:

​​​​​​​1.2.3 修改用戶代碼的MDK設置

1)修改target選項卡中rom位置:

2)修改utilities->settings->flash download中flash範圍:

 

3)user選項卡中添加生成二進制文件的指令:

fromelf.exe  --bin -o "[email protected]" "#L"

4)修改完成

1.3 代碼移植(M0內核)

1.3.1 移植官方例程

參考上一節,只多了個main.h。

注:官方例程與當前芯片兼容性bug:

1)Flash_if.c文件中,FLASH_If_Init()函數清空標誌位時,無FLASH_FLAG_BSY位。

2)庫函數FLASH_ErasePage()檢查參數時,宏定義的flash範圍不對:

正確範圍: (((ADDRESS) >= 0x08000000) && ((ADDRESS) <= 0x0803FFFF))

 

​​​​​​​1.3.2 修改用戶代碼

Main函數中重新設置中斷向量表地址:

1)將用戶APP的中斷向量表手動複製到RAM起始位置:

2)重映射啓動位置爲從sram啓動(見上圖)。

 

​​​​​​​1.3.3 修改用戶代碼的MDK設置

1)修改target選項卡中rom位置和RAM位置(預留中斷向量表空間):

2)修改utilities->settings->flash download中flash範圍和RAM範圍:

3)user選項卡中添加生成二進制文件的指令:

fromelf.exe  --bin -o "[email protected]" "#L"

4)修改完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章