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

2019-07-20 01:37发布

如题目,最近使用探索者开发板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! ");
        
        t++;
        printf("ffok...............%dkbyte ",t*2);

        if(readcount<2048)
        {
            printf("ffok............COMPLETE! ");
            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();


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Morgen
1楼-- · 2019-07-20 03:33
没人吼,自个儿顶一下。
正点原子
2楼-- · 2019-07-20 07:45
仿真是无法仿真APP程序的哦。
Morgen
3楼-- · 2019-07-20 11:26
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-20 13:42
Morgen 发表于 2019-5-29 10:03
原子哥,不是仿真APP程序,问题是芯片上电>复位>读取文件>擦除>写入>跳转的过程中后三步会出错。 无论在 ...

这个慢慢调吧

一周热门 更多>