STM32微控制器的串列埠通訊波特率應該這樣計算~
1
什麼是波特率
不管是什麼微控制器,在使用串列埠通訊的時候,有一個非常重要的引數:波特率。什麼是波特率:波特率就是每秒傳送的位元組數。雙方在傳輸資料的過程中,波特率一致,這是通訊成功的基本保障。下面以STM32微控制器為例,講解一下串列埠波特率的計算方法。
2
STM32波特率相關的暫存器
STM32微控制器設定波特率的暫存器只有一個:USART_BRR暫存器,如下圖所示。
該暫存器的有效位數為16位,前4位用於存放小數部分,後12位用於存放整數部分。將波特率算出來後,數值填入這個波特率就可以了。下面介紹如何計算。
3
波特率計算方法
STM32的資料手冊給出了計算方法,有一個公式,如下圖所示:
在這個公式上,共有三個變數,其中兩個我們是知道的,Fck和Tx/Rx波特率 這兩個是已知的,USARTDIV是未知的。通過該公式的描述可以看出如果使用USART1的話,那Fck就是PCLK2=72MHz,否則就是PCLK1=36MHz,Tx/Rx波特率這個引數是已知的。只需要計算出USARTDIV的值賦值給USART_BRR暫存器就可以了。以115200為例,將公式變形後得到:USARTDIV = 72×1000000/(16×115200) = 39.0625。即將39.0625寫入USART_BRR即可。
前文說過,USART_BRR的前4位存放小數部分,後12位存放整數部分。
那小數部分DIV_Fraction = 0.0625×16 = 1 = 0x01;
那整數部分DIV_Mantissa = 39 = 0x27;
那USART_BRR = 0X271;
資料手冊給我們提供了一張資料表:
在這張資料表上,已經算出了常用的波特率值,我們可以拿來直接用。但是如果我們想把波特率的計算做成一個傳參函式的方式,
如:USART_INIT(uint_t 16 Baud),在呼叫時只需要寫USART_INIT(9600),USART_INIT(115200),那程式該怎麼寫呢?
4
程式的實現
下面介紹的是暫存器版的程式。
程式第一步45行:先計算得到USART_DIV,這個就是前面公式的變形;
程式第二步46行:獲得USART_DIV的整數部分;
程式第三步47行:獲得USART_DIV的小數部分;
程式第四步48行:將整數部分左移4位,即存入BRR暫存器的後12位;
程式第五步49行:將整數和小數部分合在一起,即前4位和後12位重新組合;
程式第六步50行:將計算出來的數值賦給BRR暫存器。
這樣一個將波特率作為形參的函式就完成了。從以上來看的話,波特率的計算好像也不是很難啊。
免責宣告:本文系網路轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯絡,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。