串列埠通訊(中) USART

2022-06-24 13:48:10 字數 1942 閱讀 1024

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中,波特率和位元率的值相等,所以一般不區分這兩個概念。波特率越大,傳輸速率越快。usart的傳送器和接收器使用相同的波特率,公式如下:

boud =

其中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,便能產生奇偶校驗中斷。

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

USART 串列埠通訊

現在我使用串列埠一般都是列印除錯資訊或者藍芽通訊 只會用到tx和rx,不需要用到時鐘訊號線,所以是非同步半雙工 如果想要操作暫存器,那就要看功能框圖了 1.tx傳送資料引腳 rx接受資料引腳,所以要把引腳配置為串列埠復用引腳 每個串列埠對應的引腳都不一樣,這樣檢視手冊 2.傳送資料暫存器和接收資料暫...

STM323 USART串列埠通訊中斷實現

問題描述 利用stm32串列埠通訊,當pc端傳送字元8時,led pb.0閃亮 第一步 配置系統時鐘,這個不用多講,就不貼出來了 第二步 gpio埠配置 設定 pa.9為復用推挽輸出,pa.10為浮空輸入,pb.0,pb.1,pb.2輸出並初始化pb.0亮 void gpio config 第三步 ...

STM32USART串列埠通訊

問題描述 利用usart串列埠程式,實現pc與stm32通訊,計算機傳送資料,stm32接受後,再傳送給pc端 1.gpio埠配置 根據手冊 pa.9為tx 傳送 pa.10為rx 接受 因此 pa.9為復用推挽輸出,pa.10為浮空輸入,一行 搞定 void gpio config 2.配置usa...