STM32之關於USART以及波特率的一些思考


這篇相對基礎,看起來有點雜亂無章,是針對串口的思考文章,底下的例程也只是實現了2.5Mbit/s通信速率的發送,作為驗證目的。

學習STM32基於HAL庫的串口通信請點這里

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,說明配置成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM