stm32支援的波特率的問題

2021-07-16 20:16:23 字數 1329 閱讀 1329

原來學習stm32,關於串列埠波特率這個問題沒有怎麼關注,一般也就習慣用9600或者115200,今天被問到:stm32支援的最大波特率為多少?我自己也語塞了...

為此我好好看了下相關資料。

首先檢視了stm32f10x參考手冊.pdf,其中關於usart部分提到了usart的最高傳輸速度為4.5mbit/s,(圖1)如下:

在找到了最大的傳輸速度後,就要考慮為什麼會得到這個速度,於是我檢視了stm32f10x韌體函式庫.pdf,在這個檔案中關於usart庫函式的講解中發現了關於波特率計算的公式。如下圖(圖2)所示:

這個裡面提到了兩個整數分頻器和小數分頻器這兩個東西,並且波特率的計算就和這兩個值有關。那麼回到上面的問題,最高傳輸速度4.5mbits/s是怎麼得到的呢?根據公式可以看出波特率和apb匯流排時鐘頻率有關,那麼需要檢視apb時鐘的相關資訊,這個就需要檢視stm32的時鐘樹了,我檢視了 

先進的基於arm核心的32位微控制器stm32e_en.pdf  其中的時鐘樹如下圖(圖3):

首先要知道的是usart1的時鐘是掛載在apb2上面的,由圖可以知道apb2時鐘的最高頻率為72mhz。

現在我們來推導4.5mbit/s的最高速度是怎麼計算得到的:

根據圖2中的第乙個公式,我們得出:

integerdivider = (72000000 / (16 * 4500000)) = 1

根據圖2的第二個公式,我們得出:

fractionaldivider = ((1.0 - (u32)1) * 16) + 0.5 = 0.5

那麼當我們將串列埠的波特率設定為4.5mbit/s時,程式通過分別寫入整數分頻器(integerdivider )以及小數分頻器(fractionaldivider ),這樣串列埠的波特率就成為了4.5mbit/s。

我們可以再舉個例子:

以我們常用的9600bit/s來舉例

integerdivider = (72000000 / (16 * 9600)) = 468

fractionaldivider = ((468.75 - (u32)468) * 16) + 0.5 = 12.5

對於串列埠除錯助手中常用的最高波特率為256000bit/s來說,stm32微控制器是完全可以支援的。

最後回到讓我語塞的那個問題:stm32支援的最大波特率為多少?

答:stm32支援的最大波特率為4500000bit/s,只要比這個值小的都是ok的~~

STM32波特率設定

usart1的波特率公式 baud rate fck 16 usartdiv usartdiv fck 16 baud rate 然後按下述方法計算,例如匯流排時鐘頻率為72mhz,配置波特率為9600過程如下 求得 usartdiv 468.75,因為stm32的波特比率暫存器usart brr分...

stm32波特率計算

1.什麼是波特率 不管是什麼微控制器,在使用串列埠通訊的時候,有乙個非常重要的引數 波特率。什麼是波特率 波特率就是每秒傳送的位元組數。雙方在傳輸資料的過程中,波特率一致,這是通訊成功的基本保障。下面以stm32微控制器為例,講解一下串列埠波特率的計算方法。2.stm32波特率相關的暫存器 stm3...

STM32之CAN 配置波特率

為了掌握如何設定stm32 can的波特率,首先我們得先了解一下位時間特性。位時間特性邏輯通過取樣來監視序列的can匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段 同步段 sync seg 通常期...