是这样的,我是想使用U盘通过IAP更新APP程序,我是使用例程:EXAMIAPUSB+UARTTCHV30x_IAP修改的程序,在程序中屏蔽了usbhs device,添加U盘的usbhs host;在全部修改后,我发现一旦我程序里有CH103子程序库的读取函数,就会复位后芯片完全没有反应(有点像死机,具体还不太清楚);
现在就是添加了U盘的IAP下载代码,原有的串口IAP下载都无法使用了
具体就是代码中出现了ret = CHRV3ByteRead( );函数,没有调用都会导致IAP下载后复位没有反应
不知道是不是CH103子程序库和IAP程序不兼容吗?希望解答一下谢谢!
部分程序
while(1)
{
//串口,只是为了验证程序可以通过串口升级
if( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET){
UART_Rx_Deal();
}
//U盘,在整个过程我没有链接U盘,所以就代码来说下面代码是不会执行的,
//但我使用上面的串口进行在IAP下载成功后,通过复位按键或断电复位芯片完全没有反应
//通过排查,在程序中出现了CHRV3ByteRead函数后,就出现复位后没有反应的问题,
//一旦屏蔽CHRV3ByteRead函数,就可以通过上面的串口进行IAP下载,并复位后可以跳转到APP正常运行
if( USBHSH->INT_FG & USBHS_DETECT_FLAG )
{
USBHSH->INT_FG = USBHS_DETECT_FLAG;
if( USBHSH->MIS_ST & USBHS_ATTCH )
{
ret = USBHS_HostEnum( );
if( ret == ERR_SUCCESS )
{
printf( "Enum Succeedrn" );
Delay_Ms(100);
// U盘操作流程:USB总线复位、U盘连接、获取设备描述符和设置USB地址、可选的获取配置描述符,之后到达此处,由CH103子程序库继续完成后续工作
CHRV3DiskStatus = DISK_USB_ADDR;
printf( "Wait DiskReadyrn" );
ret = CHRV3DiskReady( ); //等待U盘准备好
if ( ret == ERR_SUCCESS )
{
printf("CHRV3DiskStatus:%02xrn",CHRV3DiskStatus);
/* 读文件 */
strcpy( (PCHAR)mCmdParam.Open.mPathName, "/708/EXAM_ALL.BIN" ); //设置将要操作的文件路径和文件名
ret = CHRV3FileOpen( ); //打开文件
if ( ret == ERR_MISS_DIR || ret == ERR_MISS_FILE ) //没有找到文件
{
printf("没有找到文件rn");
}
else
{
adr=0;
mCmdParam.ByteLocate.mByteOffset = 0x00; //移到文件的开头
CHRV3ByteLocate( );
i = CHRV3FileQuery( ); //查询当前文件的信息
mStopIfError( i );
printf( "file size:%urn",CHRV3vFileSize );
memset(buf,0,sizeof(buf));
USB_Deal(buf,2,CMD_IAP_ERASE,adr); //IAP开始命令
///////////二、读取文件字节/////////////////////////////////////////
TotalCount = CHRV3vFileSize; //设置准备读取总长度100字节
while ( TotalCount )
{
//如果文件比较大,一次读不完,可以再调用CH103ByteRead继续读取,文件指针自动向后移动
//模拟串口的数据包大小
if ( TotalCount > 60 ) t = 60;/* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.Other.mBuffer ) */
else t = TotalCount; /* 最后剩余的字节数 */
mCmdParam.ByteRead.mByteCount = t; /* 请求读出几十字节数据 */
mCmdParam.ByteRead.mByteBuffer= &buf[0];
//在程序中出现了CHRV3ByteRead函数,就算没有调用,在IAP下载成功后,复位芯片就完全没有反应!!!
// ret = CHRV3ByteRead( ); /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */
TotalCount -= mCmdParam.ByteRead.mByteCount; /* 计数,减去当前实际已经读出的字符数 */
USB_Deal(buf,mCmdParam.ByteRead.mByteCount,CMD_IAP_PROM,adr); //发送数据并写入FLASH
adr += mCmdParam.ByteRead.mByteCount; //IAP数据地址偏移
//数据查看
// for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ )
// {
// printf( "%c", buf[i] ); /* 显示读出的字符 */
// }
// if ( mCmdParam.ByteRead.mByteCount < t )
// {
// /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
// printf( "rn" );
// printf( "文件已经结束rn" );
// break;
// }
}
printf("IAP END,To verifyrn");
//验证数据
adr = 0;
mCmdParam.ByteLocate.mByteOffset = 0x00; //移到文件的开头
CHRV3ByteLocate( );
i = CHRV3FileQuery( ); //查询当前文件的信息
mStopIfError( i );
// printf( "file size:%urn",CHRV3vFileSize );
TotalCount = CHRV3vFileSize; //设置准备读取总长度100字节
while ( TotalCount )
{ //如果文件比较大,一次读不完,可以再调用CH103ByteRead继续读取,文件指针自动向后移动
if ( TotalCount > 60 ) t = 60;/* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.Other.mBuffer ) */
else t = TotalCount; /* 最后剩余的字节数 */
mCmdParam.ByteRead.mByteCount = t; /* 请求读出几十字节数据 */
mCmdParam.ByteRead.mByteBuffer= &buf[0];
// ret = CHRV3ByteRead( ); /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */
TotalCount -= mCmdParam.ByteRead.mByteCount; /* 计数,减去当前实际已经读出的字符数 */
USB_Deal(buf,mCmdParam.ByteRead.mByteCount,CMD_IAP_VERIFY,adr); //发送数据,这里会进行对比
adr += mCmdParam.ByteRead.mByteCount; //IAP数据地址偏移
// for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ )
// {
// printf( "%c", buf[i] ); /* 显示读出的字符 */
// }
// if ( mCmdParam.ByteRead.mByteCount < t )
// {
// /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
// printf( "rn" );
// printf( "文件已经结束rn" );
// break;
// }
}
adr= 0;
USB_Deal(buf,2,CMD_IAP_END,adr); //IAP结束命令
printf( "Closern" );
i = CHRV3FileClose( ); /* 关闭文件 */
mStopIfError( i );
}
break;
}
else
{
printf("s = %02xrn",ret);
printf("CHRV3DiskStatus:%02xn",CHRV3DiskStatus);
}
// Delay_Ms( 50 );
}
else
{
}
}
else
{
USBHS_Hos
tinit(DISABLE);
USBHS_HostInit(ENABLE);
CHRV3DiskStatus = DISK_DISCONNECT;
printf("disconnectn");
}
}
IWDG_ReloadCounter();
}