STM32 IAP - Boot跳转到APP

简单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的实际起始地址。

STM32 IAP - Boot跳转到APP_第1张图片

你可能感兴趣的:(嵌入式开发,单片机,嵌入式,stm32)