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