本帖最后由 xiongxiao 于 2015-5-27 19:25 編輯
LPC1768含有4 個符合16C550工業標準的異步串口UATR0-UART3,其中UART1具有標準的MODEM接口和RS232。至于RS232的標準是什么樣的,這里不在總結了,如果哪位有興趣可以上網查一下維基百科。RS-485是后期出現的一個傳輸標準,關于它們的特性,下面列表總結一下:
UATR0/2/3可以工作在UART模式下,也可以工作在IrDA模式下, IrDA是紅外數據組織(Infrared Data Association)的簡稱,目前廣泛采用的IrDA紅外連接技術就是由該組織提出的。到目前為止,全球采用IrDA技術的設備超過了5000萬部。IrDA已經制訂出物理介質和 協議層規格,以及2個支持IrDA標準的設備可以相互監測對方并交換數據。 初始的IrDA1.0 標準制訂了一個串行,半雙工的同步系統,傳輸速率為2400bps到115200bps,傳輸范圍1 m,傳輸半角度為15度到30度。最近IrDA擴展了其物理層規格使數據傳輸率提升到4Mbps。IrDA數據協議由物理層,鏈路接入層和鏈路管理層三個基本層協議組成,另外,為滿足各層上的應用的需要,IrDA棧支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM, IrOBEX和IrLAN等。IrDA的優點是成本低,體積小、功耗低,數據傳輸干擾小等。關于IrDA的協議與應用這里暫時先不總結,后續學習中會再慢慢涉及到,屆時將做深入研究。UATR1具有MODEM接口,能過該接口可以接入電話網絡,實現遠距離通訊。至于怎么通訊,這里也暫時不總結,因為這一塊懶貓也沒有深入研究。 關于串口的配置主要涉及到引腳的配置,波特率的配置,幀格式的設置及FIFO設置等。涉及到的寄存器主要有接收緩沖寄存器,它包含即將讀取的接收數據。發送保持寄存器,它主要是用來寫入發送數據的,中斷使能寄存器IER,若是用到中斷接收或發送時需配置些寄存器,與之相關聯的寄存器還有中斷標志寄存器IIR。還有FIFO控制寄存器FCR,它是用來配置先進先出相關的東東的。線控制寄存器LCR,這個寄存器主要就是用來設置幀格式的,與這個寄存器相關聯的寄存器是線狀態寄存器LSR,用來讀取幀格式狀態的寄存器。當然還有緩存寄存器SCR,這個與串口操作關系不大。還有自動波特率控制器ACR,配置程序自適應波特率的。還有IrDA控制寄存器,它與紅外發送與接收有關。小數分頻寄存器FDR,它是波特率配置有關。傳輸使能寄存器TER,如果這個寄存器的TXEN配置為1,剛只要緩存中有有效數據,就可以通過發送引腳把數據發送出去。還有一個寄存器FIFO等級寄存器FIFOLVL,它是個只讀寄存器,用來讀取當前FIFO等級狀態。此次實驗我是用查詢方式發送字符到串口,所以很大寄存器沒有用到,關于寄存器的詳細說明可以參考LPC1768的數據手冊,這里就不再照搬手冊了。下面簡單說一下這次實驗電路圖,主要是一個 按鍵,8個LED燈,還有串口0,功能就是按一下按鍵亮一個燈,等全亮時,再按按鍵燈全來,然后再按按鍵時第按一下點亮一個,循環往復,同時哪個燈亮,就發送字符“Led X on”,下面是這次實驗的電路圖: 圖 1-1 實驗電路圖 下面簡單說一下這個軟件,軟件主要分為兩大部分,一個是關于串口配置及常用的函數,另一個就是主LED點燈程序,分別在UART.C與MAIN.C兩個源文件中,下面把部分代碼帖出來,完整部分請參閱附件: (1)、 uart.c源文件 #include "includes.h" /******************************************************************************** * 函數名稱 :uint32_t UARTInit( uint32_t PortNum, uint32_t baudrate ) * 函數功能 : 串口初始化 * 入口參數 : uint32_t PortNum -- 端口號(0、1) * uint32_t baudrate -- 波物率 * 出口參數 : 返回真或假 * 備 注 :如果中斷句柄沒有建立在向量表中則返回false *******************************************************************************/ void UARTInit( uint32_t PortNum, uint32_t baudrate ) { uint32_t Fdiv;
if ( PortNum == 0 ) { PINCON->PINSEL0 |= (1 << 4); /* Pin P0.2 -- TXD0 (Com0) */ PINCON->PINSEL0 |= (1 << 6); /* Pin P0.3 -- RXD0 (Com0) */ UART0->LCR = 0x83; /* 8 bits, 無校驗, 1 個停止位 */ Fdiv = (SystemFrequency/4/ 16) / baudrate;/* 設置波特率 */ UART0->DLM = Fdiv / 256; UART0->DLL = Fdiv % 256+1; UART0->LCR = 0x03; /* 鎖定波特率 */ UART0->FCR = 0x07; /* 串口先進先出控制寄存器設置*/
} else if ( PortNum == 1 ) { PINCON->PINSEL4 |= (1<<1); /* Pin P2.0 -- TXD1 (Com1)*/ PINCON->PINSEL4 |= (1<<3); /* Pin P2.1 -- RXD1 (Com1)*/ UART1->LCR = 0x83; /* 8 bits, 無校驗, 1 個停止位 */ Fdiv = (SystemFrequency/4/16)/ baudrate ; /* 設置波特, Fpclk: 18MHz */ UART1->DLM = Fdiv/256; UART1->DLL = (Fdiv%256)+1; UART1->LCR = 0x03; /* DLAB = 0 */ UART1->FCR = 0x07; /* 使能TX與 RX 并初始化FIFO. */
} }
/******************************************************************************** * 函數名稱 :void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length ) * 函數功能 : 從串口發送一串數據 * 入口參數 : uint32_t PortNum -- 端口號(0、1) * uint8_t *BufferPtr -- 緩沖指針 * uint32_t Length -- 數據長度 * 出口參數 : 無 * 備 注 :無 *******************************************************************************/ void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length ) { if ( portNum == 0 ) { while ( Length != 0 ) { while ( !(UART0->LSR & 0x20) ); /* 檢測串口狀態,是否包含有效數據 */ UART0->THR = *BufferPtr; /* 輸出數據 */ BufferPtr++; /* 指向下一個數據 */ Length--; /* 數據長度減1 */ } } else { while ( Length != 0 ) { while ( !(UART1->LSR & 0x20)); /* 檢測串口狀態,是否包含有效數據 */ UART1->THR = *BufferPtr; /* 輸出數據 */ BufferPtr++; /* 指向下一個數據 */ Length--; /* 數據長度減1 */ } } return; } /******************************************************************************** * 函數名稱 :int UART0_SendByte (int ucData) * 函數功能 : 串口0發送數據 * 入口參數 : int ucData - 要發送的數據 * 出口參數 : 無 * 備 注 :無 *******************************************************************************/ int UART0_SendByte (int ucData) { while (!(UART0->LSR & 0x20)); return (UART0->THR = ucData); } /******************************************************************************** * 函數名稱 :void UART0_SendString (unsigned char *s) * 函數功能 : 串口0發送字符串 * 入口參數 : unsigned char *s -- 要發送的字符串 * 出口參數 : 無 * 備 注 :無 *******************************************************************************/ void UART0_SendString (unsigned char *s) { while (*s != '\0') { UART0_SendByte(*s++); } } (2)、 main.c源文件 程序不是太難,只是簡單的實驗,各個部分都有詳細的注釋,這里不在總結,下面是挨靠結果串口調試助手截圖: 
圖 1-2 串口助手截圖好了,先總結到這吧,最近手頭上的事有點多,所以寫日志的時間就有點緊張,不過,工作歸工作,該學習的東東還是要堅持學習的,沒有足夠的時間,那就見縫插針的學吧。最后再來吼一下懶貓的口號,來鼓勵一下自己:每天進步一點點,開心多一點^_^
完整程序源代碼工程文件下載地址:
SW.rar
(188.86 KB, 下載次數: 83)
2015-5-27 19:22 上傳
點擊文件名下載附件
|