求助用中断方式读写U盘发生了一些小问题

大师您好: 我在用中断0读写U盘的时候发生了一些小问题不知道该怎么解决,希望得到您的帮助: 1.我用的中断程序是这样的:但我把U盘拔出后中断引脚还试,一直停在中断子程序,我想让它跳出来,该怎么写啊? 2.我打开了int0中断后,我的程序里还需要打开串口中断ES=1;但写了这句话后就不能初始化375了,不知道大师有没有什么解决的方法吗? 谢谢您了!! int0(void) interrupt 0 using 0{ UINT8 i, c; UINT16 TotalCount; UINT8 code *pCodeStr;

printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ /

for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ }

printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/C51/CH375HFT.C" ); /* 文件名,该文件在C51子目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 没有找到文件 */ if ( i == ERR_MISS_DIR ) pCodeStr = "/*"; /* C51子目录不存在则列出根目录下的文件 */ else pCodeStr = "/C51/CH375*"; /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */ printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { /* 最多搜索前254个文件 */ i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ /* 另外一种枚举方法是,将此处的c置为0xFF,然后将真正的枚举序号存放于CH375vFileSize中,从而可以搜索大于254个文件,从0到2147483647个 */ mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到254 */ i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名 */ continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */ } else { /* 出错 */ mStopIfError( i ); break; } } } else { /* 找到文件或者出错 */ mStopIfError( i ); TotalCount = 600; /* 准备读取总长度 */ printf( "从文件中读出的前%d个字符是:\n",TotalCount ); while ( TotalCount ) { /* 如果文件比较大,一次读不完,可以再调用CH375ByteRead继续读取,文件指针自动向后移动 */ if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */ else c = TotalCount; /* 最后剩余的字节数 */ mCmdParam.ByteRead.mByteCount = c; /* 请求读出几十字节数据 */ i = CH375ByteRead( ); /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */ mStopIfError( i ); TotalCount -= mCmdParam.ByteRead.mByteCount; /* 计数,减去当前实际已经读出的字符数 */ for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] ); /* 显示读出的字符 */ if ( mCmdParam.ByteRead.mByteCount < c ) { /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */ printf( "\n" ); printf( "文件已经结束\n" ); break; } }

printf( "Close\n" ); i = CH375FileClose( ); /* 关闭文件 */ mStopIfError( i ); }

#ifdef EN_DISK_WRITE /* 子程序库支持写操作 */ /* 产生新文件 */ LED_WR_ACT( ); /* 写操作 */ printf( "Create\n" ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/NEWFILE.TXT" ); /* 新文件名,在根目录下,中文文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); printf( "Write\n" ); pCodeStr = "Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,单片机只需要有600字节的RAM\xd\xa"; while( 1 ) { /* 分多次写入文件数据 */ for ( i=0; i c = *pCodeStr; mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; /* 源字符串结束 */ pCodeStr++; } if ( i == 0 ) break; /* 源字符串结束,完成写文件 */ mCmdParam.ByteWrite.mByteCount = i; /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */ i = CH375ByteWrite( ); /* 向文件写入数据 */ mStopIfError( i ); }

printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); mStopIfError( i );

LED_WR_INACT( );

*/ #endif LED_RUN_INACT( ); printf( "Take out\n" ); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */

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

大师。快帮帮我啊


你是把芯片的INT#脚接单片机的中断0脚吗?在你拔出U盘时,芯片会产生一个USB设备拔出的中断(0X16),这样的话,又会进中断程序,但一直停在了等待U盘插入的程序,所以一直出不来。 打不开串口中断和芯片的初始化没有关系,你查一下是不是打开串口中断之后,导致程序根本没有往下运行初始化375的程序。


谢谢大师,我的问题已经解决了,是 mInitSTDIO( )和串口中断发生问题了,呵呵,谢谢您了


只有登录才能回复,可以选择微信账号登录