串口通訊(中)——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 =
其中boud為波特率的值,f為USART時鐘頻率,USARTDIV是USART分頻器除法因子,如圖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:串口通信 |