求助用中斷方式讀寫(xiě)U盤(pán)發(fā)生了一些小問(wèn)題

大師您好: 我在用中斷0讀寫(xiě)U盤(pán)的時(shí)候發(fā)生了一些小問(wèn)題不知道該怎么解決,希望得到您的幫助: 1.我用的中斷程序是這樣的:但我把U盤(pán)拔出后中斷引腳還試,一直停在中斷子程序,我想讓它跳出來(lái),該怎么寫(xiě)啊? 2.我打開(kāi)了int0中斷后,我的程序里還需要打開(kāi)串口中斷ES=1;但寫(xiě)了這句話后就不能初始化375了,不知道大師有沒(méi)有什么解決的方法嗎? 謝謝您了!! int0(void) interrupt 0 using 0{ UINT8 i, c; UINT16 TotalCount; UINT8 code *pCodeStr;

printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤(pán)插入 */ /

for ( i = 0; i < 5; i ++ ) { /* 有的U盤(pán)總是返回未準(zhǔn)備好,不過(guò)可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤(pán)是否準(zhǔn)備好 */ }

printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/C51/CH375HFT.C" ); /* 文件名,該文件在C51子目錄下 */ i = CH375FileOpen( ); /* 打開(kāi)文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 沒(méi)有找到文件 */ if ( i == ERR_MISS_DIR ) pCodeStr = "/*"; /* C51子目錄不存在則列出根目錄下的文件 */ else pCodeStr = "/C51/CH375*"; /* CH375HFT.C文件不存在則列出\C51子目錄下的以CH375開(kāi)頭的文件 */ printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { /* 最多搜索前254個(gè)文件 */ i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*為通配符,適用于所有文件或者子目錄 */ /* 另外一種枚舉方法是,將此處的c置為0xFF,然后將真正的枚舉序號(hào)存放于CH375vFileSize中,從而可以搜索大于254個(gè)文件,從0到2147483647個(gè) */ mCmdParam.Open.mPathName[ i ] = c; /* 根據(jù)字符串長(zhǎng)度將結(jié)束符替換為搜索的序號(hào),從0到254 */ i = CH375FileOpen( ); /* 打開(kāi)文件,如果文件名中含有通配符*,則為搜索文件而不打開(kāi) */ if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已經(jīng)沒(méi)有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中 */ printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 顯示序號(hào)和搜索到的匹配文件名或者子目錄名 */ continue; /* 繼續(xù)搜索下一個(gè)匹配的文件名,下次搜索時(shí)序號(hào)會(huì)加1 */ } else { /* 出錯(cuò) */ mStopIfError( i ); break; } } } else { /* 找到文件或者出錯(cuò) */ mStopIfError( i ); TotalCount = 600; /* 準(zhǔn)備讀取總長(zhǎng)度 */ printf( "從文件中讀出的前%d個(gè)字符是:\n",TotalCount ); while ( TotalCount ) { /* 如果文件比較大,一次讀不完,可以再調(diào)用CH375ByteRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) */ if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; /* 剩余數(shù)據(jù)較多,限制單次讀寫(xiě)的長(zhǎng)度不能超過(guò) sizeof( mCmdParam.ByteRead.mByteBuffer ) */ else c = TotalCount; /* 最后剩余的字節(jié)數(shù) */ mCmdParam.ByteRead.mByteCount = c; /* 請(qǐng)求讀出幾十字節(jié)數(shù)據(jù) */ i = CH375ByteRead( ); /* 以字節(jié)為單位讀取數(shù)據(jù)塊,單次讀寫(xiě)的長(zhǎng)度不能超過(guò)MAX_BYTE_IO,第二次調(diào)用時(shí)接著剛才的向后讀 */ mStopIfError( i ); TotalCount -= mCmdParam.ByteRead.mByteCount; /* 計(jì)數(shù),減去當(dāng)前實(shí)際已經(jīng)讀出的字符數(shù) */ for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] ); /* 顯示讀出的字符 */ if ( mCmdParam.ByteRead.mByteCount < c ) { /* 實(shí)際讀出的字符數(shù)少于要求讀出的字符數(shù),說(shuō)明已經(jīng)到文件的結(jié)尾 */ printf( "\n" ); printf( "文件已經(jīng)結(jié)束\n" ); break; } }

printf( "Close\n" ); i = CH375FileClose( ); /* 關(guān)閉文件 */ mStopIfError( i ); }

#ifdef EN_DISK_WRITE /* 子程序庫(kù)支持寫(xiě)操作 */ /* 產(chǎn)生新文件 */ LED_WR_ACT( ); /* 寫(xiě)操作 */ printf( "Create\n" ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/NEWFILE.TXT" ); /* 新文件名,在根目錄下,中文文件名 */ i = CH375FileCreate( ); /* 新建文件并打開(kāi),如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); printf( "Write\n" ); pCodeStr = "Note: \xd\xa這個(gè)程序是以字節(jié)為單位進(jìn)行U盤(pán)文件讀寫(xiě),單片機(jī)只需要有600字節(jié)的RAM\xd\xa"; while( 1 ) { /* 分多次寫(xiě)入文件數(shù)據(jù) */ for ( i=0; i c = *pCodeStr; mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; /* 源字符串結(jié)束 */ pCodeStr++; } if ( i == 0 ) break; /* 源字符串結(jié)束,完成寫(xiě)文件 */ mCmdParam.ByteWrite.mByteCount = i; /* 寫(xiě)入數(shù)據(jù)的字符數(shù),單次讀寫(xiě)的長(zhǎng)度不能超過(guò)MAX_BYTE_IO,第二次調(diào)用時(shí)接著剛才的向后寫(xiě) */ i = CH375ByteWrite( ); /* 向文件寫(xiě)入數(shù)據(jù) */ mStopIfError( i ); }

printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 1; /* 自動(dòng)計(jì)算文件長(zhǎng)度,以字節(jié)為單位寫(xiě)文件,建議讓程序庫(kù)關(guān)閉文件以便自動(dòng)更新文件長(zhǎng)度 */ i = CH375FileClose( ); mStopIfError( i );

LED_WR_INACT( );

*/ #endif LED_RUN_INACT( ); printf( "Take out\n" ); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤(pán)拔出 */

LED_OUT_INACT( ); /* LED滅 */ mDelay100mS( ); mDelay100mS( ); }

大師。快幫幫我啊


你是把芯片的INT#腳接單片機(jī)的中斷0腳嗎?在你拔出U盤(pán)時(shí),芯片會(huì)產(chǎn)生一個(gè)USB設(shè)備拔出的中斷(0X16),這樣的話,又會(huì)進(jìn)中斷程序,但一直停在了等待U盤(pán)插入的程序,所以一直出不來(lái)。 打不開(kāi)串口中斷和芯片的初始化沒(méi)有關(guān)系,你查一下是不是打開(kāi)串口中斷之后,導(dǎo)致程序根本沒(méi)有往下運(yùn)行初始化375的程序。


謝謝大師,我的問(wèn)題已經(jīng)解決了,是 mInitSTDIO( )和串口中斷發(fā)生問(wèn)題了,呵呵,謝謝您了


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频