STM32/STM8技术论坛
直播中

李娟

7年用户 1304经验值
私信 关注
[问答]

IAP不跳转到APP

芯片STM32F103RBT6,APP起始地址:0x8005000
IAP程序擦除了 0x800500以后的Flash区域,擦除正常,烧写正常


APP,keil设置,Flash起始地址设了 0x8005000,选择了生产 Bin文件
APP的main函数一开始就设置了 SCB->VTOR = FLASH_BASE | 0x5000;


然后IAP程序中到了这个函数,直接走的是else....  
//执行用户程序
void ExecuteUserPro(void)
{
    //判断用户是否已经下载程序,因为正常情况下此地址是栈地址。
    if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)                //若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
    {
        debugOUT("Execute user Program !");
        //跳转至用户代码
        JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
        Jump_To_Application = (pFunction) JumpAddress;


        //初始化用户程序的堆栈指针
        __set_MSP(*(__IO uint32_t*) ApplicationAddress);
        Jump_To_Application();
    }
    else
    {
        debugOUT("no user Program..");
        debugOUT("Restart the device and");
        BSP_TimClose(TIM_3);//停止闪烁
        IO_RESET(eLED_1);//常亮LED
        while(1)
        {
        }
    }
}




何故?求解!


====================================================================================================
谢谢大家
原因找到了,就是APP烧录的时候,出错了,无意偏移了64字节,导致比对失败,本想开源的,但是诸多问题在里边,项目紧,放弃了自动更新的功能,以后做好了在拿出来~

回帖(10)

陈政竹

2019-2-25 07:20:33
这个真心不会
举报

李娟

2019-2-25 07:32:32
引用: wumiaohui 发表于 2019-2-25 13:42
这个真心不会

没事,能帮我顶贴已经很感激了...
举报

李焯尤

2019-2-25 07:46:52
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)                //若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
  这个判断的是再RAM区,你不是要在FLASH里运行么?
举报

陈利妮

2019-2-25 08:02:09
看一下官方iap例程
举报

李焯尤

2019-2-25 08:18:58
接收的程序对么?
举报

李娟

2019-2-25 08:36:04
谢谢各位的参考和建议,我晚上回去逐一检查,其它的还有什么地方不完善,请大家帮我指出来,谢谢
举报

李娟

2019-2-25 08:54:09
引用: 梓木鱼之子 发表于 2019-2-25 14:40
接收的程序对么?

举报

黄敏

2019-2-25 09:02:28
帮顶                 
举报

罗宗保

2019-2-25 09:17:49
支持,顶,没遇到过但是支持
举报

更多回帖

发帖
×
20
完善资料,
赚取积分