|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
RS232串口驅(qū)動(dòng)的改進(jìn) |
| 作者:usp 欄目:通信技術(shù) |
改動(dòng)之處: 1.增加接收緩沖UART0GetBuf[UART0_GET_QUEUE_LENGTH/4],定義成32位的緩沖,以便字對(duì)齊,這樣應(yīng)用程序只需調(diào)用UART0Putch(uint8 Data),和定時(shí)查詢UART0Getch(uint8 *P_TEMP)就可以完成串口應(yīng)用,當(dāng)然是以增加ram為代價(jià)的. 2.接收中斷改為一直開(kāi)著,我有點(diǎn)不明白為什么zlg的驅(qū)動(dòng)接收中斷是關(guān)的,應(yīng)用程序調(diào)用UART0Getch時(shí)才打開(kāi),應(yīng)用程序怎么知道何時(shí)有數(shù)據(jù)需要接收. 3.去掉OSSemPost,中斷接收數(shù)據(jù)直接入隊(duì),用于單任務(wù). 4.FIFO是初始化為8個(gè)字節(jié)中斷,所以字符超時(shí)中斷后FIFO中可能不止一個(gè)數(shù)據(jù),應(yīng)當(dāng)循環(huán)讀空. 5.我覺(jué)得Uart0WriteFull也需要改一下,對(duì)于單片機(jī)的程序來(lái)說(shuō),一般不允許隊(duì)列滿,萬(wàn)一滿了,說(shuō)明有問(wèn)題,那么應(yīng)當(dāng)清空隊(duì)列,而不是等兩個(gè)周期,再寫(xiě)入,當(dāng)然這與應(yīng)用有關(guān). 我在項(xiàng)目中已經(jīng)使用這個(gè)程序,現(xiàn)在試驗(yàn)中沒(méi)有問(wèn)題,正在系統(tǒng)測(cè)試,先發(fā)出來(lái)與大家共享.如有問(wèn)題,請(qǐng)各位指正. #define IN_UART0 #include "config.h" static uint32 UART0SendBuf[UART0_SEND_QUEUE_LENGTH/4]; static uint32 UART0GetBuf[UART0_GET_QUEUE_LENGTH/4]; uint8 Uart0WriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, uint8 Mod) { uint16 TEMP; Mod = Mod; TEMP = QueueSize((void *)Buf); while (TEMP <= QueueNData((void *)Buf)) /* 等待數(shù)據(jù)隊(duì)列不滿 */ { OSTimeDly(2); } return QueueWrite((void *)Buf, Data); /* 數(shù)據(jù)重新入隊(duì) */ } uint8 UART0Init(uint32 bps) { uint16 Fdiv; PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; /* 選擇管腳為UART0 */ U0LCR = 0x80; /* 允許訪問(wèn)分頻因子寄存器 */ Fdiv = (Fpclk / 16) / bps; /* 設(shè)置波特率 */ U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; /* 禁止訪問(wèn)分頻因子寄存器 */ /* 且設(shè)置為8,1,n */ U0IER = 0x05; /* 允許接收和發(fā)送中斷 */ U0FCR = 0x87; /* 初始化FIFO */ if (QueueCreate((void *)UART0SendBuf, UART0_SEND_QUEUE_LENGTH, NULL, (uint8 (*)())Uart0WriteFull) == NOT_OK) { return FALSE; } if (QueueCreate((void *)UART0GetBuf, UART0_GET_QUEUE_LENGTH, NULL, (uint8 (*)())Uart0WriteFull) == NOT_OK) { return FALSE; } return TRUE; } void UART0Putch(uint8 Data) { uint8 TEMP; OS_ENTER_CRITICAL(); QueueWrite((void *)UART0SendBuf, Data); /* 數(shù)據(jù)入隊(duì) */ if ((U0LSR & 0x00000020) != 0) { /* UART0發(fā)送保持寄存器空 */ QueueRead(&TEMP, UART0SendBuf); /* 發(fā)送最初入隊(duì)的數(shù)據(jù) */ U0THR = TEMP; U0IER = U0IER | 0x02; /* 允許發(fā)送中斷 */ } OS_EXIT_CRITICAL(); } void UART0Write(uint8 *Data, uint16 NByte) { OS_ENTER_CRITICAL(); while (NByte-- > 0) { UART0Putch(*Data++); } OS_EXIT_CRITICAL(); } uint8 UART0Getch(uint8 *P_TEMP)//modify by zjl { if (QueueRead(P_TEMP, UART0GetBuf) == QUEUE_OK) return QUEUE_OK; else return QUEUE_EMPTY; } void UART0_Exception(void) { uint8 IIR, TEMP, i; OS_ENTER_CRITICAL(); while(((IIR = U0IIR) & 0x01) == 0) { &nbs |
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |