一、跳转程序
#define APP_ADDRESS 0x8004000 //用户APP栈顶地址
typedef void (*jump_callback)(void);
uint8_t jump_app(uint32_t app_addr) //app_addr:栈顶地址
{
uint32_t jump_addr;
jump_callback cb;
if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000) //验证栈顶合法性
{
__disable_irq();
jump_addr = *(__IO uint32_t*) (app_addr + 4);
cb = (jump_callback)jump_addr;
__set_MSP(*(__IO uint32_t*)app_addr);
cb();
return 1;
}
return 0;
}
//调用
int main(void)
{
jump_app(APP_ADDRESS) ;//跳转到用户APP程序
while(1)
{
}
}
启动地址设置如下
二、用户程序
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
while(1)
{
printf("hello \r\n\r\n");
delay_ms(1000);
}
}
启动地址设置如下
三、试验结果
先将APP程序下载到单片机中,再将跳转程序下载到单片机中,用串口助手检测如下