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

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
帮顶                 
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版