芯片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)
{
}
}
}
何故?求解! |