已解决,不知道原理移植的跳转中少了哪个步骤,后来重新写了跳转程序就可以了。
[C] 纯文本查看 复制代码 void jump_to_app(void)
{
// 1. 声明函数指针,指向 APP 程序的复位处理函数
pFunction app_reset_handler;
// 2. 禁用全局中断,防止 BootLoader 中的中断影响 APP
__disable_irq();
// 3. 清除所有挂起的中断标志并禁用所有 NVIC 中断
for (int i = 0; i < 8; i++)
{
NVIC->ICER[i] = 0xFFFFFFFF; // 禁用所有中断
NVIC->ICPR[i] = 0xFFFFFFFF; // 清除挂起的中断
}
// 4. 关闭 SysTick 定时器,防止影响 APP 程序
SysTick->CTRL = 0;
// 5. 重定位向量表到 APP 的起始地址
SCB->VTOR = APP_START_ADDR;
// 6. 读取 APP 程序的栈顶地址(向量表的第 0 项)
__set_MSP(*(volatile uint32_t *)APP_START_ADDR);
// 7. 读取 APP 程序的复位处理函数地址(向量表的第 1 项)
app_reset_handler = (pFunction)(*(volatile uint32_t *)(APP_START_ADDR + 4));
// 8. 跳转到 APP 程序的复位处理函数
app_reset_handler();
// 9. 如果跳转失败,陷入无限循环
while (1);
} |