stm32 iAP成功跳转APP 但是没有执行 正解在5楼

2019-12-17 21:29发布

本帖最后由 天涯行客 于 2014-12-4 12:37 编辑

程序所有配置都没有问题,就是不执行APP程序,不知道怎么回事啊 2014-12-04_105927.png (77.37 KB, 下载次数: 4) 下载附件 2014-12-4 11:00 上传

程序跳转代码

        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
        {
            SerialPutString("Execute user Program ");

            JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
            Jump_To_Application = (pFunction) JumpAddress;

            __set_MSP(*(__IO uint32_t*) ApplicationAddress);
            Jump_To_Application();
        }
#define ApplicationAddress    0x8010000


我APP程序比较大 生成的BIN文件有60K左右,会是堆栈溢出的问题吗?


正解在5楼
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
64条回答
我不怕
1楼-- · 2019-12-25 07:08
这个问题对于使用过iap功能肯定会遇到的,一般两个地方的问题。一个就是五楼所说的,从boot走之前关闭所有涉及到的中断,另外就是应用层需要设置中断向量表起始地址!
2427295@qq.com
2楼-- · 2019-12-25 07:50
   __set_PRIMASK(1);
  /* Test if user code is programmed starting from address "ApplicationAddress" */
  if (((*(__IO uint32_t*)jumpAddr) & 0x2FFE0000 ) == 0x20000000)
  {
    __ASM("CPSID  I");
   
    JumpAddress = *(__IO uint32_t*) (jumpAddr + 4);
   
    /* Jump to user application */
    Jump_To_Application = (pFunction) JumpAddress;
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) jumpAddr);//设置堆栈指针
    Jump_To_Application();
  }

遇到了同样的问题,iap更新完app后直接跳转到app不是每次都失败,有时可以有时执行不起来(在app main最开始位置点灯),跳转前也关闭了中断,app运行SystemInit函数时重设了中断向量表。
最后解决办法是iap更新完app后,软复位cpu,NVIC_SystemReset();
复位后重新运行iap,在main开始运行就跳转。可以
我怀疑是某些寄存器没被复位导致,不知道怎么深究哪个寄存器影响了直接跳转
2427295@qq.com
3楼-- · 2019-12-25 11:51
 精彩回答 2  元偷偷看……
Maurice
4楼-- · 2019-12-25 12:14
2427295@qq.com 发表于 2017-12-14 14:25
我按照你的方法是了,还是有问题,最后复位cpu才能解决

你是咋复位的,NVIC_SystemReset?
ma_xiang
5楼-- · 2019-12-25 14:39
STM32  IAP 中断设置
2427295@qq.com
6楼-- · 2019-12-25 20:35
Maurice 发表于 2017-12-18 21:55
你是咋复位的,NVIC_SystemReset?

是的。。。。。

一周热门 更多>