OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3485|回复: 4

USB IAP跳转时报错,硬件复位后再次执行正常

[复制链接]

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-5-8
在线时间
24 小时
发表于 2019-5-27 15:44:58 | 显示全部楼层 |阅读模式
16金钱
如题目,最近使用探索者开发板STM32F407ZG做USB IAP功能,基础程序采用正点原子的USB HOST工程,再移植部分串口IAP工程生成的。
目前,所有模块均正常,根据串口打印信息显示,芯片启动后按照设计逻辑检测U盘和.bin文件,然后读取、擦除Flash、写入。
文件写入完成之后进行跳转,(如下面的代码所示),问题就出在这里。
1.在Debug时,下载程序到芯片,然后启动启动,完成写入进行跳转时报错,报错内容如图所示。接着编译器退出Debug。
如果在初始化阶段打断点,并点击复位按钮,重新再执行程序,一切正常!不会报错,芯片也正常跳转。

2.不连接烧录器(ST-link)直接上电启动时,主芯片可以进行跳转,但并未执行U盘内心的.bin文件代码,而是 执行了之前的代码。
两个猜想:

------怀疑应该是没有写入到Flash里,可能是擦除或写入的时候报错,使得程序直接跳转了(那为什么会报错呢?)。
------如果写入成功(跟Debug模式下相同),只是在跳转的时候出问题,那么问什么跳转过去是原来的程序??原来程序已经擦除了啊!(这个假设有点矛盾。。)

此时如果进行硬件复位,芯片重新启动就可以执行U盘里面的文件了,跳转后的程序也是U盘内的目标文件程序,一切正常(这个现象又和Debug模式下的现象高度一致!!)。


这个问题困扰了一个多星期了,没啥想法,网上也鲜有资料提到。至于STM32F4 IAP功能,应该是不需要硬件复位就能实现的,不知道别人是怎么做到的。
有大神如果了解这个问题,还请帮忙赐教,感激不尽。



跳转前的部分代码

        res = IAP_Flash_Write(USER_FLASH_IAP_ADDRESS+t*2048,filedatabuf,readcount/4);
        if(res != FR_OK)
        {
            printf("Flash Write No. %d K byte Error",t);
            goto updateerror;
        }
        printf("Flash.........OK!\n");
        
        t++;
        printf("ffok...............%dkbyte\n",t*2);

        if(readcount<2048)
        {
            printf("ffok............COMPLETE!\n");
            goto updateerror;
        }
  }
   
        updateerror:
        __asm("CPSID  I");
        RCC_AHB2PeriphClockCmd( RCC_AHB2Periph_OTG_FS, DISABLE);        //跳转前关闭USB外设时钟
        NVIC_DisableIRQ(OTG_FS_IRQn);                                                                //跳转时关闭总中断,跳转完成后开启
   
        JumpAddress = *(volatile uint32_t*) (USER_FLASH_IAP_ADDRESS + 4);
   
        pUserApp = (void (*)(void)) JumpAddress;
   
        /* Initialize user application's Stack Pointer */
        __set_PSP(*(volatile uint32_t*) USER_FLASH_IAP_ADDRESS);
   
        __set_CONTROL(0);
   
        __set_MSP(*(volatile uint32_t*) USER_FLASH_IAP_ADDRESS);
   
        pUserApp();


01.PNG

最佳答案

查看完整内容[请看2#楼]

原子哥,不是仿真APP程序,问题是芯片上电>复位>读取文件>擦除>写入>跳转的过程中后三步会出错。 无论在有没有执行到后三步时进行硬件复位(验证过软件复位也行),程序执行起来就正常了,会按照既定目标执行APP程序,否则只会跳转到原有APP程序。 就这个问题很困惑。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-5-8
在线时间
24 小时
 楼主| 发表于 2019-5-27 15:44:59 | 显示全部楼层
正点原子 发表于 2019-5-29 02:21
仿真是无法仿真APP程序的哦。

原子哥,不是仿真APP程序,问题是芯片上电>复位>读取文件>擦除>写入>跳转的过程中后三步会出错。 无论在有没有执行到后三步时进行硬件复位(验证过软件复位也行),程序执行起来就正常了,会按照既定目标执行APP程序,否则只会跳转到原有APP程序。 就这个问题很困惑。
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-5-8
在线时间
24 小时
 楼主| 发表于 2019-5-28 13:09:45 | 显示全部楼层
没人吼,自个儿顶一下。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-5-29 02:21:38 | 显示全部楼层
仿真是无法仿真APP程序的哦。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-5-30 02:39:35 | 显示全部楼层
Morgen 发表于 2019-5-29 10:03
原子哥,不是仿真APP程序,问题是芯片上电>复位>读取文件>擦除>写入>跳转的过程中后三步会出错。 无论在 ...

这个慢慢调吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 22:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表