Bootloader跳转App程序区(CotexM3/M4/M7)

标签:
bootloaderappcotex-m3stm32 |
用户代码区的第一个字用于存放栈顶地址(MSP Main stack pointer)
用户代码区第二个字为程序开始地址(复位地址)
注意:IAR或者Keil编译Bootloader的时候同时也要设置好ROM起始地址,因为链接的时候会把向量表写在ROM的起始地址。
示例代码:
#define
FLASH_ADDR_BOOTLOADER
0x400000
#define
FLASH_ADDR_APP_MEM
0x410000
typedef void
(*pFunction)(void);
uint32_t appMemAddr =
FLASH_ADDR_APP_MEM;
uint32_t *pAppMemAddr =
(uint32_t *)appMemAddr;
uint32_t start_sp;
uint32_t
jump_addr;
pFunction
Jump_to_application;
start_sp =
pAppMemAddr[0];
jump_addr =
pAppMemAddr[1];
Jump_to_application =
(pFunction)jump_addr;
__set_MSP(start_sp);
Jump_to_application();
参考链接:
IAP原理:
设置中断向量表的方法:
另一篇基于STM32的跳转程序,写的很好:
__disable_irq();
{
}
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
{
}
SCB->VTOR = app_address;
__set_BASEPRI(0);
__set_FAULTMASK(0);
__set_MSP(*(uint32_t*)app_address);
__set_PSP(*(uint32_t*)app_address);
__set_CONTROL(0);
__ISB();
__disable_irq();
((_func)(*(uint32_t*)(app_address + 4)))();