中级会员
 
- 积分
- 292
- 金钱
- 292
- 注册时间
- 2018-8-14
- 在线时间
- 37 小时
|
10金钱
用正点原子的串口IAP程序,移植了一份USB的升级程序,出现的一些问题
USB—IAP功能:识别U盘中的驱动文件(FAT32),读到APP-BUFF中,然后while循环中写入内部FLASH,跳转到APP
USART-APP功能:串口 ,LED
USB-APP功能:U盘读写,串口 ,LED
问题;
1、如果是插着U盘升级,在拔出U盘的时候,APP程序会死机。如果拔出U盘后在升级就没事,是不是跳转前要屏蔽一些中断啊?
2、升级USB-APP,怎么都不好使,跳到APP就死了,我尝试跳转前屏蔽中断,但好像没什么作用?
怀疑是中断问题引起的,但是具体屏蔽那些中断,在哪屏蔽,请教大佬
IAP代码
int USBH_USR_MSC_Application(void)
{
res = f_open(&file, "0:driver.bin", FA_READ);
if (res == FR_OK)
{
//获取驱动文件大小
applenth = f_size(&file);
if (applenth) /* EOF or Error */
{
printf("开始更新固件...\r\n");
printf("代码长度:%dBytes\r\n",applenth);
res = f_read(&file,APP_RX_BUF,applenth,&fnum);//APP程序复制到缓存
if(res == FR_OK)
{
APP_RX_STA = 1;
USBH_USR_ApplicationState = USH_USR_FS_READLIST;
}else
{
printf("更新固件Eorr:%d\r\n",res);
}
}
else
{
printf("固件损坏Eorror:%d\r\n",res);
/* close file and filesystem */
USBH_USR_ApplicationState = USH_USR_FS_WRITEFILE;
}
}
else
{
printf("没有可以更新的固件!\r\n");
USBH_USR_ApplicationState = USH_USR_FS_DRAW;
}
f_close(&file);
}
while (1)
{
USBH_Process(&USB_OTG_Core, &USB_Host);
if((FF_TEST == 1) && (APP_RX_STA == 1))
{
// INTX_DISABLE();
if(applenth)
{
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,APP_RX_BUF,applenth);//更新FLASH代码
printf("固件更新完成!\r\n");
}
applenth = 0;
}
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
printf("开始执行FLASH用户代码!!\r\n");
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}else
{
printf("非FLASH应用程序,无法执行!\r\n");
}
FF_TEST = 0;
APP_RX_STA =0;
}
}
|
|