马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、功能说明
- 地址:0x08000000
- 上电自动运行
- 功能:初始化按键、串口 → 判断是否升级 → 不升级则跳转到 APP1(0x08010000)
二、原代码问题
- 跳转前未关闭中断
- 未关闭 SysTick(系统定时器)
- 未清除中断标志
- 会导致 APP1 运行异常、关机异常、插电不开机
三、最终正确代码(可直接复制使用)
1. 跳转函数(最重要)
[AppleScript] 纯文本查看 复制代码 typedef void (*iapfun)(void);
iapfun jump2app;
// IAP 跳转 APP1 函数
void iap_load_app(u32 appxaddr)
{
u8 i;
// ------------------- 必须添加的清理代码 -------------------
__disable_irq(); // 关闭总中断
SysTick->CTRL = 0; // 关闭 SysTick
SysTick->LOAD = 0;
SysTick->VAL = 0;
// 关闭所有中断,清除中断标志
for(i=0; i<8; i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
// ---------------------------------------------------------
// 检查栈顶合法性
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
MSR_MSP(*(vu32*)appxaddr);
jump2app();
}
}
三,优化总结
- 跳转前必须关闭中断 + 关闭 SysTick + 清空中断标志
- 让 APP0 和 APP1 完全隔离,互不干扰
- 解决:关机异常、黑屏、插 USB 不开机、跳转死机
|