芯片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字节,导致比对失败,本想开源的,但是诸多问题在里边,项目紧,放弃了自动更新的功能,以后做好了在拿出来~ |
没事,能帮我顶贴已经很感激了...
这个判断的是再RAM区,你不是要在FLASH里运行么?