【原創】STM32下波特率計算詳解


波特率的計算

    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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM