請問如何提高CH375寫入速度?

//單片機:STC90C516AD,40MHz //CH432 接收FIFO中斷先讀入idata,再存入dataBuf,扇區(qū)寫U盤。最快速度15KByte/s。 #include #include #include #include //absacc.h是絕對地址映射。也就是你把外圍電路視作片外數(shù)據(jù)存儲器時,用這個定義它的地址。

/*【【【【============================CH375聲明================================】】】】*/ // 以下定義的詳細說明請看CH375HF6.H文件 // #define LIB_CFG_DISK_IO 2 //磁盤讀寫的數(shù)據(jù)的復制方式,1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */ #define LIB_CFG_FILE_IO 2 //文件讀寫的數(shù)據(jù)的復制方式,0為"外部子程序",1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */ #define LIB_CFG_INT_EN 0 //CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" *///網(wǎng)友:中斷方式和查詢方式,速度沒有太大的差別,因為庫的底層也是用查詢方式。 /*#define LIB_CFG_FILE_IO_DEFAULT 1*/ //使用CH375HF6.H提供的默認"外部子程序" */ #define CH375_CMD_PORT_ADDR 0x3DF1 //CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x3CF0 //CH375數(shù)據(jù)端口的I/O地址 */ /*單片機引腳接線 P2.0 A0 P2.7 CS P3.2 INT P3.6 WR P3.7 RD P0.0~P0.7 D0~D7 */ /* 只使用單片機內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 以字節(jié)為單位讀寫文件不需要文件數(shù)據(jù)讀寫緩沖區(qū)FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0100 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ //下面這個一定義會出現(xiàn)"Too large sector size.",所以不要手動定義 #define DISK_BASE_BUF_LEN 512 //默認的磁盤數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤,為0則禁止在.H文件中定義緩沖區(qū)并由應用程序在pDISK_BASE_BUF中指定 */ /* 如果需要復用磁盤數(shù)據(jù)緩沖區(qū)以節(jié)約RAM,那么可將DISK_BASE_BUF_LEN定義為0以禁止在.H文件中定義緩沖區(qū),而由應用程序在調用CH375Init之前將與其它程序合用的緩沖區(qū)起始地址置入pDISK_BASE_BUF變量 */ #define FILE_DATA_BUF_ADDR 0x0300 //外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ /* 由于單片機內(nèi)置的外部RAM只有1KB, 有些單片機還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤數(shù)據(jù)緩沖 */ #define FILE_DATA_BUF_LEN 0x0200 //外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ /* 如果準備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */ /*磁盤緩沖區(qū)用于分析U盤文件系統(tǒng),處理FAT和文件名等。文件緩沖區(qū)是可選的,但是為了提高速度,文件緩沖區(qū)FILE_DATA_BUF應該有幾K到幾十K的大小?!? 在字節(jié)模式下完全不需要文件緩沖區(qū),使用下述的方法禁止文件緩沖區(qū):在主程序中不要定義常量 FILE_DATA_BUF_LEN,那么就不需要文件緩沖區(qū)。*/ #define CH375_INT_WIRE INT0 //P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ //#define CH375_INT_NO 0 /* CH375中斷號, CH375的中斷線INT#引腳連接單片機的INT0引腳 */ //#define CH375_INT_FLAG IE0 /* IE0,CH375中斷標志 */ //#define CH375_INT_EN EX0 /* EX0,CH375中斷允許 */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調用CH375FileEnumer程序故禁止以節(jié)約代碼 *///★ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調用CH375FileQuery程序故禁止以節(jié)約代碼 */ //★

#include "CH375HF4.H" //如果不需要支持FAT32,那么請選用CH375HF4.H */

unsigned char xdata dataBuf[512] _at_ 0x0500;

sbit P10=P1^0; //發(fā)送空中斷 sbit P11=P1^1; //接收中斷 sbit P12=P1^2; //超時中斷 //-------------------------子函數(shù)聲明----------------------// //void mDelay100mS(); UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ); void mStopIfError( UINT8 iError );

UINT8 i,flag_WR;//由于main()和中斷函數(shù)中都要用到flag,所以需定義成全局變量 //flag==1時,把word寫入U盤 unsigned int tt,RcvNum;//min,sec; //不要寫成int //=================================CH375聲明 END==========================================// /*【【【【================================CH432聲明===============================】】】】*/ #pragma NOAREGS #include "BASE.C" #include "PARA.C" // CH432與單片機的硬件接口層// 硬件標準8位并口方式子程序, CH432Q sbit P35=P3^5; //控制485發(fā)送/接收 (因為有一個板子上的432自動控制功能沒有實現(xiàn))

//#define CH432_BPS 19200 // 定義CH432串口0通訊波特率 // #define CH432_BPS1 1382400 // 定義CH432串口1通訊波特率 ////11.0592M下最高波特率1382400bps #define Fpclk 22118400 // 定義內(nèi)部時鐘頻率 // #define CH432_INT_WIRE INT1// P3.3 // #define CH432_INT0_WIRE INT1 // #define CH432_INT1_WIRE INT1

