完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
是这样的,我是想使用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_Hostinit(DISABLE); USBHS_HostInit(ENABLE); CHRV3DiskStatus = DISK_DISCONNECT; printf("disconnectn"); } } IWDG_ReloadCounter(); } |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
525 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2904 浏览 2 评论
2400 浏览 1 评论
871浏览 2评论
690浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
419浏览 1评论
533浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
815浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 23:30 , Processed in 1.313352 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号