是這樣的,我是想使用U盤通過IAP更新APP程序,我是使用例程:EXAM\IAP\USB+UARTT\CHV30x_IAP修改的程序,在程序中屏蔽了usbhs device,添加U盤的usbhs host;在全部修改后,我發(fā)現(xiàn)一旦我程序里有CH103子程序庫(kù)的讀取函數(shù),就會(huì)復(fù)位后芯片完全沒有反應(yīng)(有點(diǎn)像死機(jī),具體還不太清楚);
現(xiàn)在就是添加了U盤的IAP下載代碼,原有的串口IAP下載都無(wú)法使用了
具體就是代碼中出現(xiàn)了ret = CHRV3ByteRead( );函數(shù),沒有調(diào)用都會(huì)導(dǎo)致IAP下載后復(fù)位沒有反應(yīng)
不知道是不是CH103子程序庫(kù)和IAP程序不兼容嗎?希望解答一下謝謝!
部分程序
while(1) ????{ ????????//串口,只是為了驗(yàn)證程序可以通過串口升級(jí) ????????if(?USART_GetFlagStatus(USART1,?USART_FLAG_RXNE)?!=?RESET){ ????????????UART_Rx_Deal(); ????????} ????????//U盤,在整個(gè)過程我沒有鏈接U盤,所以就代碼來說下面代碼是不會(huì)執(zhí)行的, ????????//但我使用上面的串口進(jìn)行在IAP下載成功后,通過復(fù)位按鍵或斷電復(fù)位芯片完全沒有反應(yīng) ????????//通過排查,在程序中出現(xiàn)了CHRV3ByteRead函數(shù)后,就出現(xiàn)復(fù)位后沒有反應(yīng)的問題, ????????//一旦屏蔽CHRV3ByteRead函數(shù),就可以通過上面的串口進(jìn)行IAP下載,并復(fù)位后可以跳轉(zhuǎn)到APP正常運(yùn)行 ????????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?Succeed\r\n"?); ????????????????????Delay_Ms(100); ????????????????????//?U盤操作流程:USB總線復(fù)位、U盤連接、獲取設(shè)備描述符和設(shè)置USB地址、可選的獲取配置描述符,之后到達(dá)此處,由CH103子程序庫(kù)繼續(xù)完成后續(xù)工作 ????????????????????CHRV3DiskStatus?=?DISK_USB_ADDR; ??????????????????????????printf(?"Wait?DiskReady\r\n"?); ??????????????????????????ret?=?CHRV3DiskReady(?);?????????????????????????????????//等待U盤準(zhǔn)備好 ??????????????????????????if?(?ret?==?ERR_SUCCESS?) ??????????????????????????{ ??????????????????????????????printf("CHRV3DiskStatus:%02x\r\n",CHRV3DiskStatus); ??????????????????????????????/*?讀文件?*/ ??????????????????????????????strcpy(?(PCHAR)mCmdParam.Open.mPathName,?"/708/EXAM_ALL.BIN"?);??//設(shè)置將要操作的文件路徑和文件名 ??????????????????????????????ret?=?CHRV3FileOpen(?);???????????????????????????????????????//打開文件 ??????????????????????????????if?(?ret?==?ERR_MISS_DIR?||?ret?==?ERR_MISS_FILE?)????????????//沒有找到文件 ??????????????????????????????{ ??????????????????????????????????printf("沒有找到文件\r\n"); ??????????????????????????????} ??????????????????????????????else ??????????????????????????????{ ??????????????????????????????????adr=0; ??????????????????????????????????mCmdParam.ByteLocate.mByteOffset?=?0x00;??//移到文件的開頭 ??????????????????????????????????CHRV3ByteLocate(?); ??????????????????????????????????i?=?CHRV3FileQuery(?);??????????????????//查詢當(dāng)前文件的信息 ??????????????????????????????????mStopIfError(?i?); ??????????????????????????????????printf(?"file?size:%u\r\n",CHRV3vFileSize?); ??????????????????????????????????memset(buf,0,sizeof(buf)); ??????????????????????????????????USB_Deal(buf,2,CMD_IAP_ERASE,adr);????//IAP開始命令 ??????????????????????????????????///////////二、讀取文件字節(jié)///////////////////////////////////////// ??????????????????????????????????TotalCount?=?CHRV3vFileSize;??????????????????????????????????????//設(shè)置準(zhǔn)備讀取總長(zhǎng)度100字節(jié) ??????????????????????????????????while?(?TotalCount?) ??????????????????????????????????{? ??????????????????????????????????????//如果文件比較大,一次讀不完,可以再調(diào)用CH103ByteRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) ??????????????????????????????????????//模擬串口的數(shù)據(jù)包大小 ??????????????????????????????????????if?(?TotalCount?>?60?)?t?=?60;/*?剩余數(shù)據(jù)較多,限制單次讀寫的長(zhǎng)度不能超過?sizeof(?mCmdParam.Other.mBuffer?)?*/ ??????????????????????????????????????else?t?=?TotalCount;?????????????????????????????????/*?最后剩余的字節(jié)數(shù)?*/ ??????????????????????????????????????mCmdParam.ByteRead.mByteCount?=?t;???????????????????/*?請(qǐng)求讀出幾十字節(jié)數(shù)據(jù)?*/ ??????????????????????????????????????mCmdParam.ByteRead.mByteBuffer=?&buf[0]; //在程序中出現(xiàn)了CHRV3ByteRead函數(shù),就算沒有調(diào)用,在IAP下載成功后,復(fù)位芯片就完全沒有反應(yīng)?。。? //??????????????????????????????????????ret?=?CHRV3ByteRead(?);????????????????????????????????/*?以字節(jié)為單位讀取數(shù)據(jù)塊,單次讀寫的長(zhǎng)度不能超過MAX_BYTE_IO,第二次調(diào)用時(shí)接著剛才的向后讀?*/ ??????????????????????????????????????TotalCount?-=?mCmdParam.ByteRead.mByteCount;???????????/*?計(jì)數(shù),減去當(dāng)前實(shí)際已經(jīng)讀出的字符數(shù)?*/ ??????????????????????????????????????USB_Deal(buf,mCmdParam.ByteRead.mByteCount,CMD_IAP_PROM,adr);?//發(fā)送數(shù)據(jù)并寫入FLASH ??????????????????????????????????????adr?+=?mCmdParam.ByteRead.mByteCount;?//IAP數(shù)據(jù)地址偏移 ??????????????????????????????????????//數(shù)據(jù)查看 //??????????????????????????????????????for?(?i=0;?i!=mCmdParam.ByteRead.mByteCount;?i++?) //??????????????????????????????????????{ //??????????????????????????????????????????printf(?"%c",?buf[i]?);??/*?顯示讀出的字符?*/ //??????????????????????????????????????} //??????????????????????????????????????if?(?mCmdParam.ByteRead.mByteCount?<?t?) //??????????????????????????????????????{ //??????????????????????????????????????????/*?實(shí)際讀出的字符數(shù)少于要求讀出的字符數(shù),說明已經(jīng)到文件的結(jié)尾?*/ //??????????????????????????????????????????printf(?"\r\n"?); //??????????????????????????????????????????printf(?"文件已經(jīng)結(jié)束\r\n"?); //??????????????????????????????????????????break; //??????????????????????????????????????} ??????????????????????????????????} ??????????????????????????????????printf("IAP?END,To?verify\r\n"); ??????????????????????????????????//驗(yàn)證數(shù)據(jù) ??????????????????????????????????adr?=?0; ??????????????????????????????????mCmdParam.ByteLocate.mByteOffset?=?0x00;??//移到文件的開頭 ??????????????????????????????????CHRV3ByteLocate(?); ??????????????????????????????????i?=?CHRV3FileQuery(?);??????????????????//查詢當(dāng)前文件的信息 ??????????????????????????????????mStopIfError(?i?); //??????????????????????????????????printf(?"file?size:%u\r\n",CHRV3vFileSize?); ??????????????????????????????????TotalCount?=?CHRV3vFileSize;??????????????????????????????????????//設(shè)置準(zhǔn)備讀取總長(zhǎng)度100字節(jié) ??????????????????????????????????while?(?TotalCount?) ??????????????????????????????????{??????????????????????????????????????????????????????//如果文件比較大,一次讀不完,可以再調(diào)用CH103ByteRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) ??????????????????????????????????????if?(?TotalCount?>?60?)?t?=?60;/*?剩余數(shù)據(jù)較多,限制單次讀寫的長(zhǎng)度不能超過?sizeof(?mCmdParam.Other.mBuffer?)?*/ ??????????????????????????????????????else?t?=?TotalCount;?????????????????????????????????/*?最后剩余的字節(jié)數(shù)?*/ ??????????????????????????????????????mCmdParam.ByteRead.mByteCount?=?t;???????????????????/*?請(qǐng)求讀出幾十字節(jié)數(shù)據(jù)?*/ ??????????????????????????????????????mCmdParam.ByteRead.mByteBuffer=?&buf[0]; //??????????????????????????????????????ret?=?CHRV3ByteRead(?);????????????????????????????????/*?以字節(jié)為單位讀取數(shù)據(jù)塊,單次讀寫的長(zhǎng)度不能超過MAX_BYTE_IO,第二次調(diào)用時(shí)接著剛才的向后讀?*/ ??????????????????????????????????????TotalCount?-=?mCmdParam.ByteRead.mByteCount;???????????/*?計(jì)數(shù),減去當(dāng)前實(shí)際已經(jīng)讀出的字符數(shù)?*/ ??????????????????????????????????????USB_Deal(buf,mCmdParam.ByteRead.mByteCount,CMD_IAP_VERIFY,adr);?//發(fā)送數(shù)據(jù),這里會(huì)進(jìn)行對(duì)比 ??????????????????????????????????????adr?+=?mCmdParam.ByteRead.mByteCount;?//IAP數(shù)據(jù)地址偏移 //??????????????????????????????????????for?(?i=0;?i!=mCmdParam.ByteRead.mByteCount;?i++?) //??????????????????????????????????????{ //??????????????????????????????????????????printf(?"%c",?buf[i]?);??/*?顯示讀出的字符?*/ //??????????????????????????????????????} //??????????????????????????????????????if?(?mCmdParam.ByteRead.mByteCount?<?t?) //??????????????????????????????????????{ //??????????????????????????????????????????/*?實(shí)際讀出的字符數(shù)少于要求讀出的字符數(shù),說明已經(jīng)到文件的結(jié)尾?*/ //??????????????????????????????????????????printf(?"\r\n"?); //??????????????????????????????????????????printf(?"文件已經(jīng)結(jié)束\r\n"?); //??????????????????????????????????????????break; //??????????????????????????????????????} ??????????????????????????????????} ??????????????????????????????????adr=?0; ??????????????????????????????????USB_Deal(buf,2,CMD_IAP_END,adr);????//IAP結(jié)束命令 ??????????????????????????????????printf(?"Close\r\n"?); ??????????????????????????????????i?=?CHRV3FileClose(?);????????????????????????????????????/*?關(guān)閉文件?*/ ??????????????????????????????????mStopIfError(?i?); ??????????????????????????????} ??????????????????????????????break; ??????????????????????????} ??????????????????????????else ??????????????????????????{ ??????????????????????????????printf("s?=?%02x\r\n",ret); ??????????????????????????????printf("CHRV3DiskStatus:%02x\n",CHRV3DiskStatus); ??????????????????????????} ??????//????????????????????Delay_Ms(?50?); ????????????????} ????????????????else ????????????????{ ????????????????} ????????????} ????????????else ????????????{ ????????????????USBHS_HostInit(DISABLE); ????????????????USBHS_HostInit(ENABLE); ????????????????CHRV3DiskStatus?=?DISK_DISCONNECT; ????????????????printf("disconnect\n"); ????????????} ????????} ????????IWDG_ReloadCounter(); ????}