標籤:

串口通訊(中)——USART

USART即為通用同步非同步收發器,用於串列通信,例如其可以用於列印程序輸出信息,以便於調試程序。

USART框圖

圖10-1

這裡簡單介紹下USART框圖。

TX為發送數據的輸出引腳,RX為接收數據的輸入引腳,SCLK為發送器時鐘輸出引腳(同步模式下會用到)。其中SCLK來源於APB1匯流排時鐘(36MHz)和APB2匯流排時鐘(72MHz)。

這裡涉及到USART數據寄存器(USART_DR)。如圖10-2。

圖10-2

數據的發送和接收

從圖10-2的寄存器描述我們知道,USART_DR實際上包含了一個發送用的TDR寄存器,一個接收用的RDR寄存器。發送時,把TDR內容轉移到發送移位寄存器,由發送移位寄存器一位一位發出;接收時,把收到的每一位保存到接收移位寄存器然後再轉移到RDR。

USART有專門的發送器和接收器,在使用USART前需要先使能USART,將USART_CR1寄存器的UE位置1即可。而發送或接收的數據字長可選8位或9位,由USART_CR1的M位控制。

要啟動數據發送,需要先使能USART_CR1的TE位,則發送移位寄存器的數據會在TX引腳輸出,從低位開始發送,如果是同步模式,則SCLK也會輸出時鐘信號。在非同步模式中,一個字元幀包含三部分:起始位+數據幀+停止位。中間部分的數據幀則是我們要發送的8位或9位數據。當使能TE位後,發送器開始會先發送一個空閑幀,然後往USART_DR寫入要發送的數據。發送完成後,等待狀態寄存器(USART_SR)的TC位置1後,則代表數據傳輸完成,同時如果USART_CR1的TCIE位置1,將產生中斷。

同理,在接收時,需要置位USART_CR1的RE位,使能接收。接收完成後,會把USART_SR的RXNE位置1,同時如果USART_CR1的RXNEIE位置1,可以產生中斷。

USART_DR、USART_SR和USART_CR1~3需要結合使用,相關寄存器描述可自行查閱參考手冊。

波特率相關

USART中,波特率和比特率的值相等,所以一般不區分這兩個概念。波特率越大,傳輸速率越快。USART的發送器和接收器使用相同的波特率,公式如下:

boud = f / (16*USARTDIV)

其中boud為波特率的值,f為USART時鐘頻率,USARTDIV是USART分頻器除法因子,如圖10-3的寄存器描述。

圖10-3

由描述可知,DIV_Mantissa為USARTDIV的整數部分,DIV_Fraction為USARTDIV的小數部分。那麼,

USARTDIV = DIV_Mantissa + DIV_Fraction / 16

波特率的常用值有2400、9600、19200、115200。

例如,掛載在APB2匯流排的USART1,其有72MHz的時鐘頻率,即f=72MHz,假設我們需要115200的波特率,則由上面的公式可得:

115200 = 72000000 / (16*USARTDIV)

我們能得到USARTDIV=39.0625,那麼

DIV_Mantissa=39=0x17,

DIV_Fraction=0.625*16=1=0x01

這時我們應該設置USART_BRR的值為0x171。

校驗控制

USART還支持奇偶校驗。當使用校驗位時,數據幀長度為8位數據幀加上1位校驗位,共9位,此時USART_CR1的M位需要置1。將USART_CR1的PCE位置1可以使能校驗控制。奇偶校驗由硬體自動完成,在發送數據時會自動添加校驗位,接收數據時會自動驗證校驗位。接收數據驗證校驗位時如果校驗失敗,USART_SR的PE位將會置1,同時如果USART_CR1的PEIE位置1,便能產生奇偶校驗中斷。

使能校驗控制後,每個字元幀組成將變為:起始位+數據幀+校驗位+停止位。

附上篇有關串口通訊的介紹:串口通訊(上)——基礎概念

-----------------------------------------------------------------------

文章首發於知乎專欄 - stm32,轉載請私信,並註明原文出處。


推薦閱讀:

為什麼同為3.5mm耳機介面,電腦能放聲音,手機卻不行?
python 3.5 中pyserial串口通信如何向串口發送十六進位通信指令?

TAG:串口通信 |