STM32 IAP - Boot跳轉到APP

TalonShaw發表於2021-01-04

簡單IAP設計思路:

  • 微控制器上電首先執行BootLoader程式;
  • Bootloader如果檢測到需要更新APP,則首先進行更新,更新完成後跳轉到APP並執行;
  • Bootloader如果檢測到不需要更新APP,則直接跳轉到APP並執行。

本文僅介紹如何從Bootloader跳轉到APP,以下為跳轉過程在BootLoader及APP中分別需要進行的操作:

1.BootLoader

如下為跳轉函式,定義好APP起始地址FLASH_APP_ADDR ,然後呼叫Jump_to_APP()即可跳轉到APP。

注意:為避免跳轉後執行出錯,呼叫跳轉函式前最好對所有外設進行DeInit。

#define FLASH_APP_ADDR 0x08010000 //你的APP存放起始地址
typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
void Jump_to_APP()
{
        uint32_t JumpAddress;
 
        /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
        if (((*(volatile uint32_t*)FLASH_APP_ADDR) & 0x2FFE0000 ) == 0x20000000)
        {
                /* Jump to user application */
                JumpAddress = *(volatile uint32_t*) (FLASH_APP_ADDR + 4);
                Jump_To_Application = (pFunction) JumpAddress;
                /* Initialize user application's Stack Pointer */
                __set_MSP(*(volatile uint32_t*) FLASH_APP_ADDR);
                Jump_To_Application();
        }
}

2.APP

在APP的main函式中首先執行:

//0x10000 為APP中斷向量表偏移量
NVIC_SetVectorTable(NVIC_VectTab_FLASH,(0x10000));

其中,APP中斷向量表偏移量=APP存放起始地址相對於微控制器ROM起始地址的偏移量。STM32的ROM起始地址0x8000000,本例中APP存放地址為0x8010000,故偏移量=0x8010000-0x8000000。

注意:需要在IDE中配置APP的ROM起始地址,否則APP將無法執行,對於KEIL配置方法如下:

開啟工程配置-Target,將如圖紅框內地址修改為APP的實際起始地址。

相關文章