IAP基礎參考http://www.eeworld.com.cn/mcu/2018/ic-news112042038.html
https://blog.csdn.net/tq384998430/article/details/81010002
程序升級的文件:HEX、bin
HEX文件:特點:適合ISP,不適合FOTA(因為HEX開始有ISP升級的頭字段);KEIL中的生成:Options -> Output 下勾選Create HEX File
BIN文件:真正升級的二進制文件字節流,尺寸小,適合FOTA;KEIL中生成方法:User選項卡下面的 After Build/Rebuild 設置並打鈎:fromelf --bin !L -o .\BIN\FOTA.bin。
程序升級過程:
- 在APP運行過程中,如果條件觸發(案件按下、串口收到指定命令或者字符,從指定存儲位置讀取的版本號比當前新),此時APP會從指定的源頭(/USB/SD/網頁服務器)把APP_new.bin文件一次性或者分包拷貝到MCU的備份區(MCU的flash備份區、外部FLASH),置位需要更新程序的標志到非易失存儲位置(RTC的BKP區、MCU的EEPROM/FLASH區、外部的eerom/flash區),然后讓程序跳轉到IAP程序中(復位跳轉、直接跳轉);
- 在IAP程序中,若有升級標志則先擦除APP_RUN—FLASH,然后將備份區的內容拷貝到此運行區並做好校驗,然后繼續跳轉會運行程序區(復位、直接跳轉);若無升級標志或者過一定時間無操作則跳會APP運行程序區;
- 運行APP程序(開始注意NVIC需要重定向NVIC_SetVectorTable(NVIC_VectTab_FLASH,APP_StartAddr),並繼續監控是否需要升級。
簡而言之:IAP要實現2個功能:跳轉和更新程序
- 規划好boot程序和APP程序的起始地址;分別編寫2個工程的程序,注意APP程序需要NVIC重定向NVIC_SetVectorTable(NVIC_VectTab_FLASH,APP_StartAddr)
- APP程序根據觸發條件判斷是否要升級,需要的話將新程序拷貝到一個存儲位置,存儲升級標記;並強制程序跳轉到boot程序位置(也可以軟重啟)
- 進入BOOT程序后,如果有更新標記則擦除app的flash區域,並將新存儲的程序寫到app的flash區域,校驗成功后取消更新標記,並強制跳轉到APP區域。通過__asm("B APP_StartAddr +4")或者指針跳轉void (*p)(void) = (void (*)(void))(*((int*)(APP_StartAddr +4))); p();實現跳轉。
- 注意flash的操作先FLASH_Unlock,再FLASH_ClearFlag,操作完之后FLASH_Lock。
- 擦除可以用winhex刪除制定區域,HEX轉BIN的不一定能直接使用主機檢查其開始地址是否是APP_StartAddr
FLASH的分區:
分2個區(IAP+APP)+外存(usb/sd/):此種沒有老程序的備份,萬一升級失敗就只能沖刷老程序
分3個區(IAP+APP_Run+APP_BKP備份緩存):這種比較浪費MCU的flash,成本上沒有利用外存經濟。
分4個區IAP+APP_Run+APP_MAIN+APP_STATIC:其中APP_STATIC為參數存儲區,
程序升級重點是要解決升級過程中升級失敗(升級過程中關中斷,若串口中斷接收關其它中斷)或者分包傳輸(沒有大緩存)分包錯誤的處理;無線升級要考慮到客戶的方便性、配合度、安全性、大批量升級的效率問題
BOOTloader分類:單獨開發、UBOOT/MCU廠商或者中間件廠商rtt提供的BOOT
一 非無線接口:(串口、SPI/I2C/CAN/485/USB/SD):
1.0 :
1.x:程序的合並燒寫:通過JLINK將IAP和app的燒寫文件進行合並成一個燒寫文件,大量MCU批量燒寫可以利用這種方法。
二 無線接口(WLAN/WIFI/藍牙/GPRS):