波特率的計(jì)算
STM32下的波特率和串口外設(shè)時(shí)鐘息息相關(guān),USART 1的時(shí)鐘來(lái)源于APB2,USART 2-5的時(shí)鐘來(lái)源于APB1。在STM32中,有個(gè)波特率寄存器USART_BRR,如下:

STM32串口波特率通過(guò)USART_BRR進(jìn)行設(shè)置,STM32的波特率寄存器支持分?jǐn)?shù)設(shè)置,以提高精確度。USART_BRR的前4位用于表示小數(shù),后12位用于表示整數(shù)。但是它還不是我們想要設(shè)置的波特率,想要設(shè)置我們串口的波特率大小還需要進(jìn)行計(jì)算。其實(shí)有關(guān)波特率的計(jì)算是下面這一條表達(dá)式:

從上面的表達(dá)式,我們引入了一個(gè)新量USARTDIV,它表示對(duì)串口的時(shí)鐘源fck進(jìn)行分頻。假設(shè)我們已知道了波特率和fck時(shí)鐘頻率的大小,那么通過(guò)上式便可以計(jì)算出USARTDIV的具體大小,然后再通過(guò)USART的值大小對(duì)波特率寄存器進(jìn)行設(shè)置。
USARTDIV通過(guò)上面的表達(dá)式得出,是一個(gè)帶有小數(shù)的浮點(diǎn)數(shù)(如27.75)。將小數(shù)部分和整數(shù)部分分開,分別得到一個(gè)整數(shù)值n(如27)和一個(gè)小數(shù)值m(如0.75)。有了這兩個(gè)值我們便可以填寫USART_BRR寄存器進(jìn)而設(shè)置我們串口波特率大小了。
將整數(shù)部分m(27 = 0x1B)直接寫入U(xiǎn)SART_BRR的后12位部分;將小數(shù)部分n乘以16后得到的整數(shù)值(如0.75 x 16 = 12 = 0xC)寫入U(xiǎn)SART_BRR前4位部分,最后USART_BRR的值為0x1BC。
注意:如果小數(shù)部分乘以16之后仍帶有小數(shù),則要四舍五入去除小數(shù)部分得到一個(gè)新的整數(shù),再將其寫入U(xiǎn)SART_BRR的前四位。
為什么在計(jì)算波特率的公式中要乘以16?
?我們知道串口通信是通過(guò)TXD和RXD這兩條線進(jìn)行通信的,當(dāng)接收器的RXD連接著發(fā)送器的TXD,接收器的TXD連接著發(fā)送器的RXD,接收器和發(fā)送器可以通過(guò)RXD和TXD互傳數(shù)據(jù)。當(dāng)接收器檢測(cè)到RXD這條線的電平被拉為低電平,立即開始接收發(fā)送器發(fā)送過(guò)來(lái)的數(shù)據(jù),剛剛那個(gè)低電平只是一個(gè)告知接收器可以接收數(shù)據(jù)的起始位而已。
在數(shù)據(jù)的傳輸中,信號(hào)可能受到一些干擾而產(chǎn)生一些抖動(dòng),如下圖。如果接收端只對(duì)這些信號(hào)數(shù)據(jù)采樣一次,那么它有可能采樣到的是抖動(dòng)的不準(zhǔn)的數(shù)據(jù),進(jìn)而使數(shù)據(jù)傳輸不準(zhǔn)確,所以接收端在采樣數(shù)據(jù)線上的數(shù)據(jù),通常都要采樣多次,然后通過(guò)比較獲得準(zhǔn)確的數(shù)據(jù)。

前面已經(jīng)說(shuō)過(guò),USARTDIV,它表示對(duì)串口的時(shí)鐘源fck進(jìn)行分頻,而這16表示的正是1bit數(shù)據(jù)的采樣次數(shù)。為什么呢?

,將這個(gè)表達(dá)式的分子分母倒過(guò)來(lái),可以得到下面這條表達(dá)式

每一位的傳輸時(shí)間只有1/TX_baud,這個(gè)總時(shí)間除以16,所以每采樣一次的時(shí)間正好是T1,即新分頻后的周期。而初始的串口時(shí)鐘信號(hào)來(lái)自于APBx,APBx時(shí)鐘信號(hào)需要經(jīng)過(guò)分頻才會(huì)等于T1,所以才需要分頻USARTDIV。
編輯:hfy
-
STM32
+關(guān)注
關(guān)注
2309文章
11161瀏覽量
373384 -
串口通信
+關(guān)注
關(guān)注
34文章
1662瀏覽量
57957 -
時(shí)鐘信號(hào)
+關(guān)注
關(guān)注
4文章
504瀏覽量
29958
發(fā)布評(píng)論請(qǐng)先 登錄
碩博電子IO模塊修改波特率和節(jié)點(diǎn)ID操作步驟
使用內(nèi)置晶振的話,串口波特率最大可以設(shè)置多少,不會(huì)丟包嗎?
FDCAN 數(shù)據(jù)段波特率增加后發(fā)送失敗的問(wèn)題分析
支持小數(shù)波特率的意義是什么
UART波特率計(jì)算及UART收發(fā)回顯實(shí)驗(yàn)
串口波特率設(shè)置1200用不了是怎么回事?
波特率是什么
可編程電源的通信波特率應(yīng)如何設(shè)置?
基于瑞薩64位MPU RZ/G2L的uboot串口多波特率支持介紹
STM32串口波特率大小計(jì)算案例
評(píng)論