STM32 IAP在線升級

概述

目前本人在工作中使用的大多爲STM32系列的MCU,該系列的MCU均可支持IAP升級。
對IAP升級不瞭解的同學可參考之前寫的文章《IAP(In Application Program)在線應用編程》進行一些基礎知識的瞭解。

實現思路

1.使用Bootloader和Application分區的方式進行升級,防止升級過程中掉電,導致無法恢復。
2. Bootloader一般在燒錄後,固化到板子中,一般情況下不支持IAP方式升級Bootloader。
3. 減少重啓過程,僅在升級結束後重啓一次。
4. 數據傳輸完成後需要進行校驗。防止傳輸或者寫入錯誤導致整機啓動異常。

升級流程

待補

  • 跳轉代碼實現
typedef void (*pFunction)(void);

void vBooloader_load(void)
{
    uint32_t JumpAddress;
    pFunction Jump_To_Boot;

    /* Jump to user application */
    JumpAddress = *(__IO uint32_t*) (0x8000000 + 4);
    Jump_To_Boot = (pFunction) JumpAddress;
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) 0x8000000);
    Jump_To_Boot();
}

填過的坑

  • Application的中斷無法觸發。
    需要在Application的程序開啓重定向MCU的中斷向量表,將指到Application的首地址。
    在編譯器編譯的時候,默認會將中斷向量表變異到程序的起始位置,所以我們將中斷向量表偏移到Application的燒錄起始位置即可。
  • Application跳轉到bootloader後,系統直接跑飛,但是在斷電後可正常升級。
    在Application跳轉前禁用了所有中斷,但在Bootloader中開啓中斷後,之前暫存的中斷標記不會自動清除,MCU會自動跳轉尋找相應的中斷處理函數,從而導致程序直接跑飛。
    解決思路:
    1.跳轉到Bootloader前清除掉所有的中斷狀態寄存器,同步失能所有的中斷。
    2.在bootloader中不開啓中斷,所有的操作使用查詢的方式進行。(目前採用該方案)

後續優化

  • 增加對固件版本的加密和解密功能。
  • 調高數據交互的效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章