新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32下波特率計算詳解

        STM32下波特率計算詳解

        作者: 時間:2016-11-19 來源:網絡 收藏
        波特率的計算

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

        本文引用地址:http://www.104case.com/article/201611/318196.htm

        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。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 北安市| 南部县| 舞钢市| 遵化市| 祁连县| 江达县| 江西省| 黑水县| 宁蒗| 胶南市| 米林县| 台中市| 崇文区| 阿克苏市| 利津县| 永泰县| 闽侯县| 慈利县| 鄱阳县| 涞源县| 清水河县| 巨鹿县| 长武县| 漳浦县| 门源| 娄底市| 曲周县| 邛崃市| 仪征市| 璧山县| 古交市| 奉节县| 乌鲁木齐县| 明星| 许昌县| 九寨沟县| 福清市| 阳山县| 会泽县| 兴仁县| 渭源县|