如题目,最近使用探索者开发板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();
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>