欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0

IAP 架构下引导程序缺陷分析与代码优化整改

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、功能说明
  • 地址: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 不开机、跳转死机



高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-4-24 19:52

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表