串口的波特率如何計算?串口通信波特率計算
串口的波特率如何計算?串口通信波特率計算
波特率的計算
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。
初學單片機從51入門的好處 | |
51單片機是一款已經出現很久的單片機,它的出現可以說是劃時代的。同時期出現的其它單片機都已經逐漸退出曆史的舞台,而它卻依舊出現在某些專業的教材上。從這點來看,它依舊有其學習的意義。下麵說說初學單片機從51入門的好處。 51單片機的學習資源非常多... |
如何使用C語言控製硬件 | |
C語言的應用編程在單片機的領域占了很大一部分,使用的比較多的51單片機和STM32單片機都可以使用MDK軟件編寫固件。 單片機燒寫了固件後可以點亮LED燈,可以驅動ADC檢測電壓,也可以驅動蜂鳴器發聲,這就是簡單地控製硬件。稍微複雜一點的,可以驅動NRF2401進... |
c語言怎麼讀取一個變量的二進製文件內容 | |
C語言是一種高級語言,很多設置都為了符合我們程序員的理解做了相應的調整。機器對於變量的理解是基於電路,也就是所謂的高低電平。也是因為這個出現了一個二進製。 而人類的計數更喜歡使用十進製,有專家說是因為是人類當初計數使用的手指,這樣十進製比較... |
單片機為啥叫單片機 | |
1、MCU 我一般在工作計劃和原理圖的說明上,就直接將STM32或者STC89的單片機,標注為MCU。 無論是理解為Micro CPU,還是Microcontroller Unit,我認為都行,也沒有仔細去區分去過。自從32位單片機出來後,一些單片機設計的係統確實是具備部分電腦的功能。 你... |
16位單片機低端打不過8位高端打不過32位怎 | |
有時間去了解一下TI的MPS係列的單片機,它的低功耗和8位的51還有32位的STM32還是有一定的區別度的。 就比如MSP430係列,一些醫療的應用也少不了它,其各種低功耗的應用和例子一抓一大把。 也許從價格上來說,感覺,8位的便宜好買;從性能上來說,感覺,32位的... |
- 單片機和嵌入式哪個好
- 單片機重要特性含義解讀
- 單片機三總線結構及時序分析
- 單片機沒有PWM外設也可以做可調占空比
- 開源硬件arduino是什麼
- 標誌寄存器中的狀態標誌和控製標誌
- at89c51和stc12c5a60s2的引腳的區別
- 學習51單片機要用到哪些硬件工具
- 單片機定時的時間怎麼改變
- 單片機自動斷電或關機電路圖講解
- 串口的波特率如何計算?串口通信波特率計
- 單片機波特率計算公式和方法
- 51單片機ram區域劃分
- spi時序圖怎麼看?spi時序圖閱讀方法
- 51單片機怎麼顯示出數字的?單片機數碼管
- 51單片機有幾個中斷源_52單片機中斷源
- 嵌入式係統的評價方法
- AT89C51單片機為核心的時鍾電路的程序設
- stm32學到什麼程度叫精通
- 用STM32隻會庫函數不會用寄存器有影響嗎