本帖最后由 lvben5d 于 2022-7-18 16:41 编辑
void CheckAndJump2App()
{
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) //检测栈顶的地址,判断用户代码的堆栈地址是否落在0x2000000~0x2001ffff区间
{
__disable_irq();//关闭所有中断 再跳转
/* 跳转至用户程序 */ //ApplicationAddress + 4 对应的是app中断向量表的第二项,复位地址
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress; //把地址强转为函数指针
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //设置主函数栈指针 将用户代码的栈顶地址设为栈顶指针
Jump_To_Application(); //调用函数,实际失去app复位地址去执行复位操作---设置程序指针为复位地址
}
}
结果跳转后,我忘记 __enable_irq(); //打开所有中断 于是进不去中断处理函数,搞了2小时才想起这个。 看来MCU上电后,默认是开全局中断的,因为一般我们不会写 __disable_irq();
|