這篇相對基礎,看起來有點雜亂無章,是針對串口的思考文章,底下的例程也只是實現了2.5Mbit/s通信速率的發送,作為驗證目的。
UART與USART?
UART:通用異步收發器 USART:通用同步和異步收發器
同步:發送端發送數據后,接收端回應后才發下一個數據包,是為阻塞模式
異步:發送端發送收據后,不需要等待接收端回應,接着發送下一個數據包,是為非阻塞模式
半雙工:允許數據在兩個方向上傳輸,但是某一時間,只允許數據在一個方向上傳輸
全雙工:允許數據同時在兩個方向上傳輸
SPI為同步全雙工通信、IIC為同步半雙工通信,UART為異步全雙工通信、USART為同步或異步通信
UART數據格式:

數據幀格式:開始位、數據位、奇偶校驗位、停止位
起始位:開始發送一個字節數據,數據線為邏輯0狀態
數據位:數據位為一般為8位(也有5、6、7位),低位LSB在前,高位MSB在后
奇偶檢驗位:用來判斷接收的數據是否錯誤,分為NONE無校驗、ODD奇校驗、EVEN偶校驗、MASK標志位即
校驗位一直為1、SPACE空白即校驗位一直為0
停止位:表示一個字節數據發送完成,數據線為邏輯1狀態
沒有數據發送時,數據線TX、RX為邏輯1狀態,當有數據要傳輸時,數據線從邏輯1變為邏輯0狀態
STM32的USART:
作為嵌入式開發人員,STM32的USART是繞不開的通信接口之一,什么是USART?STM32中文參考手冊給的介紹是這樣的:

學習USART之前,首先要了解STM32的時鍾結構,我們以STM32F103XX舉例,在STM32F103XX數據手冊中,我們可以
看到下面兩張圖片,STM32F103xx performance line block diagram(STM32F103xx性能線框圖)、Clock tree(時鍾樹),從
性能線框圖上我們可以知道STM32的哪些外設是掛載在APB1上,哪些外設是掛載在APB2上的,同時可以知道相關外設的一些
信息,例如:TIM的通道數、APB2 /1的最大頻率、芯片的最大時鍾頻率、Flash的大小等。因此我們得到:STM32F103XX的
USART1掛載在APB2上,最大頻率為72MHz;USART2\3\X掛載在APB1上,最大頻率為36MHz。而STM32的USART的通信速率
與USART時鍾息息相關,這在STM32F103XX數據手冊中也有相關描述,原文見下圖,附翻譯。



翻譯為:
其中一個USART接口能夠以高達4.5 Mbit/s的速度進行通信。其他可用接口的通信速率最高為2.25 Mbit/s。他們提供硬件CTS
和RTS信號的管理,IrDA SIR ENDEC的支持,是ISO 7816兼容,有LIN主從能力。DMA控制器可以提供所有的USART接口。
這里說的能實現4.5Mbit/s的速度的USART便是USART1。
什么是波特率?什么是比特率?
百度百科的解釋是這樣的:

引用百度百科的例子說明:假如數據傳輸速率為11520B/s,每個字符B包括10位(1個開始位、8個數據位、1個停止位),波
特率為11520Baud(波特),比特率 = 11520 * 10 = 115200bps(bit/s)讀為:比特每秒。
值得注意的是:在實際的嵌入式開發過程中,波特率與比特率經常相同,具體表現為:我們說的波特率為115200Baud,而實際值
卻是比特率115200bit/s。在通信調試中我們會遇到諸如時鍾配置、USART配置不正確的情況,從而導致通信失敗,使用示波器捕獲
USART波形可以幫助定位問題所在,大概操作為:配置USART不斷輸出0x55(01010101),示波器抓到波形后,使用測量工具測量
每個位的開始與結束時間間隔,與實際設置波特率相比較,通常誤差不超過100ns通信不會有問題。
示例:波特率為:115200bit/s,輸出每個位的時間為:1 / 115200 = 0.00000868s = 8.68us。
STM32波特率的計算
STM32的串口波特率是通過 波特比率寄存器(USART_BRR) 設置的,在 STM32F103XX中文參考手冊 中有這樣一段介紹:

我們得知:STM32的 波特比率寄存器USART_BRR 支持分數設置,精確度因此提高。在手冊中給出了波特率的計算公式:

示例:假設我們需要實現2.5Mbit/s的通信速率,由上我們知道只有STM32的USART1可以實現該通信速率
USART1的外設時鍾(fck)為72MHz,fck / 波特率 = 16 * USARTDIV ===》 USARTDIV = 1.8,將整數部分1 = 0x01寫入
USART_BRR的位15:4,小數部分(0.8 * 16) = 12.5 ≈ 13 = 0xD寫入USART_BRR的位3:0即可。USART_BRR的值為
0x1D;值得注意的是:使用庫函數不用自行寫入USART_BRR的值。
基於CubeMX與HAL庫實現USART1的2.5Mbit/s通信速率










下載到開發板后,使用示波器采集USART1發送端口波形,得到的波形如下圖,因為2.5Mbit/s傳輸速率每位傳輸時間為 1 /2500000 = 400ns,
而波形顯示的每位傳輸時間大致為400ns,說明配置成功。

