你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IAP不跳转到APP的问题求解,结贴

[复制链接]
wofei1314 提问时间:2015-10-26 10:01 /
芯片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 发布时间:2015-10-26 10:01

举报

10个回答
一蓑烟雨zsy 回答时间:2015-10-26 10:43:26
这个真心不会
wofei1314 回答时间:2015-10-26 10:51:02

没事,能帮我顶贴已经很感激了...
ropepeng 回答时间:2015-10-26 11:23:31
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)                //若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
  这个判断的是再RAM区,你不是要在FLASH里运行么?
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
  1. FLASH_Unlock();
  2.                     for (i=0; i<64/4; i++)
  3.                     {
  4.                         //第一字节作为标识符,第二字节留空,第三四字节作为校验,此版本不判断
  5.                         tmp.U8[0] = tmpbuf[(i*4)+0];
  6.                         tmp.U8[1] = tmpbuf[(i*4)+1];
  7.                         tmp.U8[2] = tmpbuf[(i*4)+2];
  8.                         tmp.U8[3] = tmpbuf[(i*4)+3];
  9. //                        tmp = *(UN_WORD *)(&tmpbuf+i*4);
  10.                         flashSta = FLASH_ProgramWord(ApplicationAddress + flash_addr+ (i*4), tmp.U32);
  11.                         if (tmp.U32 != *(__IO u32* )(ApplicationAddress + flash_addr+ (i*4)))
  12.                         {
  13.                             memset(txbuf,0, U_BUF_SIZE);
  14.                             sprintf((char *)txbuf,"ERR,%d\r\n",flash_addr);               
  15.                             len = strlen((char *)txbuf);
  16.                             USB_TxWrite(txbuf, len);
  17.                             break;//校验出错,退出,上位机需做相应的处理
  18.                         }
  19.                     }
  20.                     flash_addr += 64;
  21.                     FLASH_Lock();
  22.                     if (i >= 64/4)
  23.                     {
  24.                         memset(txbuf,0, U_BUF_SIZE);
  25.                         sprintf((char *)txbuf,"OK,%d\r\n",flash_addr);               
  26.                         len = strlen((char *)txbuf);
  27.                         USB_TxWrite(txbuf, len);
  28.                         //memset(txbuf,0, U_BUF_SIZE);
  29.                     }
复制代码
你好我好大家好! 回答时间:2015-10-26 15:21:43
帮顶                 
aabird 回答时间:2015-10-26 18:35:43
支持,顶,没遇到过但是支持

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版