一、UART是什么
UART是通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發傳輸器,是設備間進行異步通信的關鍵模塊。UART負責處理數據總線和串行口之間的串/并、并/串轉換,并規定了幀格式;通信雙方只要采用相同的幀格式和波特率,就能在未共享時鐘信號的情況下,僅用兩根信號線(Rx 和Tx)就可以完成通信過程,因此也稱為異步串行通信。
若加入一個合適的電平轉換器,如SP3232E、SP3485,UART 還能用于RS-232、RS-485 通信,或與計算機的端口連接。UART 應用非常廣泛,手機、工業控制、PC 等應用中都要用到UART。
UART使用的是 異步,串行通信。 串行通信是指利用一條傳輸線將資料一位位地順序傳送。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用于遠距離通信,但傳輸速度慢的應用場合。 異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。 數據傳送速率用波特率來表示,即每秒鐘傳送的二進制位數。例如數據傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。 數據通信格式如下圖:
其中各位的意義如下:起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。數據位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴展BCD碼(8位)。小端傳輸校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗)停止位:它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。空閑位:處于邏輯“1”狀態,表示當前線路上沒有資料傳送。 注:異步通信是按字符傳輸的,接收設備在收到起始信號之后只要在一個字符的傳輸時間內能和發送設備保持同步就能正確接收。下一個字符起始位的到來又使同步重新校準(依靠檢測起始位來實現發送與接收方的時鐘自同步的)
總結起來,如果我們要配置串口通信,至少要設置一下幾個參數:字長(即一次傳輸數據的長度)、波特率(即每秒傳輸的數據位數)、奇偶校驗位及停止位。
二、串口工作過程分析
USART是通用同步/異步收發器
UART是通用異步收發器
由于常用的是異步模式,所以在此我們都是只需要使用UART。
我們先介紹串口發送的過程,我們先來看一下串口架構圖:
可以看出,串口外設的架構圖乍一看略微復雜,這里我們分開進行分析:
我們直接從發送(TX)和接收(RX)開始講起。
RX和TX此處不做過多介紹。
根據下圖紅色箭頭標記可以看出:對于接收來說,它經過編解碼模塊,然后直接進入到了接收移位寄存器,接收移位寄存器一位一位的接收數據,然后再將接收到的數據一次性寫到接收數據寄存器(RDR)中,這樣,CPU就可以通過讀取接收數據寄存器(RDR)來讀到接收的數據。
同樣,對于發送來說,CPU將數據寫入到發送數據寄存器(TDR),發送數據寄存器(TDR)將數據一次性的發送給發送移位寄存器,然后再根據波特率將數據一位一位的移出。如下圖:
我們知道,發送和接收事先要確定好波特率,那么波特率是怎么配置的呢?我們順著箭頭繼續往下找:
根據上圖所示,我們不難看出:波特率是通過發送控制器和接收控制器分別控制發送器時鐘和接收器時鐘,然后傳輸到發送移位寄存器和接收移位寄存器中的。
通過上圖我們還可以看出:發送器時鐘和接收器時鐘來自同一單元。我們現在就來分析一下這兩個時鐘是怎么產生的。
上文中已經介紹過,波特率實際上就是每秒傳輸的二進制位數,通過對時鐘的控制可以改變波特率。我們向波特比率寄存器(即上圖中的USART_BRR)寫入參數,修改了串口時鐘的分頻值USARTDIV。
USART_BRR寄存器包括兩個部分:DIV_Mantissa(即USARTDIV的整數部分)和DIV_Fraction(即USARTDIV的小數部分)。計算公式為:USARTDIV=DIV_Mantissa+(DIV_Fraction/16)。
波特率計算公式如下:
我們只要知道了USARTDIV的值,就可以知道串口波特率寄存器的值。
舉一個簡單的例子:假設我們串口1要設置的波特率為115200,PLCK2的時鐘頻率為72MHz,根據上面的公式,我們可以得出:
USARTDIV=72000000/(16*115200)=39.0625
由此 我們就可以得到DIV_Fraction=16*0.0625=1=0x01;
DIV_Mantissa=39=0x27。由于USARTDIV是對串口外設的時鐘源進行分頻,不同的USART掛載的總線并不相同,所以它們的時鐘源fPCLK也不相同。USART1掛載在APB2總線上,其時鐘源為fPCLK2;USART2、3、4、5掛載在APB1上,其時鐘源為fPCLK1。串口的時鐘源經過USARTDIV分頻后,分別輸出作為發送器時鐘及接收器時鐘,來控制發送和接收的時序。
三、程序分析
首先,我們打開iBox開發板的例程USART_DEMO,在左側的工程目錄中找到USER工程文件夾點擊前方的“+”,找到main.c文件并打開。
我們可以看到,在主函數上面有一個fputc(intch, FILE *f)函數。
這個函數的功能是將一個字符寫入到文件中。其參數包括:Ch要寫入的字符; *f指向FILE結構的指針。
接下來我們來看一下主函數:
上圖中的兩行代碼分別為定義GPIO結構體和定義USART結構體。
上面的函數是使能APB2總線上的串口時鐘,同時啟動GPIOA端口。
上圖中的代碼是對GPIO端口的配置。其配置方法在第三講中有提及到,我們可以看出其配置的是PA9端口。因為PA9端口同時也是USART1_TX,即串口的發送數據端口。
上圖中的代碼是對PA10端口的配置。因為PA10端口同時也是USART1_RX,即串口的接收數據端口。
我們看一下GPIO的工作模式:GPIO_Pin_9的工作模式為復用推挽輸出;GPIO_Pin_10的工作模式為浮空輸入。我們可以在STM32參考手冊中找到GPIO配置中關于USART的配置,如下表:
我們工作模式為全雙工,所以根據表格,配置好相應的GPIO端口工作模式,分別為復用推挽輸出和浮空輸入。
接下來就是對串口的初始化和配置。如上圖所示。我們逐行分析。
在此之前,我們可以在工程目錄種先找到stm32f10x_usart.h(可以在main.c下面找到,因為我們的main函數包含了此庫函數),即USART庫函數。
我們可以在最下面找到許多函數聲明。我們可以在用戶手冊種找到這些函數的描述,大家可以簡單了解一下。
我們繼續瀏覽stm32f10x_usart.h庫函數,可以找到typedef struct,如下圖(為方便截圖,在此已將注釋隱藏):
我們可以發現 我們程序種需要配置的USART相關參數都在這里有所聲明。不僅如此,繼續向下翻閱還可以找到所需配置的相關參數(由于代碼略多,在此不做截圖,讀者可自己查閱)。
uint32_t USART_BaudRate:該成員設置了USART傳輸的波特率。
uint16_t USART_WordLength:提示了在一個幀中傳輸或者接收到的數據位數。可取值為:USART_WoedLength_8b(8位數據)和USART_WoedLength_9b(9位數據)。
uint16_t USART_StopBits:在幀尾傳輸的停止位。其定義為USART_StopBits_0.5(0.5個停止位)、USART_StopBits_1(1個停止位)、USART_StopBits_1.5(1.5個停止位)、USART_StopBits_2(2個停止位)。
uint16_t USART_Parity:奇偶校驗位。其定義為USART_Parity_No(不使用)、USART_Parity_Even(偶模式)、USART_Parity_Odd(奇模式)。
uint16_t USART_Mode:指定了使能或者失能發送和接收模式。其定義為:USART_Mode_Rx(接收使能)、USART_Mode_Tx(發送使能)。uint16_t USART_HardwareFlowControl:制定了硬件流控制模式是使能還是失能。其定義為:USART_HardwareFlowControl_RTS(發送請求RTS使能)、USART_HardwareFlowControl_CTS(清除發送CTS使能)、USART_HardwareFlowControl_RTS_CTS(RTS和CTS使能)。
USART_Clock、USART_CPOL、USART_CPHA和USART_LastBit在同步模式下才需要配置,在此暫時不做解釋。
了解了這些,對串口的初始化和配置分析就非常容易了。我們回到主函數,觀察串口初始化和配置的幾行代碼:
上圖代碼是將波特率設置為115200。
上圖代碼定義了數據位數為8位數據。
上圖代碼設定了在幀尾傳輸一個停止位。
上圖代碼設定了不使用奇偶校驗。
上圖代碼設定了不使用硬件流控制模式。
上圖代碼定義了發送和接收模式:使能發送和使能接收。
上圖種兩行代碼第一行為串口初始化,第二行為使能串口。
最后,我們循環打印“USART Printf Example: retarget the C library printf function to the USART”。
接下來,我們觀察實驗現象:首先將程序燒錄到iBox中,然后我們使用USB轉TTL串口工具將iBox與電腦連接,如下圖所示:
iBox的J12接口從左到右依次為:TX、RX和GND(注意:我們沒有為iBox接電源,iBox需要單獨供電)。
接下來,我們打開串口助手。
如上圖:首先我們需要根據我們的程序配置串口(不同助手界面可能有所不同)。
設置好參數后,我們將程序燒錄到iBox中,觀察串口助手。
-
通信
+關注
關注
18文章
6027瀏覽量
135951 -
傳輸器
+關注
關注
0文章
39瀏覽量
12936 -
uart
+關注
關注
22文章
1235瀏覽量
101355
原文標題:從原理圖PCB到移植RTOS【細說STM32】【四】UART
文章出處:【微信號:Hardware_10W,微信公眾號:硬件十萬個為什么】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論