波特率計算STM32下的波特率與串行端口外設時鐘密切相關。
USART 1的時鐘源自APB2,USART 2-5的時鐘源自APB1。
在STM32中,有一個波特率寄存器USART_BRR,如下所示:STM32串行端口波特率由USART_BRR設置,STM32波特率寄存器支持小數設置以提高精度。
USART_BRR的前4位數字代表小數,后12位數字代表整數。
但這不是我們要設置的波特率,我們需要計算串行端口的波特率。
實際上,波特率的計算公式如下:從上面的表達式中,我們引入了一個新的量USARTDIV,它表示串行時鐘源fck的分頻。
假設我們已經知道波特率和fck時鐘頻率的大小,則可以通過上式計算USARTDIV的具體大小,然后可以通過USART的值設置波特率寄存器。
USARTDIV是通過上面的表達式獲得的,它是一個帶小數的浮點數(例如27.75)。
將小數部分與整數部分分開,得到整數值n(例如27)和十進制值m(例如0.75)。
使用這兩個值,我們可以填寫USART_BRR寄存器并設置串行端口的波特率。
將整數部分m(27 = 0x1B)直接寫入USART_BRR的最后12位數字;將小數部分n乘以16得到的整數值(例如0.75 x 16 = 12 = 0xC)被寫入USART_BRR的前4位,最后USART_BRR的值為0x1BC。
注意:如果小數部分乘以16并且仍然有小數,則需要四舍五入并除去小數部分以獲得新的整數,然后將其寫入USART_BRR的前四位。
為什么在計算波特率的公式中乘以16。
我們知道串行通信是通過兩條線路TXD和RXD進行通信的。
當接收器的RXD連接到發送器的TXD時,接收器的TXD連接到發送器。
使用RXD,接收器和發送器可以通過RXD和TXD相互傳輸數據。
當接收器檢測到RXD線的電平被拉至低電平時,它立即開始接收由發送器發送的數據。
剛才的低電平只是通知接收器它可以接收數據的開始位。
如下圖所示,在數據傳輸中,信號可能會受到一些干擾并引起抖動。
如果接收端僅對這些信號數據采樣一次,則可能會采樣抖動和不準確的數據,這將使數據傳輸不準確。
因此,通常需要對接收端的采樣數據線上的數據進行多次采樣。
,然后通過比較獲得準確的數據。
如前所述,USARTDIV意味著對串行端口的時鐘源fck的頻率進行分頻,而這16則恰好意味著1bit數據的采樣數。
為什么?反轉該表達式的分子和分母,可以得出以下表達式的每一位的傳輸時間僅為1 / TX_baud。
該總時間除以16,因此每個采樣的時間正好是T1,即經過新的分頻后的周期。
初始串行端口時鐘信號來自APBx,因此需要將APBx時鐘信號劃分為等于T1的頻率,因此有必要劃分USARTDIV的頻率。
*本文在線轉載,版權歸原作者所有。
如果有任何侵權,請聯系以將其刪除。
免責聲明:本文的內容是在21ic授權后發布的。
版權屬于原始作者。
該平臺僅提供信息存儲服務。
本文僅代表作者的個人觀點,并不代表該平臺的立場。
如有任何疑問,請與我們聯系,謝謝!