UART0串口編程系列(二)
三.中斷方式的串口編程
1.用中斷方式編寫串口程序由那幾部分組成
2.硬件上的支持
1>UART0發(fā)送FIFO緩沖區(qū)
A.UART0含有1個16字節(jié)的發(fā)送FIFO緩沖區(qū)
B.U0THR是UART0發(fā)送FIFO的最高字節(jié)
C.UART的發(fā)送FIFO是一直使能的
2>UART0接收FIFO緩沖區(qū)
A.UART0含有一個16字節(jié)的接收FIFO緩沖區(qū)。
B.軟件設(shè)置接收FIFO緩沖區(qū)的觸發(fā)字節(jié)。
3>中斷接口:UART0的中斷接口包含中斷使能寄存器(U0IER)和中斷標(biāo)識寄存器(U0IIR)。
lU0IIR:提供狀態(tài)碼用于指示一個掛起中斷的中斷源和優(yōu)先級。
lU0IER可以控制UART0的4個中斷源。
4>UART0有4個中斷源:
A.RLS(接收線狀態(tài))中斷:
(1)優(yōu)先級最高
(2)它在以下條件發(fā)生時產(chǎn)生錯誤
l幀錯誤(FE)
l溢出錯誤(OE)
l奇偶錯誤(PE)
l間隔中斷(BI)
注:
?可以通過查看U0LSR[4:1]中的值看到產(chǎn)生該中斷的錯誤條件
?讀取U0LSR寄存器時清除該中斷。
B.RDA(接收數(shù)據(jù)可用)中斷:
(1)與CTI中斷并列第二優(yōu)先級。
(2)在以下情況觸發(fā)中斷:
l當(dāng)接收的有效數(shù)據(jù)到達接收FIFO設(shè)置寄存器(U0FCR)中設(shè)置的觸發(fā)點時,RDA被激活。當(dāng)接收FIFO中的有效數(shù)據(jù)少于觸發(fā)點時,RDA復(fù)位。
l中斷過程:
1>移位寄存器(U0RSR)從RxD引腳接收串行數(shù)據(jù)后,送入接收FIFO中
2>當(dāng)接收FIFO中的有效數(shù)據(jù)數(shù)量達到預(yù)定的觸發(fā)點時,置位RDA中斷。
3>從U0RBR寄存器中讀取FIFO中最早到達的數(shù)據(jù),當(dāng)FIFO中的有效數(shù)據(jù)小于觸發(fā)點時,清零RDA中斷。
C.CTI(字符超時指示)中斷
(1)優(yōu)先級為2.
(2)在以下情況發(fā)生中斷:
l當(dāng)接收FIFO中的有效數(shù)據(jù)少于預(yù)定的觸發(fā)點數(shù)量時,如果在一定時間內(nèi)仍沒有接收到新的數(shù)據(jù),那將觸發(fā)該中斷。
(3)上面的時間指的是:3.5~4.5個字節(jié)所需要的時間。
(4)對接收FIFO的任何操作都會清零該中斷標(biāo)志。
(5)中斷過程:
l移位寄存器(U0RSR)從RxD0引腳接收串行數(shù)據(jù)后,送入接收FIFO中。
l當(dāng)接收FIFO中的有效數(shù)據(jù)少于觸發(fā)個數(shù),但如果長時間沒有數(shù)據(jù)到達,則觸發(fā)CTI中斷。
l從U0RBR中讀取接收FIFO中的數(shù)據(jù),或者有新的數(shù)據(jù)送入接收FIFO,都將清零CTI中斷。
注:
?3.5~4.5個字節(jié)的時間:指在串口當(dāng)前的波特率下,發(fā)送3.5~4.5個字節(jié)所需要的時間。
?當(dāng)接收FIFO中存放多個數(shù)據(jù),從U0RBR讀取數(shù)據(jù),但是沒有讀完所有數(shù)據(jù),那么在經(jīng)過3.5~4.5個字節(jié)的時間后觸發(fā)CTI中斷。
D.THRE(發(fā)送)中斷
(1)優(yōu)先級為第三級優(yōu)先級。
(2)當(dāng)FIFO為空并且在以下情況觸發(fā)中斷:
l系統(tǒng)啟動時,雖然發(fā)送FIFO為空,但不會產(chǎn)生THRE中斷。
l在上一次發(fā)生THRE中斷后,向發(fā)送FIFO中寫入1個字節(jié)數(shù)據(jù),將在一個字節(jié)加上一個停止位后發(fā)生THRE中斷
(because:如果發(fā)送移位寄存器為空,那么寫入發(fā)送FIFO的數(shù)據(jù)將直接進入發(fā)送移位寄存器。此時發(fā)送FIFO仍然為空,如果立即產(chǎn)生THRE中斷,就會影響緊接著寫入發(fā)送FIFO的數(shù)據(jù)。
所以在發(fā)送完該一個字節(jié)以及一個停止位后,才產(chǎn)生THRE中斷。
l如果在發(fā)送FIFO中有過兩個字節(jié)以上的數(shù)據(jù),但是現(xiàn)在發(fā)送FIFO為空時,將立即觸發(fā)THRE中斷。
l當(dāng)THRE中斷為當(dāng)前有效的最高優(yōu)先級中斷時,往U0THR寫數(shù)或者對U0IIR的讀操作,將使THRE中斷復(fù)位
我們來看看這些中斷源與存儲器之間的關(guān)系:
注:
?由上圖可知:UART0有4個中斷源:分別是RLS(線狀態(tài))中斷,RDA(接收數(shù)據(jù))中斷,CTI(字符超時)中斷,THRE(發(fā)送數(shù)據(jù))中斷。
?4個中斷源的優(yōu)先級如下圖所示:
3.串口中斷接收初始化
1>串口中斷接收初始化流程
l設(shè)置I/O引腳連接到UART0
l置位除數(shù)鎖存位,配置UART0幀數(shù)據(jù)格式
l根據(jù)波特率計算分頻值
l設(shè)置波特率
l清除除數(shù)鎖存位,并設(shè)置工作模式
l使能FIFO,并設(shè)置觸發(fā)點
l允許RBR中斷
注:我們可以發(fā)現(xiàn)與輪訓(xùn)方式相比,中斷方式只是增加了使能FIFO,并設(shè)置中斷觸發(fā)點和允許RBR中斷兩步。
2>中斷串口初始化需要配置的寄存器
(與輪循方式配置方法相同的寄存器在此處不在涉及)
lU0FCR(FIFO控制寄存器):U0FCR控制UART0 Rx和Tx FIFO的操作。
lU0IER(中斷使能寄存器):U0IER用于使能4個UART0中斷源。
3>具體寄存器的配置
(1)U0FCR
A作用:控制UART0 Rx和Tx的操作。
B長度:8位寄存器。
C:每一位的含義:
l第0位:表示FIFO使能
置1:表示使能對UART0 Rx和Tx的FIFO以及U0FCR[7:1]的訪問。
置0:表示不能使用Rx和Tx的FIFO以及步能對U0FCR[7:1]的訪問。
注:該位的任何變化都將使UART0 FIFO清空。
l第1位:表示Rx FIFO的復(fù)位。
置1:會清零UART0 RxFIFO中的所有字節(jié)并復(fù)位指針邏輯。該位自動清零。
l第2位:表示Tx FIFO的復(fù)位。
置1:會清零UART0 TxFIFO中的所有字節(jié)并復(fù)位指針邏輯。改位自動清零。
l第[5:3]位:保留位,用戶不能對其進行操作。從保留位讀出的值未被定義。
l第[7:6]位:表示Rx觸發(fā)選擇
00:觸發(fā)點為0(默認為1字節(jié))
01:觸發(fā)點為1(默認為4字節(jié))
10:觸發(fā)點為2(默認為8字節(jié))
11:觸發(fā)點為3(默認為14字節(jié))
注:這兩個位決定在激活中斷之前,接收UART0 FIFO必須寫入個字符。
(2)U0IER(中斷使能寄存器)
A作用:U0IER用于使能4個UART0中斷源
B長度:8位寄存器
C每一位的含義:
l第0位:表示RBR中斷使能
置1:使能RDA中斷
置0:禁止RDA中斷
注:U0IEER第零位使能UART0接收數(shù)據(jù)可用中斷。它還控制(CTI)字符接收超時中斷。
l第1位:表示THRE中斷使能
置1:使能THRE中斷
置0:禁止THRE中斷
l第2位:表示Rx線狀態(tài)中斷使能
置1:使能Rx線狀態(tài)中斷
置0:禁止RX線狀態(tài)中斷
注:U0IER第二位使能UART0 Rx線狀態(tài)中斷。該中斷的狀態(tài)可從U0LSR[4:1]讀出
l第[7:3]位:是保留位
注:用戶不能向其寫入1.
4>串口初始化程序:
***********************************************************
*作者:tiger-john
*時間:2011年1月18日
*名稱:UART0_Init
*功能:UART0初始化通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗
*接收FIFO觸發(fā)點為8字節(jié),使能RDR(接收數(shù)據(jù))中斷
*入口參數(shù):bps串口波特率
*出口參數(shù):無
****************************************************************************/
voidUART0_Init(uint32 bps)
{
uint16Fdiv;
PINSEL0 = (PINSEL0 & ~(0xf) " 0x05) ;//設(shè)置UART0的引腳
U0LCR = 0x83;//置為除數(shù)鎖存位,進行配置
Fdiv = (Fpclk>>4)/bps;
U0DLM = Fdiv>>8;
U0DLL = Fdiv%256;
U0LCR = 0x03;//清除除數(shù)鎖存位,并設(shè)置工作模式
U0FCR = 0x81;//使能FIFO,并設(shè)置觸發(fā)點為8字節(jié)
U0IER = 0x01;//允許RBR中斷,即接收中斷
}
5.中斷初始化
先來看一下UART0和VIC之間的關(guān)系:
1>中斷初始化流程:
l選擇中斷為向量中斷或快速中斷
l分配中斷通道
l設(shè)置UART0向量地址
l使能UART0中斷
2>關(guān)于ARM中斷編程方法和寄存器的使用在此不做涉及(如果想知道的話,可以看這篇文章http://blog.csdn.net/tigerjb/archive/2010/11/30/6045409.aspx
3>中斷初始化程序:
/**********************************************************
*作者:tiger-john
*時間:2011年1月18日
* 名稱: Interrupt_Init