wofei1314 发表于 2015-10-26 10:01:27

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字节,导致比对失败,本想开源的,但是诸多问题在里边,项目紧,放弃了自动更新的功能,以后做好了在拿出来~

一蓑烟雨zsy 发表于 2015-10-26 10:43:26

这个真心不会

wofei1314 发表于 2015-10-26 10:51:02

一蓑烟雨zsy 发表于 2015-10-26 10:43
这个真心不会

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

ropepeng 发表于 2015-10-26 11:23:31

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

zhoupxa 发表于 2015-10-26 11:42:44

请参考文档:http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00290444.pdf

peter001 发表于 2015-10-26 12:34:09

看一下官方iap例程

ropepeng 发表于 2015-10-26 12:46:30

接收的程序对么?

wofei1314 发表于 2015-10-26 13:49:52

谢谢各位的参考和建议,我晚上回去逐一检查,其它的还有什么地方不完善,请大家帮我指出来,谢谢

wofei1314 发表于 2015-10-26 14:38:39

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);
                  }

你好我好大家好! 发表于 2015-10-26 15:21:43

帮顶               
页: [1] 2
查看完整版本: IAP不跳转到APP的问题求解,结贴