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