特性
lpc2000系列微控制器具有兩個功能強大的uart,其中uart0具有如下的特性:
16字節(jié)接收fifo和16字節(jié)發(fā)送fifo;
寄存器位置符合16c550工業(yè)標準;
接收fifo觸發(fā)點可設置為1、4、8或14字節(jié);
內置波特率發(fā)生器。
使用uart0通信
使用uart0通信需要兩個引腳,分別為:
uart0內部結構示意圖
uart0相關寄存器描述
——接收緩存寄存器
u0rsr移位寄存器從rxd0引腳接收的有效數據將被送到接收fifo中。通過讀取u0rbr寄存器可以將接收fifo中最早接收到的字節(jié)讀出,當fifo中不再包含有效數據時,該寄存器反映接收到的最后一個有效字節(jié)數據。接收的數據不足8位時,高位用0填充。
注意: u0rbr只讀。訪問該寄存器時,u0lcr的除數鎖存訪問位(dlab)必須為0。
uart0相關寄存器描述
——發(fā)送器保持寄存器
寫入該寄存器的值將是發(fā)送fifo中的最高字節(jié)。訪問該寄存器時,u0lcr的除數鎖存訪問位(dlab)必須為0。
注意: u0thr只寫。它的地址與u0rbr相同,通過讀/寫操作予以區(qū)分。
uart0相關寄存器描述
——除數鎖存寄存器
這兩個寄存器決定波特率時鐘的頻率,而波特率時鐘必須是波特率的16倍。波特率計算公式如下:
baudrate = fpclk / ([u0dlm,u0dll]×16)
注意:由于u0dll、u0dlm寄存器與其它寄存器的地址重疊,所以在訪問它們時,u0lcr的除數鎖存訪問位(dlab)必須為1。
uart0相關寄存器描述
——中斷使能寄存器
u0ier可以控制uart0的4個中斷源。其中rbr中斷使能包括兩個中斷,一個是接收數據可用(rda)中斷,一個是接收超時中斷(cti)。稍后將對各中斷源作詳細介紹。
uart0相關寄存器描述
——中斷標識寄存器
uart0相關寄存器描述
——中斷源說明
rls中斷:該中斷為最高優(yōu)先級。它在uart0產生了四個錯誤條件(溢出錯誤(oe)、奇偶錯誤(pe)、幀錯誤(fe)和間隔中斷(bi))中的任意一個時置位。通過查看u0lsr[4:1]可以了解到產生該中斷的錯誤條件。讀取u0lsr時清除該中斷;
rda中斷:該中斷與cti中斷并列為第二優(yōu)先級。當接收的有效數據到達接收fifo設置寄存器(u0fcr)中設置的觸發(fā)點時,rda被激活。當接收fifo中的有效數據少于觸發(fā)點時,rda復位;
cti中斷:該中斷為第二優(yōu)先級。當接收fifo中的有效數據少于預定的觸發(fā)點數量,但至少有一個字節(jié)時,如果超過接收3.5~4.5個字節(jié)所需要的時間仍沒有接收到數據,那將觸發(fā)該中斷。對接收fifo的任何操作都會清零該中斷標志;
thre中斷:該中斷為第三優(yōu)先級。當發(fā)送fifo為空并且滿足一定的條件時,該中斷將被觸發(fā)。這些條件是:
3.如果在發(fā)送fifo中有過兩個字節(jié)以上的數據,但是現在發(fā)送fifo為空時,將立即觸發(fā)thre中斷。
當thre中斷為當前有效的最高優(yōu)先級中斷時,往u0thr寫數據,或者對u0iir的讀操作,將使thre中斷復位。
uart0相關寄存器描述
——fifo控制寄存器
復位rxfifo:接收fifo復位。當該位置位時,uart0接收fifo中的所有字節(jié)被清零并復位指針邏輯。
注意:該位會自動清零。
復位txfifo:發(fā)送fifo復位。當該位置位時,uart0發(fā)送fifo中的所有字節(jié)被清零并復位指針邏輯。
注意:該位會自動清零。
—:這些位保留,用戶程序不要向這些位寫入1。
rx觸發(fā)點設置:通過設置這兩位可以調整接收fifo中觸發(fā)rda中斷的有效字節(jié)數量。
00:觸發(fā)點0(1字節(jié)); 01:觸發(fā)點1(4字節(jié));
10:觸發(fā)點2(8字節(jié)); 11:觸發(fā)點3(14字節(jié));
uart0相關寄存器描述
——線狀態(tài)控制寄存器
停止位:控制每幀數據包含的停止位個數。
0:1個停止位; 1:2個停止位;
奇偶使能:控制是否進行奇偶校驗。如果使能,發(fā)送時將添加一位校驗位。
0:禁止奇偶產生和校驗; 1:使能奇偶產生和校驗;
奇偶選擇:設置奇偶校驗類型。
00:奇數(數據位+校驗位=奇數);
01:偶數(數據位+校驗位=偶數);
10:校驗位強制為1; 11:校驗位強制為0;
間隔:當該位為1時,輸出引腳(txd0)強制為邏輯0,可以引起通信對方(lpc2000)產生間隔中斷。在某些通信方式中,使用間隔中斷作為通信的起始信號(如:lin bus)。
0:禁止間隔發(fā)送; 1:使能間隔發(fā)送;
除數鎖存:因為u0dll和u0rbr/u0thr的地址重疊,通過設置該位可以指定其中某個寄存器操作。
0:禁止訪問除數鎖存寄存器; 1:使能訪問除數鎖存寄存器;
rdr:接收數據就緒。判斷該位是否置一,決定能否從fifo中讀取數據。
0:u0rbr為空;
1:u0rbr中包含有效數據。從接收fifo中讀走所有數據后,恢復為0。
oe:溢出錯誤標志。當u0rbr寄存器中已經有新的字符就緒,而接收fifo已滿時,該位置位。
0:接收緩存區(qū)沒有溢出;
1:接收緩存區(qū)發(fā)生溢出錯誤。
pe:奇偶校驗錯誤。在使能奇偶校驗位之后,對所有接收的數據都進行奇偶校驗,如果與u0lcr中的設置不符,將引起奇偶校驗錯誤。
0:沒有發(fā)生奇偶校驗錯誤;
1:發(fā)生奇偶校驗錯誤。讀操作使該位恢復為0。
fe:幀錯誤標志。當接收字符的停止位為0時,產生幀錯誤。
0:沒有發(fā)生幀錯誤;
1:發(fā)生幀錯誤。讀取該位時恢復為0。
bi:間隔中斷標志。在發(fā)送數據時,如果rxd0引腳保持低電平,將產生間隔中斷。發(fā)生間隔中斷后,接收模塊停止數據接收。
0:沒有發(fā)生間隔中斷;
1:發(fā)生間隔中斷。
thre:反映u0thr是否為空,也可以認為發(fā)送fifo是否為空。
0:不為空;
1:空。對u0thr進行寫操作,使該位恢復為0。
temt:當發(fā)送移位寄存器和u0thr均為空時,該位置位。
0:不為空;
1:空。對u0thr進行寫操作,使該位恢復為0。
rxfe:如果一個帶有接收錯誤(如幀錯誤、奇偶錯誤或間隔中斷)的字符裝入u0rbr時,該位置位。
0:u0rbr中沒有接收錯誤,或u0fcr[0]為0;
1:u0rbr中包含至少一個uart0 rx錯誤。
使用uart0注意要點
u0rbr與u0thr在同一地址上,但實際上是兩個獨立的寄存器,讀操作時選擇u0rbr,寫操作時選擇u0thr;
u0dll與u0rbr/u0thr、u0dlm與u0ier在同一地址上,通過除數訪問位dlab選擇。當該位為1時,選擇u0dll和u0dlm。為0時,選擇u0rbr/u0thr和u0ier;
無論在u0fcr中是否使能fifo,接收fifo不能被禁止。關閉fifo后,接收fifo只有一個字節(jié)緩沖;
波特率計算公式:u0dlm、u0dll = fpclk/(16×baud);
uart0應用示例——操作流程
uart0應用示例——初始化代碼
uart0應用示例——收發(fā)數據