IAP不跳转到APP的问题求解,结贴
芯片STM32F103RBT6,APP起始地址:0x8005000IAP程序擦除了 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字节,导致比对失败,本想开源的,但是诸多问题在里边,项目紧,放弃了自动更新的功能,以后做好了在拿出来~
这个真心不会 一蓑烟雨zsy 发表于 2015-10-26 10:43
这个真心不会
没事,能帮我顶贴已经很感激了... if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
这个判断的是再RAM区,你不是要在FLASH里运行么?
请参考文档:http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00290444.pdf 看一下官方iap例程 接收的程序对么? 谢谢各位的参考和建议,我晚上回去逐一检查,其它的还有什么地方不完善,请大家帮我指出来,谢谢 ropepeng 发表于 2015-10-26 12:46
接收的程序对么?
FLASH_Unlock();
for (i=0; i<64/4; i++)
{
//第一字节作为标识符,第二字节留空,第三四字节作为校验,此版本不判断
tmp.U8 = tmpbuf[(i*4)+0];
tmp.U8 = tmpbuf[(i*4)+1];
tmp.U8 = tmpbuf[(i*4)+2];
tmp.U8 = tmpbuf[(i*4)+3];
// tmp = *(UN_WORD *)(&tmpbuf+i*4);
flashSta = FLASH_ProgramWord(ApplicationAddress + flash_addr+ (i*4), tmp.U32);
if (tmp.U32 != *(__IO u32* )(ApplicationAddress + flash_addr+ (i*4)))
{
memset(txbuf,0, U_BUF_SIZE);
sprintf((char *)txbuf,"ERR,%d\r\n",flash_addr);
len = strlen((char *)txbuf);
USB_TxWrite(txbuf, len);
break;//校验出错,退出,上位机需做相应的处理
}
}
flash_addr += 64;
FLASH_Lock();
if (i >= 64/4)
{
memset(txbuf,0, U_BUF_SIZE);
sprintf((char *)txbuf,"OK,%d\r\n",flash_addr);
len = strlen((char *)txbuf);
USB_TxWrite(txbuf, len);
//memset(txbuf,0, U_BUF_SIZE);
} 帮顶
页:
[1]
2