WCH沁恒单片机
直播中

萧蔼晨

7年用户 958经验值
私信 关注
[问答]

CH32V307的U盘中bin文件的IAP程序下载后无法启动怎么解决?

是这样的,我是想使用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)

李倩

2022-9-16 09:49:21
您好,附件为CH32V307 U盘IAP升级例程,可以参考一下
CH32V307 U盘IAP.zip
举报

更多回帖

发帖
×
20
完善资料,
赚取积分