|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
俺寫的lpc2132的串口驅動(中斷方式) |
| 作者:vcvcvcvc 欄目:ARM技術 |
#include "lpc213x.h" #include "Includes.h" #define BIT(x) (1<<x) #define SET_BIT(x, y) (x|=(1<<y)) #define CLR_BIT(x, y) (x&=~(1<<y)) #define GET_BIT(x, y) (x&(1<<y)) volatile struct { INT8U rd_buf[32]; INT8U td_buf[2048]; INT16U rd_max; INT16U td_max; INT16U rd_cnt; INT16U td_cnt; } uart0; OS_EVENT *uart0_rd_ok; OS_EVENT *uart0_td_ok; extern void UART0_Handler(void); void UART0_Exception(void) { unsigned CHAR i, k; k = U0IIR&0x0F; SWITCH(k) { case 0x02: for (i=0; i<16; i++) { if (uart0.td_cnt < uart0.td_max) { U0THR = uart0.td_buf[uart0.td_cnt]; uart0.td_cnt++; } else { U0IER = U0IER & (~0x02); OSSemPost(uart0_td_ok); goto UART0_Exception_RET; } } break; case 0x04: for (i=0; i<8; i++) { uart0.rd_buf[uart0.rd_cnt] = U0RBR; if (uart0.rd_buf[0] == 0xFD) { uart0.rd_cnt++; if (uart0.rd_cnt == uart0.rd_max) { OSSemPost(uart0_rd_ok); goto UART0_Exception_RET; } else if (uart0.rd_cnt > 31) { uart0.rd_cnt = 31; } } } break; case 0x0C: uart0.rd_buf[uart0.rd_cnt] = U0RBR; if (uart0.rd_buf[0] == 0xFD) { uart0.rd_cnt++; if (uart0.rd_cnt == uart0.rd_max) { OSSemPost(uart0_rd_ok); goto UART0_Exception_RET; } else if (uart0.rd_cnt > 31) { uart0.rd_cnt = 31; } } break; default: break; } UART0_Exception_RET: VICVectAddr = 0x00; } void UART0_init(void) { INT16U i; for (i=0; i<32; i+ |
| 2樓: | >>參與討論 |
| 作者: ARM白菜 于 2005/4/8 10:35:00 發(fā)布:
謝謝啦 中斷看了幾天都不明白,這下好了,雖然我的是2104 |
|
| 3樓: | >>參與討論 |
| 作者: pubstar 于 2005/4/8 10:55:00 發(fā)布:
在多任務中,串口驅動,當一個設備想使用串口時, 必須保證當時串口是空閑,如果不空閑,必須等待,直到空間,或者指定時間內(nèi)串口設備未空閑,提示信息, 樓上的串口驅動采用結構,比較不錯 但是要是用在多任何中,如果用多個任何使用此串口,估計會有問題 |
|
| 4樓: | >>參與討論 |
| 作者: pubstar 于 2005/4/8 11:10:00 發(fā)布:
采用信號量太占用資源,不如用 Uart0Status=OSFlagCreate表示狀 態(tài),另外,其實完全可以將串口的忙閑狀態(tài)等信息一塊封裝在結構中,這樣不斷模塊化,同時,一個狀態(tài)只占用一個信息, |
|
| 5樓: | >>參與討論 |
| 作者: vcvcvcvc 于 2005/4/8 11:53:00 發(fā)布:
呵呵,改了一下 #include "lpc213x.h" #include "Includes.h" #define BIT(x) (1<<x) #define SET_BIT(x, y) (x|=(1<<y)) #define CLR_BIT(x, y) (x&=~(1<<y)) #define GET_BIT(x, y) (x&(1<<y)) volatile struct { INT8U rd_buf[32]; INT8U td_buf[2048]; INT16U rd_max; INT16U td_max; INT16U rd_cnt; INT16U td_cnt; OS_EVENT *rd_ok; OS_EVENT *td_ok; } uart0; extern void UART0_Handler(void); void UART0_Exception(void) { unsigned CHAR i, k; k = U0IIR&0x0F; SWITCH(k) { case 0x02: for (i=0; i<16; i++) { if (uart0.td_cnt < uart0.td_max) { U0THR = uart0.td_buf[uart0.td_cnt]; uart0.td_cnt++; } else { U0IER = U0IER & (~0x02); OSSemPost(uart0.td_ok); goto UART0_Exception_RET; } } break; case 0x04: for (i=0; i<8; i++) { uart0.rd_buf[uart0.rd_cnt] = U0RBR; if (uart0.rd_buf[0] == 0xFD) { uart0.rd_cnt++; if (uart0.rd_cnt == uart0.rd_max) { OSSemPost(uart0.rd_ok); goto UART0_Exception_RET; } else if (uart0.rd_cnt > 31) { uart0.rd_cnt = 31; } } } break; case 0x0C: uart0.rd_buf[uart0.rd_cnt] = U0RBR; if (uart0.rd_buf[0] == 0xFD) { uart0.rd_cnt++; if (uart0.rd_cnt == uart0.rd_max) { OSSemPost(uart0.rd_ok); goto UART0_Exception_RET; } else if (uart0.rd_cnt > 31) { uart0.rd_cnt = 31; } } break; default: break; } UART0_Exception_RET: VICVectAddr = 0x00; } void UART0_init(void) { INT16U i; for (i=0; |
|
| 6樓: | >>參與討論 |
| 作者: jft 于 2005/12/27 16:10:00 發(fā)布:
好,一直想用雙串口的驅動 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |