0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32串口波特率大小計算案例

454398 ? 來源:博客園 ? 作者:cposture ? 2020-10-23 14:19 ? 次閱讀

波特率的計算

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

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

從上面的表達(dá)式,我們引入了一個新量USARTDIV,它表示對串口的時鐘源fck進(jìn)行分頻。假設(shè)我們已知道了波特率和fck時鐘頻率的大小,那么通過上式便可以計算出USARTDIV的具體大小,然后再通過USART的值大小對波特率寄存器進(jìn)行設(shè)置。

USARTDIV通過上面的表達(dá)式得出,是一個帶有小數(shù)的浮點數(shù)(如27.75)。將小數(shù)部分和整數(shù)部分分開,分別得到一個整數(shù)值n(如27)和一個小數(shù)值m(如0.75)。有了這兩個值我們便可以填寫USART_BRR寄存器進(jìn)而設(shè)置我們串口波特率大小了。

將整數(shù)部分m(27 = 0x1B)直接寫入USART_BRR的后12位部分;將小數(shù)部分n乘以16后得到的整數(shù)值(如0.75 x 16 = 12 = 0xC)寫入USART_BRR前4位部分,最后USART_BRR的值為0x1BC。

注意:如果小數(shù)部分乘以16之后仍帶有小數(shù),則要四舍五入去除小數(shù)部分得到一個新的整數(shù),再將其寫入USART_BRR的前四位。

為什么在計算波特率的公式中要乘以16?

?我們知道串口通信是通過TXD和RXD這兩條線進(jìn)行通信的,當(dāng)接收器的RXD連接著發(fā)送器的TXD,接收器的TXD連接著發(fā)送器的RXD,接收器和發(fā)送器可以通過RXD和TXD互傳數(shù)據(jù)。當(dāng)接收器檢測到RXD這條線的電平被拉為低電平,立即開始接收發(fā)送器發(fā)送過來的數(shù)據(jù),剛剛那個低電平只是一個告知接收器可以接收數(shù)據(jù)的起始位而已。

在數(shù)據(jù)的傳輸中,信號可能受到一些干擾而產(chǎn)生一些抖動,如下圖。如果接收端只對這些信號數(shù)據(jù)采樣一次,那么它有可能采樣到的是抖動的不準(zhǔn)的數(shù)據(jù),進(jìn)而使數(shù)據(jù)傳輸不準(zhǔn)確,所以接收端在采樣數(shù)據(jù)線上的數(shù)據(jù),通常都要采樣多次,然后通過比較獲得準(zhǔn)確的數(shù)據(jù)。

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

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

每一位的傳輸時間只有1/TX_baud,這個總時間除以16,所以每采樣一次的時間正好是T1,即新分頻后的周期。而初始的串口時鐘信號來自于APBx,APBx時鐘信號需要經(jīng)過分頻才會等于T1,所以才需要分頻USARTDIV。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10828

    瀏覽量

    352432
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1601

    瀏覽量

    55230
  • 時鐘信號
    +關(guān)注

    關(guān)注

    4

    文章

    434

    瀏覽量

    28391
收藏 人收藏

    評論

    相關(guān)推薦

    串口通信中的波特率你真的了解嗎?差距竟如此重要!

    波特率串口通信中的作用在串口通信中,波特率起著至關(guān)重要的作用。因為在傳輸數(shù)據(jù)時,發(fā)送方和接收方需要以相同的波特率進(jìn)行通信。如果兩端的
    的頭像 發(fā)表于 08-27 11:46 ?538次閱讀
    <b class='flag-5'>串口</b>通信中的<b class='flag-5'>波特率</b>你真的了解嗎?差距竟如此重要!

    STM32U575串口接收+GPDMA波特率不匹配導(dǎo)致失敗怎么解決?

    我用CubeMX配置的串口+GPDMA接收,115200波特率正常能用, 然后如果波特率設(shè)置錯誤為9600,再改回來115200,接收就不能用了,調(diào)試好像時DMA出錯了,然后啟用HAL_UARTEx_ReceiveToIdle_
    發(fā)表于 07-04 08:11

    如何使用示波器測量串口波特率

    詳細(xì)介紹如何使用示波器測量串口波特率,包括準(zhǔn)備工作、設(shè)置示波器、測試步驟、結(jié)果計算及注意事項等方面,旨在為讀者提供一份詳盡的指南。
    的頭像 發(fā)表于 05-27 16:25 ?2929次閱讀

    STM32F412串口波特率最大調(diào)到3.1M就上不去了,怎么解決?

    之前,用STM32F407的芯片做了串口usart6通訊,波特率調(diào)整到3.9M可以正常通訊,發(fā)送的數(shù)據(jù)也都對?,F(xiàn)在換STM32F412后發(fā)現(xiàn)最大頻率的
    發(fā)表于 04-02 07:50

    stm32mp157在linux系統(tǒng)下,串口波特率如何使用非標(biāo)準(zhǔn)波特率?

    請問stm32mp157在linux系統(tǒng)下,串口波特率如何使用非標(biāo)準(zhǔn)波特率153600。內(nèi)核或者設(shè)備樹里需要怎么改動? 麻煩答復(fù)一下,最好能給個詳細(xì)的更改示例,謝謝!
    發(fā)表于 03-14 06:21

    什么是串口波特率?串口通信為什么要設(shè)置波特率?

    什么是串口波特率?串口通信為什么要設(shè)置波特率?波特率與比特的關(guān)系 如何選擇
    的頭像 發(fā)表于 01-22 16:10 ?1543次閱讀

    TC377波特率計算是否與幀大小有關(guān)?

    brZ 如圖 471 所示, 我想知道這個波特率計算是否與幀大小有關(guān)? 例如,4 位幀、8 位幀、32 位幀?波特率是指一幀/秒嗎? 對于 32 位幀,它是 32 位/秒?
    發(fā)表于 01-22 06:29

    什么是串口波特率?串口通信為什么要設(shè)置波特率?

    在電子設(shè)備的世界中,數(shù)據(jù)是通過各種方式進(jìn)行傳輸?shù)?。其中?b class='flag-5'>串口通信是一種常見的數(shù)據(jù)傳輸方式,它以其簡單、可靠和廣泛的特性,成為了電子設(shè)備間通信的重要手段。而在串口通信中,有一個非常重要的參數(shù)——波特率
    的頭像 發(fā)表于 11-03 08:21 ?3760次閱讀
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b>通信為什么要設(shè)置<b class='flag-5'>波特率</b>?

    STM32中如何對CAN波特率進(jìn)行計算?

    STM32中如何對CAN波特率進(jìn)行計算。
    發(fā)表于 11-03 07:06

    Ch559串口0的怎么達(dá)到115200的波特率?

    Ch559串口0的怎么達(dá)到115200的波特率?
    發(fā)表于 10-31 07:24

    STM32串口通信簡明知識

    STM32串口通信簡明知識
    的頭像 發(fā)表于 10-25 15:48 ?1159次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通信簡明知識

    SJA1000波特率計算

    電子發(fā)燒友網(wǎng)站提供《SJA1000波特率計算.zip》資料免費下載
    發(fā)表于 10-13 11:43 ?6次下載
    SJA1000<b class='flag-5'>波特率</b><b class='flag-5'>計算</b>

    Linux中如何在stty修改串口波特率

    Linux內(nèi)核啟動后,串口波特率通常是115200或者9600,此時如果想要修改串口波特率,在shell中通過stty指令就能完成,而不需要修改驅(qū)動代碼。 stty:set tty
    的頭像 發(fā)表于 10-04 15:28 ?1067次閱讀

    請問stm32串口可配置的波特率有哪些?

    stm32f1的串口波特率最大支持4.5M,但是我們一般使用的波特率一般是120024004800960014400192003840057600115200 和 230400bps,
    發(fā)表于 09-26 07:18

    STM32 USART自動波特率檢測

    電子發(fā)燒友網(wǎng)站提供《STM32 USART自動波特率檢測.pdf》資料免費下載
    發(fā)表于 09-25 15:09 ?8次下載
    <b class='flag-5'>STM32</b> USART自動<b class='flag-5'>波特率</b>檢測