裸機程序開發之UART
時間:2018-09-26 來源:未知
Uart原理
發送數據時,CPU將并行數據寫入UART,UART按照一定的格式在一根電線上串行發出;接收數據時,UART檢測另一根電線上的信號,串行收集然后放在緩沖區中,CPU即可讀取UART獲得這些數據。UART之間以全雙工方式傳輸數據,精確的連線方法只有3根電線:TxD用于發送數據,RxD用于接收數據,Gnd用于給雙發提供參考電平,連線如下:

UART使用標準的TTL/CMOS邏輯電平(0~5v、0~3.3v、0~2.5v或0~1.8v)來表示數據,高電平表示1,低電平表示0。為了增強數據的抗干擾能力、提高傳輸長度,通常將TTL/CMOD邏輯電平轉換為RS-232邏輯電平,3~12v表示0,-3~-12v表示1
TxD、RxD數據線以位為小單位傳輸數據,而幀由具有完整意義的、不可分割的若干位組成,它包含開始位、數據位、校驗位(需要的話)和停止位。發送數據之前,UART之間要約定好數據的傳輸速率(即每位所占據的時間,其倒數稱為波特率)、數據的傳輸格式(即有多少個數據位、是否使用校驗位、是奇校驗還是偶校驗、有多少個停止位)。
數據傳輸流程如下:
(1)平時數據線處于空閑狀態(1狀態)
(2)當要發送數據時,UART改變TxD數據線的狀態(變為0狀態)并維持1位的時間,這樣接收方檢測到開始位后,在等待1.5位的時間就開始一位一位地檢測數據線的狀態得到所傳輸的數據。
(3)UART一幀中可以有5、6、7或8位的數據,發送方一位一位地改變數據線的狀態將他們發送出去,首先發送低位。
(4)如果使用校驗功能,UART在發送完數據后,還要發送1位校驗位。有兩種校驗方法:奇校驗、偶校驗——數據位連同校驗位中,1的數據等于奇數或偶數。
(5)后,發送停止位,數據線恢復到空閑狀態(1狀態)。停止位的長度有3種:1位、1.5位、2位。
下圖演示了UART使用7個數據位、偶校驗、2個停止位的格式傳輸字符‘A’(二進制值為0b1000001)時,TTL/COM邏輯電平和RS-232邏輯電平對應的波形
TTL/COM邏輯電平

RS-232邏輯電平

用途;
Uart連接PC和開發板,輸出調試信息
實現功能:
用uart2實現與主機PC的通訊,實現數據的發送接收

用到的是GPA1_0和GPA1_1
參數設置: 波特率: 115200 數據位: 8 校驗位: 無 停止位: 1
硬件如何驅動:
1.GPIO GPA1_0 GPA1_1的相關GPIO設置成UART

GPA1CON[0] = 0X2 GPA1_0設置為UART_2_RXD
GPA1CON[1] = 0X2 GPA1_1 設置為UART_2_TXD
2.uart時鐘設置

Exynos4412 UART的時鐘源有八種選擇: XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。
選擇好時鐘源后,還可以通過 DIVUART0 ~4設置分頻系數 設置分頻系數 ,由 CLK_DIV_PERIL0 寄存器控制。 從分頻器得到的時鐘被稱為SCLK UART 。 SCLK UART 經過上圖中的“ UCLK Generator”后,得到UCLK ,它的頻率就是UART 的波特率。“ Generator UCLK Generator ”通過這 2個寄存器來設置: UBRDIVn 、UFRACVALn (在下面描述)。
設置波特率 UBRDEVn 、UFRACVALn
SCLK_UART 是100MHZ
我么這里是UART2,所以關于波特率涉及到的寄存器是UBRDEV2和UFRACVAL2


關于波特率和這兩個寄存器之間的計算關系,datasheet寫的很明白:
根據給定的波特率、所選擇時鐘源頻率,可以通過以下公式計算 UBRDIVn 寄存器 (n 為 0~4,對應 5個 UART 通道 )的值。
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) – 1
上式計算出來的 UBRDIVn 寄存器值不一定是整數, UBRDIVn 寄存器取其整數部分,小部分由 UFRACVALn 寄存器設置, UFRACVALn 寄存器的引入,使產生波特率更加精確。
我們這里 UART clock為100MHz,要求波特率為115200 bps,則:
100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25
UBRDIVn = 整數部分 = 53
UFRACVALn/16 = 小數部分 = 0.25
UFRACVALn = 4
所以設置寄存器 UBRDIV2 = 53 ,UFRACVAL2 = 4
3.設置uart相關參數

ULCON2[8] 紅外線模式還是普通模式 ,我們選擇普通模式 0
ULCON2[1:0] 數據位數 這里我們設置為8bit ,0x3
ULCON2[2] 停止位位數, 我們設置為1bit,0x0
ULCON2[5::3] 校驗位 我們設置為無 0x0
綜上,ULCON2 = 0b11 = 0x03
4.設置uart 收發模式 UCONn

UCON2 [1:0] = 01, 接收 poll模式
UCON2[3:2] = 01, 發送 poll模式
5.關閉發送接收FIFO

UFCON2 [0] = 0 關閉發送接收FIFO
6.沒想到(//TODO?????)
#if 0
// disable AFC
UMCON[4] = 0b0
// RTS active
UMCON[0] = 0b1
7.實現發送數據

發送數據
將要發送的8bit數據放入UTXHn寄存器低8位
UTXH2 = txdata
檢測數據是否發出完成


檢測是否發送完畢,檢測寄存器UTRSTAT2的bit 1是否置1,置1表示發送完成。
發送代碼:
// write fifo
UTXH[0:7] = data;
// wait finish
while (!(UTRSTAT[1] == 0b1));
8.接收數據
將寄存器URXHn的低8位數據取出來。
但是要等到receive buffer data ready,也即是有數據可讀。查看是否有數據可讀可以查看寄存器UTRSTAT2的bit 0,置1表示有數據可讀。
接收代碼:
// wait for data
while (!(UTRSTAT[0] == 0b1));
// read fifo
data = URXH[0:7];

