GNU ARM匯編--(七)s3c2440的串口控制
還是從s3c2440的datasheet開始:
本文引用地址:http://www.104case.com/article/201611/321724.htms3c2440A的UART提供3個獨立的異步串行IO口,每一個都支持中斷和DMA.換句話來說,UART可以產生中斷請求或DMA請求來在CPU和UART之間傳輸數據.UART在系統時鐘下最高支持115200的波特率.如果使用UEXTCLK的話,UART可以工作在更高速的時鐘下.每個UART通道都有來年各個64字節的FIFO,一個是接收用的,一個是發送用的.
UART包括可編程的波特率,IR發送/接受,一或兩個停止位,5/6/7/8個數據位和奇偶校驗.
每個UART包括一個波特率產生器,發送器,接收器和一個控制單元.波特率產生器可以由PCLK FCLK/n 或者UEXTCLK來鎖定.發送器和接收器包含64字節的FIFO和數據移位器.數據首先寫到FIFO中,然后在發送之前復制到發送器的移位器.最后數據移位通過TxDn數據發送管腳發送出去.同樣的,接收的數據通過RxDn接收數據管腳移位進來,然后從移位器拷貝到FIFO中.
UART的框圖如下:
值得說的是:在FIFO模式下,buffer寄存器的所有64個字節都被用作FIFO寄存器.而在非FIFO模式下,buffer寄存器只有一個字節被用于Holding寄存器.
串口的操作:
串口操作包括如下:數據發送,數據接收,中斷產生,波特率產生,loopback模式,IR模式和自動流控制.
數據發送:
發送的數據幀是可編程的.它包括一個開始位,5到8個數據位,一個可選的校驗位和1到2個停止位,這些都在ULCONn寄存器中控制.發送器可以產生終止條件,可以在一個數據幀的發送時間內強制串口輸出為邏輯0.在當前的傳輸數據發送完成后會發送一個終止信號,在終止信號發送后,它會繼續發送數據到Tx FIFO(而在非FIFO模式下是Tx holding寄存器).
數據接收:
和發送一樣,接收的數據幀也是可編程的.它包括一個開始位,5到8個數據位,一個可選的校驗位和1到2個停止位(ULCONn中設置).接收器可以探測overrun錯誤parity錯誤frame錯誤和終止條件,每一個都會設置一個錯誤標記.
overrun錯誤:在舊的數據被讀完之前新的數據覆蓋了舊的數據
parity錯誤:接收器探測到一個未知的校驗條件
frame錯誤:接收數據沒有有效的停止位
終止條件:RxDn輸入在長于一個幀傳輸時間的期間內保持為邏輯0
中斷/DMA請求產生
每個UART有7個狀態信號(Tx/Rx/error):overrun error,parity error,frame error,break,接收緩沖數據準備,發送緩沖空和發送移位器空.所有都由對應的UART狀態寄存器(UTRSTATn/UERSTATn)來指示.
overrun錯誤,parity錯誤,frame錯誤和終止條件都是接收錯誤狀態.如果UCONn的接收錯誤狀態中斷使能位被置位,每一個錯誤都可以引起接收錯誤狀態中斷請求.當一個接收錯誤狀態中斷請求被探測到,可以通過讀UERSTSTn來識別.
當在FIFO模式下接收器將數據從接收器的移位器發送到接收器的FIFO寄存器,接收的數據達到了Rx FIFO的觸發線,Rx中斷產生.如果在控制寄存器(UCONn)接收模式被選為1(中斷請求或輪循模式).在非FIFO模式下,將數據從接收器的移位器發送到接收holding寄存器會引起Rx中斷(中斷請求和輪循模式下).
當發送器從發送器的FIFO寄存器發送數據到移位寄存器時,發送器的FIFO中存留的數據數量小于Tx FIFO的觸發線時,Tx中斷產生,如果控制寄存器的發送模式被選為中斷請求或者輪循模式.在非FIFO模式下,在中斷請求和輪循模式下從發送器的Holding寄存器發送數據到發送器的移位器會引起Tx中斷.
如果控制寄存器的接收模式和發送模式選為DMA請求模式,在上面提到的條件下DMA請求會取代Tx或者Rx中斷請求.
UART錯誤狀態FIFO
UART除了有Rx FIFO寄存器外還有錯誤狀態FIFO.錯誤狀態FIFO會指明在FIFO寄存器中哪個數據在接收時是錯誤的.當有錯的數據被讀出時,錯誤中斷就產生.為了清除錯誤狀態FIFO,有錯誤的URXHn和UERSTATn就必須被讀出.
波特率的產生:
每個UART的波特率產生器為發送器和接收器提供特定的時鐘.波特率產生器的時鐘源可以選為內部系統時鐘或者UEXTCLK.換句話說,被除數由UCONn寄存器的時鐘選擇確定.波特率的時鐘由源時鐘(PCLKFCLK/nUEXTCLK)除以16和UART波特率除數寄存器(UBRDIVn)中的16bit除數.
公式如下:
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
( UART clock: PCLK, FCLK/n or UEXTCLK )
接下來看各個寄存器的描述:
UART LINE CONTROL REGISTER
ULCONn用來配置每一幀數據的格式的:
根據上圖,配置如下:
IR mode[6] = 0(普通模式) Parity Mode[5:3] = 0xx(無校驗) Number of Stop Bit[2] = 0(一個停止位)
word Length[1:0] = 11(8-bits)
UART CONTROL REGISTER
如果Uart的時鐘源用FCLK/n,那么FCLK Divider就是配置這個n的
這個地方就是配置Uart的時鐘源
Tx Interrupt Type [9] 中斷請求類型:0是Pulse 1是Level
Rx Interrupt Type [8] 中斷請求類型:0是Pulse 1是Level
Rx Time Out Enable [7] 在FIFO使能的情況下,是否打開Rx Time Out中斷 0是關閉 1是打開
Rx Error Status Interrupt Enable [6] 使能Uart對異常產生中斷,比如各種錯誤 0是關閉 1是打開
Loopback Mode [5] 回環模式 0是普通模式 1是回環模式
Send Break Signal [4] 是否發送終止信號 0是正常 1是發送終止信號
Transmit Mode [3:2] 決定使用哪種功能來寫數據到發送緩沖寄存器 01中斷請求或輪循模式
Receive Mode [3:2] 決定使用哪種功能來從接收緩沖寄存器讀數據 01中斷請求或輪循模式
UART FIFO CONTROL REGISTER
評論