//UINT8 SEND_STRING[ ] = { "44444455" }; //UINT8 SEND_STRING1[ ] = { "33333" }; UINT8 buf[8]={"ILoveYou"}; //=================================CH432聲明 END==========================================// void InitCH432( void ) // 初始化CH432 // { UINT16 div; UINT8 DLL, DLM; //**********************設置CH432串口1的寄存器*************************// div = ( Fpclk >> 4 ) / CH432_BPS1; DLM = div >> 8; DLL = div & 0xff; WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_DLAB ); // 設置DLAB為1 // WriteCH432Data( CH432_DLL1_PORT, DLL ); // 設置波特率 // //Status = ReadCH432Data( CH432_DLL1_PORT ); WriteCH432Data( CH432_DLM1_PORT, DLM ); WriteCH432Data( CH432_FCR1_PORT, BIT_FCR_RECVTG1 | BIT_FCR_FIFOEN ); // 設置FIFO模式,觸發(fā)點為14 // WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_PAREN | BIT_LCR_WORDSZ1| BIT_LCR_WORDSZ0 ); // 字長8位,1位停止位、奇校驗 // WriteCH432Data( CH432_IER1_PORT, BIT_IER_IERECV | BIT_IER1_CK2X); // 使能中斷 // WriteCH432Data( CH432_IER_PORT,BIT_IER_LOWPOWER);//關串口0 WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR ); // 中斷方式下這個必須開,允許中斷輸出,DTR,RTS為1 // } /* void UART1_SendByte( UINT8 dat ) // CH432串口1發(fā)送一字節(jié)子程序 // { P35=1;//控制485收發(fā)。0時接收,1時發(fā)送 while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); // 等待數(shù)據(jù)發(fā)送完畢 // WriteCH432Data( CH432_THR1_PORT, dat ); }*/

UINT8 UART1_RcvByte() // CH432串口1接收一字節(jié)子程序 // { UINT8 Rcvdat; P35=0;//控制485收發(fā)。0時接收,1時發(fā)送 if( !( ReadCH432Data( CH432_LSR1_PORT ) & (BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) // b1-b4無錯誤 // { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); // 等待數(shù)據(jù)準備好 // Rcvdat = ReadCH432Data( CH432_RBR1_PORT ); // 從接收緩沖寄存器讀出數(shù)據(jù) // return( Rcvdat ); } else ReadCH432Data( CH432_RBR1_PORT ); // b1-b4有錯誤清除 // } /* void UART1_SendStr( UINT8 *str ) // CH432串口1發(fā)送一字符串子程序 // { while(1) { if( *str == '\0' ) break; UART1_SendByte( *str++ ); } }*/ /* void CH432Seril1Send( UINT8 *Data, UINT8 Num ) // 禁用FIFO,CH432串口1發(fā)送多字節(jié)子程序 // { do { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); // 等待數(shù)據(jù)發(fā)送完畢 // WriteCH432Data( CH432_THR1_PORT, *Data++ ); } while( --Num ); } */ /*UINT8 CH432Seril1Rcv( UINT8 *buf ) // 禁用FIFO,CH432串口1接收多字節(jié)子程序// { UINT8 RcvNum = 0; if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) // b1-b4無錯誤 // { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); // 等待數(shù)據(jù)準備好// do { *buf++ = ReadCH432Data( CH432_RBR1_PORT ); // 從接收緩沖寄存器讀出數(shù)據(jù) // RcvNum++; } while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 ); //CH432_LSR1_PORT:CH432線路狀態(tài)寄存器1。BIT_LSR_DATARDY該位為1表示接收FIFO中有接收到的數(shù)據(jù) //CH432_LSR1_PORT最后一位為DATARDY:

WriteCH432Data CH423操作的函數(shù)是總線模式還是模擬IO方式?你處理很多東西,速度慢也很正常。就兩次倒RAM就會浪費很多時間。


UINT8 ReadCH432Data( UINT32 mAddr ) { return( *( UINT8 xdata * ) mAddr ); } 這樣的,應該是總線模式吧。

dataBuf[RcvNum++] = ReadCH432Data( CH432_RBR1_PORT ); 這是一次倒RAM,另一次不知道是哪?


這些都主要是細節(jié)上的優(yōu)化了,舉個簡單的例子: UINT8 ReadCH432Data( UINT32 mAddr ) { return( *( UINT8 xdata * ) mAddr ); } 這個函數(shù)你可以寫出宏的形式,這樣就省去了調用函數(shù)的時間了,速度會快些。 總之,功能完成后,主要是C語言的優(yōu)化了,我們庫中的函數(shù)很難在速度上優(yōu)化了,已經(jīng)將速度發(fā)揮到極致。 隨意外部的一些東西需要靠你自己來優(yōu)化了


只有登錄才能回復,可以選擇微信賬號登錄

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