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暫存器。
這樣乙個將波特率作為形參的函式就完成了。從以上來看的話,波特率的計算好像也不是很難啊。
STM32波特率設定
usart1的波特率公式 baud rate fck 16 usartdiv usartdiv fck 16 baud rate 然後按下述方法計算,例如匯流排時鐘頻率為72mhz,配置波特率為9600過程如下 求得 usartdiv 468.75,因為stm32的波特比率暫存器usart brr分...
STM32之CAN 配置波特率
為了掌握如何設定stm32 can的波特率,首先我們得先了解一下位時間特性。位時間特性邏輯通過取樣來監視序列的can匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段 同步段 sync seg 通常期...
STM32之CAN 配置波特率
為了掌握如何設定stm32 can的波特率,首先我們得先了解一下位時間特性。位時間特性邏輯通過取樣來監視序列的can匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段 同步段 sync seg 通常期...