關注了這個概念有些日子了,這段時間總算有機會實戰==網絡升級應用固件,這裏記錄下遇到的問題,及解決方案。
原理與網上流傳的串口做爲傳輸手段 一致;不一樣之處,無非我這裏使用了網絡設備傳輸。==(lwip)TFTP客戶端的應用.
參考:
IAR環境下STM32+IAP方案的實現
STM32淺談之IAP.pdf
基於IAP和Keil MDK的遠程升級設計
keil MDK中如何生成*.bin格式的文件html
IAP在應用中編程,能夠拓展成遠程網絡更新應用固件。
片內的flash,至少劃分紅2個分區,對應至少兩個完整的程序;
低地址分區端推薦放入IAP程序==bootloader引導程序(這裏邊的手段能夠是串口、網絡等不一樣的方式),高地址分區端推薦燒寫app固件。
關鍵點說起:
IAP程序中,當知足跳轉條件(被觸發)時,執行跳轉代碼到app應用固件程序,跳轉代碼流程:
至少須要設定跳轉目的地的app應用固件 棧頂指針,:編程
/* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
其中,app應用固件的分區地址:網絡
#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08009000
須要兩處的更改,否則錯誤未知
IROM設置如圖:
中斷向量表偏移:
app
NVIC_SetVectorTable(NVIC_VectTab_FLASH,VectorTable_Offset);
其中:框架
#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) #define VectorTable_Offset 0x9000
若是作了上邊的工做,IAP依然沒法順利執行跳轉至app應用程序,能夠查看.map和.bin文件,肯定是否如實的改變的中斷向量表的偏移和棧頂指針,如圖:
.bin文件:
能夠看到,主棧頂MSP地址=0x2000C8C八、reset_handler地址=0x08009189
如此,才能生效,不然,可能緣由:
修改後的向量表偏移,在以後的程序中,又再次被還原,經過以下的函數:函數
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); void SystemInit (void); SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
一、如須要.hex文件轉.bin,參見上邊的文章
固然,就算使用.hex文件,一樣能夠升級,只是須要修改IAP中斷定已經升級的文件是否有效,文件條件部分的代碼,佈局
if(((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
二、地址偏移後的app應用程序,是否可以獨立的運行?
不能,理由:
可知,開機上電並不可以找到咱們指定的偏移後的向量表。ui