有很多有過一定嵌入式開發工作經驗的朋友在從事嵌入式開發的過程當中,主要在嵌入式軟件,界面等方向做的研究較多,但經常也會用串口進行調試程序,只知道串口是用來傳輸數據用的。但串口具體怎么用來傳輸數據卻不太清楚,對串口的工作原理也是一知半解。接下來分享下串口具體是怎么用來傳輸數據的。
串行通信的基本概念
• 在通信領域內,有兩種數據通信方式:并行通信和串行通信
• 串行通信:
• 計算機與I/O設備之間數據傳輸的各位是按順序依次進行傳送,通常數據在一根數據線上或者一對差分線上傳輸。
• 并行通信:
• 計算機與I/O設備之間通過多條傳輸線交換數據,數據的各位同時傳送。
• 串行速度慢,但是傳輸設備成本低,可利用現有的通信手段和通信設備進行遠程通信。并行通信速度快,但是傳輸設備成本高,適合近距離數據傳送。需要注意:一些差分串行通信總線(RS485,RS422,USB等)他們傳輸距離遠,且抗干擾能力強,速度也比較快。
1.1.2 數據的串行和并行通信方式
串行通信好比是一列縱隊,每個數據元素依次縱向排列。如圖2-57所示,傳輸時一個比特一個比特的串行傳輸,每個時鐘周期傳輸一個比特,這種傳輸方式相對比較簡單,速度較慢,但是使用總線數較少,通常一根接收線,一根發送線即可實現串行通信。它的缺點是要增加額外的數據來控制一個數據幀的開始和結束。
并行通信好比一排橫隊,齊頭并進同時傳輸。這種通信方式每個時鐘周期傳輸的數據量和其總線寬度成正比,但是實現較為復雜。UART通信采用的是串行方式進行通信的。
圖為串行數據通信與并行數據通信
• 串口的數據傳輸是以串行方式進行的。串口在數據通信中,一次只傳輸一個比特的數據。串行數據的傳輸速度用bps或波特率來描述。
注意:
碼元:在數字通信中常常用時間間隔相同的符號來表示數字。這樣的時間間隔內的信號稱為碼元,這個間隔稱為碼元長度
比特率:是信息量傳送速率單位,即每秒傳輸二進制代碼位數。bit/s
所謂差分傳輸,就是發送端在兩條信號線上傳輸幅值相等相位相反的電信號,接收端對接受的兩條線信號作減法運算,這樣獲得幅值翻倍的信號。
串行通信涉及的常用術語
• 單工、半雙工和全雙工
• 單工(Simplex)
o 特點:僅能進行一個方向的數據傳送
• 半雙工(Half Duplex)
o 特點:數據可以在兩個方向上進行傳送,但是這種傳送絕不能同時進行。[雙向,但不同時]
• 全雙工(Full Duplex)
o 特點:能夠在兩個方向同時進行數據傳送
• 數據傳輸率
• 每秒傳輸的二進制位數,單位為bps(bit per second)也稱比特率。
• 異步方式與同步方式
• 同步通信方式(Synchronous)所用的數據格式沒有起始位、停止位,一次傳送的字符個數可變。在傳送前,先按照一定的格式將各種信息裝配成一個包,該包包括供接收方識別用的同步字符一個或兩個,其后緊跟著要傳送的n個字符,再后就是校驗字符。
• 異步方式(Asynchronous):也稱“起止同步式”。
•
奇偶校驗位
奇偶校驗位 (Parity)是指偶數或者奇數或甚至對一個數字的性質。多被應用于計算機硬件的錯誤檢測中。
奇偶校驗位是一個表示給定位數的二進制數中 1 的個數是奇數還是偶數的二進制數。奇偶校驗位是簡單的錯誤檢測碼。奇偶校驗位有兩種類型:偶校驗位與奇校驗位。
1.1.1 異步通信和同步通信
圖2-56同步信號與異步信號
同步通信技術
在發送數據信號的時候,會同時送出一根同步時鐘信號,用來同步發送方和接收方的數據采樣頻率。如圖2-56所示,同步通信時,信號線1是一根同步時鐘信號線,以固定的頻率進行電平的切換,其頻率周期為t,在每個電平的上升沿之后進行對同步送出的數據信號線2進行采樣(高電平代表1,低電平代表0),根據采樣數據電平高低取得輸出數據信息。如果雙方沒有同步時鐘的話,那么接收方就不知道采樣周期,也就不能正常的取得數據信息。
圖2-56同步信號與異步信號
同步通信技術
在發送數據信號的時候,會同時送出一根同步時鐘信號,用來同步發送方和接收方的數據采樣頻率。如圖2-56所示,同步通信時,信號線1是一根同步時鐘信號線,以固定的頻率進行電平的切換,其頻率周期為t,在每個電平的上升沿之后進行對同步送出的數據信號線2進行采樣(高電平代表1,低電平代表0),根據采樣數據電平高低取得輸出數據信息。如果雙方沒有同步時鐘的話,那么接收方就不知道采樣周期,也就不能正常的取得數據信息。
異步通信技術
在異步通信技術中,數據發送方和數據接收方沒有同步時鐘,只有數據信號線,只不過發送端和接收端會按照協商好的協議(固定頻率)來進行數據采樣。數據發送方以每秒鐘57600bits的速度發送數據,接收方也以57600bits的速度去接收數據,這樣就可以保證數據的有效和正確。通常異步通信中使用波特率(Baud-Rate)來規定雙方傳輸速度,其單位為bps(bits per second每秒傳輸位數)。
1.1.3 數據通信傳輸模式
在數據通信過程中,發送方和接收方為了實現數據的正確發送和接收,通常會有一個狀態寄存器來描述當前數據接收和發送狀態,當發送方有數據發送時,會查看發送狀態寄存器,看是否允許發送數據(如果上一次數據還沒有發送完畢,不允許繼續數據發送),在發送允許情況下再送出新數據。同樣,接收端通過查看接收狀態寄存器,確定是否有新數據到達,如果有數據到達,將去接收數據緩沖區讀取數據。
(1)輪詢模式
通過程序執行流,不停的檢測狀態寄存器的結果,如果當前可發送或接收,則發送或接收數據。其過程可以用下面偽代碼來表示。
輪詢方式實現數據發送偽代碼
Send()
{
While(1)
{
if(發送狀態 == 可發送) // 檢查寄存器的值
執行數據發送操作;
}
}
輪詢方式實現數據接收偽代碼
Receive()
{
While(1)
{
if(接收狀態 == 有數據到達)
執行數據接收操作;
}
}
由程序可知,這種方式實現簡單,但在進行數據接收和發送時都要進入循環檢查狀態寄存器的值,當沒有數據到達或數據不可發送時,CPU會一直空轉,其它程序又得不到CPU的執行權,很影響系統的效率。
(2)中斷模式
中斷方式是指,當數據到達或數據可發送時,產生中斷,通知CPU去發送或接收數據,這種方式將通信硬件和CPU獨立出來,通信硬件只有在發送或接收條件準備好之后中,才通知CPU去處理數據,在通信條件沒有準備好的時候,CPU去處理其它程序,顯然這種方式更合理,這種方式要求通信硬件要求比較高,需要支持產生中斷信號。
(3)DMA模式
通常實現數據的轉移或拷貝時,CPU將從源地址處復制數據到寄存器,然后將寄存器數據再寫入目的地址處,該復制過程需要CPU來執行。FS4412支持DMA方式傳輸串口通信數據,DMA傳輸是指在CPU不干涉的情況下,DMA硬件自動實現數據的轉移和復制,在DMA傳輸過程中,CPU幾乎不用干涉,這樣可以讓CPU安心的去做自己的事情。雖然如此,但是DMA在傳輸數據過程中要占用總線,在大批數據傳輸時,系統總線會被DMA通道占用,也會影響系統的效率。
1.1 UART串口
通用異步接收器和發送器(Universal Asynchronous Receiver and Transmitter) 簡稱UART。通常是嵌入式設備中默認都會配置的通信接口。
為什么使用串口?
這是因為,很多嵌入式設備沒有顯示屏,無法獲得嵌入式設備實時數據信息,通過UART串口和超級終端相連,打印嵌入式設備輸出信息。并且在對嵌入式系統進行跟蹤和調試時,UART串口是必要的通信手段。
舉例:
比如:網絡路由器,交換機等都要通過串口來進行配置。UART串口還是許多硬件數據輸出的主要接口,如GPS接收器就是通過UART串口輸出GPS接收數據的。
fs4412的特點:
1)4組收發通道,同時支持中斷模式和DMA操作
2)通道0,1,2及帶紅外3通道都支持64字節FIFO
3)通道1和3支持高速操作模式
4)支持握手模式的發送和接收
1.1.4 UART控制器
UART控制器,提供了三個獨立的異步串行I/O端口,每個端口都可以在中斷模式或DMA模式下工作,換而言之,UART可以生成中斷或DMA請求用于CPU和UART之間的數據傳輸。UART串口掛接在APB總線上,APB總線高可以達到50MHz工作頻率,在使用APB時鐘頻率時可以達到高115.2Kbps波特率的通信速度。如果UART串口接收外部設備提供UEXTCLK(外部時鐘),UART可以在更高的速度下工作。每個UART串口在接收裝置和發送裝置里分別包含一個64Byte的FIFO緩沖區,用于緩存發送數據和接收數據。
由于UART是串行異步通信方式,因此在UART通信過程中每次只能傳輸1位(bit),若干位組成一個數據幀(frame),幀是UART通信中基本單元,它主要包含:開始位,數據位,校驗位(如果開啟了數據校驗,要包含校驗位),和停止位。
UART在通信之前要在發送端和接收端約定好幀結構,也就是約定好傳輸數據幀格式。
l 開始位:必須包含在數據幀中,表示一個幀的開始。
l 數據位:可選5,6,7,8位,該位長度可由編程人員指定。
l 校驗位:如果在開啟了數據校驗時,該位必須指定。
l 停止位:可選1,2位,該位長度可由編程人員指定。
通信雙方約定好幀格式后,指定同一波特率,以保證雙方數據傳輸的同步。
1.1.5 UART串口工作原理
每個UART包含一個波特率產生器,發送器,接收器和一個控制單元,如下圖所示:
• 下面列出Exynos4412 UART相關的控制寄存器,具體位含義見Exynos4412芯片手冊
• UART行控制器ULCONn
• UART模式控制寄存器UCONn
• UART FIFO控制寄存器UFCONn
• UART MODEM控制寄存器UMCONn
• 發送寄存器UTXH和接收寄存器URXH
• 波特率分頻寄存器UBRp2和UFRACVAL2
• UART硬件結構
• UART是以異步方式實現通信的,其采樣速度由波特率決定,波特率產生器的工作頻率可以由PCLK(外圍設備頻率),FCLK/n(CPU工作頻率的分頻),UEXTCLK(外部輸入時鐘)三個時鐘作為輸入頻率,波特率設置寄存器是可編程的,用戶可以設置其波特率決定發送和接收的頻率。發送器和接收器包含了64Byte的FIFO和數據移位器。UART通信是面向字節流的,待發送數據寫到FIFO之后,被拷貝到數據移位器(1字節大小)里,數據通過發送數據管腳TXDn發出。同樣道理,接收數據通過RXDn管腳來接收數據(1字節大小)到接收移位器,然后將其拷貝到FIFO接收緩沖區里。
• (1)數據發送
• 發送的數據幀可編程的,它的一個幀長度是用戶指定的,它包括一個開始位,5~8個數據位,一個可選的奇偶校驗位和1~2個停止位,數據幀格式可以通過設置ULCONn寄存器來設置。發送器也可以產生一個終止信號,它是由一個全部為0的數據幀組成。在當前發送數據被完全傳輸完以后,該模塊發送一個終止信號。在終止信號發送后,它可以繼續通過FIFO(FIFO)或發送保持寄存器(NON-FIFO)發送數據。
• (2)數據接收
• 同樣接收端的數據也是可編程的,接收器可以偵測到溢出錯誤奇偶校驗錯誤,幀錯誤和終止條件,每個錯誤都可以設置一個錯誤標志。
• l 溢出錯誤是指在舊數據被讀取到之前,新數據覆蓋了舊數據
• l 奇偶校驗錯誤是指接收器偵測到了接收數據校驗結果失敗,接收數據無效
• l 幀錯誤是指接收到的數據沒有一個有效的停止位,無法判定數據幀結束
• l 終止條件是指RxDn接收到保持邏輯0狀態持續長于一個數據幀的傳輸時間
• (3)自動流控AFC(Auto Float Control)
• 硬件流控使用串行電纜控制線上的電壓信號來控制數據的發送和接收。
• 串口通訊中的硬件流控有兩種方式:DTR/DSR方式和RTS/CTS方式。
• 自動流控制可以看成是串口的開關,uart2不帶有AFC功能
• UART0和UART1支持有nRTS和nCTS的自動流控,UART2不支持流控。在AFC情況下,通信雙方nRTS和nCTS管腳分別連接對方的nCTS和nRTS管腳。通過軟件控制數據幀的發送和接收。
• 在開啟AFC時,發送端接收發送前要判斷nCTS信號狀態,當接收到nCTS激活信號時,發送數據幀。該nCTS管腳連接對方nRTS管腳。接收端在準備接收數據幀前,其接收器FIFO有大于32個字節的空閑空間,nRTS管腳會發送激活信號,當其接收FIFO小于32個字節的空閑空間,nRTS必須置非激活狀態。如圖2-60所示。
• RTS (Require ToSend,發送請求)為輸出信號,用于指示本設備準備好可接收數據,低電平有效,低電平說明本設備可以接收數據。
• CTS (Clear ToSend,發送允許)為輸入信號,用于判斷是否可以向對方發送數據,低電平有效,低電平說明本設備可以向對方發送數據。
• 此處有人將CTS翻譯為發送允許。因為CTS是對方的RTS控制己方的CTS是否允許發送的功能。
圖2-60自動流控數據傳輸
(4)波特率
在UART中波特率發生器為發送器和接收器提供工作時鐘。波特率發生器的時鐘源可以選擇FS4412的內部系統時鐘(PCLK,FCLK/n)或UEXTCLK(外部時鐘源),可以通過設置UCONn寄存器來設置波特率發生器的輸入時鐘源。通常我們選擇使用PCLK作為UART工作時鐘。
UART控制器中沒有對波特率進行設置的寄存器,而是通過設置一個除數因子,來決定其波特率。其計算公式如下:
UART除數(UBRpn) = (int)(CLK/(buad rate * 16 )) - 1
其中:UBRpn的取值范圍應該為1~2^16-1。例如:波特率為115200bps,PCLK時鐘為其工作頻率,采用50MHz,UBRpn為:
UBRpn = (int)(50M / (115200 x 16)) - 1 = 26
在系統時鐘未初始化時,PCLK = 12MHz,如果波特率采用57600bps,那么UBRpn為:
UBRpn = (int)(12M / (57600 x 16)) - 1 = 12
當使用外部時鐘源時,如果外部時鐘小于PCLK時鐘,則UEXTCLK應該設置為0。
.比特率
在數字信道中,比特率是數字信號的傳輸速率,它用單位時間內傳輸的二進制代碼的有效位(bit)數來表示,其單位為每秒比特數bit/s(bps)、每秒千比特數(Kbps)或每秒兆比特數(Mbps)來表示(此處K和M分別為1000和1000000,而不是涉及計算機存儲器容量時的1024和1048576)。
.波特率
波特率指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變次數來表示,其單位為波特(Baud)。 波特率與比特率的關系為:比特率=波特率X單個調制狀態對應的二進制位數。
如何區分兩者?
顯然,兩相調制(單個調制狀態對應1個二進制位)的比特率等于波特率;四相調制(單個調制狀態對應2個二進制位)的比特率為波特率的兩倍;八相調制(單個調制狀態對應3個二進制位)的比特率為波特率的三倍;依次類推。
圖2-61 開發板串口硬件圖
UART的接口
圖2-61為Cortex-A9開發板引出UART串口接線圖,它采用DB9接口公頭(有接線柱的端口,只有接線孔的為母頭),其有9根信號線,UART通信過程中用到了信號線2 RSTXD0(數據發送管腳)它和串口線母頭TXDx信號線相接(x代表0號,1號,2號串口),信號3 RSRXD0(數據接收管腳)和串口線母頭RXDx相接(x代表0號,1號,2號串口),信號線5(接地管腳),信號線7 RSCTS0(數據發送流控制管腳)和串口線母頭nCTSx相接,信號線8 RSRTS0(數據接收流控制管腳)和串口線母頭nRTSx相接。如果UART中沒有開啟AFC流控的話,只要用到信號線2,信號線3和信號線5。
UART寄存器配置
UART0串行控制寄存器(ULCON0)
寄存器名 地址 是否讀寫 描述 復位默認值
ULCON0 0x50000000 R/W 串口0串行控制寄存器 0x00
ULCON0 位 描述 初始值
保留 [7] 0
紅外模式 [6] 選擇串口0是否使用紅外模式:
0 = 正常通信模式
1 = 紅外通信模式 0
校驗模式 [5:3] 設置串口0在數據接收和發送時采用的校驗方式:
0xx = 無校驗
100 = 奇校驗
101 = 偶校驗
110 = 強制校驗/檢測是否為1
111 = 強制校驗/檢測是否為0 000
停止位 [2] 設置串口0停止位數:
0 = 每個數據幀一個停止位
1 = 每個數據幀二個停止位 0
數據位 [1:0] 設置串口0數據位數:
00 = 5個數據位 01 = 6個數據位
10 = 7個數據位 11 = 8個數據位 00
通過設置ULCON0來設置UART0通信方式,ULCON0[6]選擇通信方式為一般通信模式或紅外通信模式,ULCON0[5:3]設置串口0校驗方式,ULCON0[2]設置串口0停止位數,ULCON0[1:0] 設置串口0的數據位數。
我們選擇一般通信模式,無校驗位,1個停止位,8個數據位的數據通信方式。因此:
ULCON0 = 0x03;
表2-26 UART0串口控制寄存器(UCON0)
寄存器名 地址 是否讀寫 描述 復位默認值
UCON0 0x50000004 R/W 串口0控制寄存器 0x00
UART0串行控制寄存器(ULCON0)
寄存器名 地址 是否讀寫 描述 復位默認值
ULCON0 0x50000000 R/W 串口0串行控制寄存器 0x00
ULCON0 位 描述 初始值
保留 [7] 0
紅外模式 [6] 選擇串口0是否使用紅外模式:
0 = 正常通信模式
1 = 紅外通信模式 0
校驗模式 [5:3] 設置串口0在數據接收和發送時采用的校驗方式:
0xx = 無校驗
100 = 奇校驗
101 = 偶校驗
110 = 強制校驗/檢測是否為1
111 = 強制校驗/檢測是否為0 000
停止位 [2] 設置串口0停止位數:
0 = 每個數據幀一個停止位
1 = 每個數據幀二個停止位 0
數據位 [1:0] 設置串口0數據位數:
00 = 5個數據位 01 = 6個數據位
10 = 7個數據位 11 = 8個數據位 00
通過設置ULCON0來設置UART0通信方式,ULCON0[6]選擇通信方式為一般通信模式或紅外通信模式,ULCON0[5:3]設置串口0校驗方式,ULCON0[2]設置串口0停止位數,ULCON0[1:0] 設置串口0的數據位數。
我們選擇一般通信模式,無校驗位,1個停止位,8個數據位的數據通信方式。因此:
ULCON0 = 0x03;
表2-26 UART0串口控制寄存器(UCON0)
寄存器名 地址 是否讀寫 描述 復位默認值
UCON0 0x50000004 R/W 串口0控制寄存器 0x00
UCON0 位 描述 初始值
FCLK分頻因子 [15:12] 當UART0選擇FCLK作為時鐘源時,設置其FCLK的分頻因子
UART0 工作時鐘頻率 = FCLK/FCLK分頻因子 + 6 0000
UART時鐘源選擇 [11:10] 選擇UART0的工作時鐘PCLK,UEXTCLK,FCLK/n:
00,10 = PCLK
01 = UEXTCLK
11 = FCLK/n
當選擇FCLK/n作為UART0工作時鐘時還要做其它設置,具體請讀者自行查看硬件手冊 00
發送數據中斷
產生類型 [9] 設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦發送數據緩沖區為空,立即產生中斷信號,在FIFO傳輸模式下達到發送數據觸發條件時立即產生中斷信號:
0 = 脈沖觸發
1 = 電平觸發 0
接收數據中斷
產生類型 [8] 設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦接收到數據,立即產生中斷信號,在FIFO傳輸模式下達到接收數據觸發條件時立即產生中斷信號:
0 = 脈沖觸發
1 = 電平觸發 0
接收數據超時 [7] 設置當接收數據時,如果數據超時,是否產生接收中斷:
0 = 不開啟超時中斷 1 = 開啟超時中斷
10 = 7個數據位 11 = 8個數據位 0
接收數據錯誤中斷 [6] 設置當接收數據時,如果產生異常,如傳輸中止,幀錯誤,校驗錯誤時,是否產生接收狀態中斷信號:
0 = 不產生錯誤狀態中斷 1 = 產生錯誤狀態中斷 0
回送模式 [5] 設置該位時UART會進入回送模式,該模式僅用于測試
0 = 正常模式 1 = 回送模式 0
發送終止信號 [4] 設置該位時,UART會發送一個幀長度的終止信號,發送完畢后,該位自動恢復為0
0 = 正常傳輸 1 = 發送終止信號 0
發送模式 [3:2] 設置采用哪個方式執行數據寫入發送緩沖區
00 = 無效
01 = 中斷請求或查詢模式
10 = DMA0請求 00
接收模式 [1:0] 設置采用哪個方式執行數據寫入接收緩沖區
00 = 無效
01 = 中斷請求或查詢模式
10 = DMA0請求 00
通常UART串口采用PCLK作為輸入工作時鐘,采用簡單的輪詢方式進行數據接收和發送,不開啟數據接收超時,數據產生錯誤時不產生錯誤狀態中斷,因此:
UCON0 = 0x05;
表2-27 UART FIFO控制寄存器(UFCON0)
寄存器名 地址 是否讀寫 描述 復位默認值
UFCON0 0x50000008 R/W 串口0 FIFO控制寄存器 0x00
UFCON0 位 描述 初始值
發送數據
觸發級別 [7:6] 設置FIFO發送模式的觸發級別:
00 = FIFO為空觸發 01 = 16字節觸發
10 = 32字節觸發 11 = 48字節觸發 00
接收數據
觸發級別 [5:4] 設置FIFO接收模式的觸發級別:
00 = FIFO為空觸發 01 = 16字節觸發
10 = 32字節觸發 11 = 48字節觸發 00
保留 [3] 0
發送FIFO重置 [2] 在重置FIFO后自動清除發送緩沖區
0 = 正常模式 1 = 自動清除 0
接收FIFO重置 [1] 在重置FIFO后自動清除接收緩沖區
0 = 正常模式 1 = 自動清除 0
啟用FIFO [0] 0 = 不啟用FIFO 1 = 啟用FIFO 0
表2-28 UART MODEM控制寄存器(UMCON0)
寄存器名 地址 是否讀寫 描述 復位默認值
UMCON0 0x5000000C R/W 串口0 MODEM控制寄存器 0x00
UMCON0 位 描述 初始值
保留 [7:5] 必須全部置0 000
AFC自動流控 [4] 0 = 不開啟流控 1 = 開啟流控 0
保留 [3:1] 必須全部置0 000
請求發送 [0] 如果啟用AFC,該位無效,S3C2440會自動控 制nRTS,如果不啟用AFC,nRTS必須由軟件控制
0 = 高電平激活nRTS 1 = 低電平激活nRTS 0
表2-29 UART 發送/接收狀態寄存器(UTRSTAT0)
寄存器名 地址 是否讀寫 描述 復位默認值
UTRSTAT0 0x50000010 R/W 串口0發送/接收狀態寄存器 0x06
UTRSTAT0 位 描述 初始值
發送器為空 [2] 當發送緩存寄存器中沒有數據要發送且發送移位寄存器為空時,自動置1
0 = 非空
1 = 發送器為空(發送緩存和移位寄存器) 1
發送緩存寄存器為空 [1] 當發送緩存寄存器為空時,自動置1
0 = 發送緩存寄存器非空
1 = 發送緩存寄存器為空 1
接收緩存寄存器為空 [0] 當接收緩存寄存器有數據到達時,自動置1
0 = 接收緩存寄存器為空
1 = 緩存寄存器接收數據 0
表2-30 UART 發送緩存寄存器(UTXH0)
寄存器名 地址 是否讀寫 描述 復位默認值
UTXH0 0x50000020(L)
0x50000023(B) W 串口0發送緩存寄存器 -
表2-31 UART 接收緩存寄存器(URXH0)
寄存器名 地址 是否讀寫 描述 復位默認值
URXH0 0x50000024(L)
0x50000027(B) R 串口0接收緩存寄存器 -
表2-32 UART 波特率除數寄存器(UBRp0)
寄存器名 地址 是否讀寫 描述 復位默認值
UBRp0 0x50000028 R/W 串口0波特率除數寄存器 -
UBRp0 位 描述 初始值
波特率除數 [15:0] 設置波特率除數(大于0)使用外部輸入時鐘時可以置0 -
上述寄存器是是和UART通信相關寄存器,使用簡單的無FIFO,無自動流控AFC時,設置如下:
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRp0 = 26; // 波特率為115200,PCLK=50Mhz
UBRp0 = 53; // 波特率為57600,PCLK=50Mhz
UBRp0 = 12; // 波特率為57600,PCLK=12Mhz
UTXH0和URXH0分別是數據發送和接收寄存器,發送數據時通過輪詢方式判斷發送狀態寄存器的狀態,當可以發送數據時,執行UTXH0寄存器寫入操作,接收數據時,以輪詢方式檢測接收狀態寄存器狀態,當有數據到達時,讀取URXH0寄存器里的數據即可取得串口數據。
可能不同的開發板,不同廠家生產設計的開發板有所不同,里面的寄存器的配置也會略有區別,原理是一樣的。