S3C2410串口波特率的計算
我這里只根據(jù)我的失敗經(jīng)驗談一下設置波特率寄存器UBRDIVn的值的計算要注意的一個問題。
本文引用地址:http://butianyuan.cn/article/201611/317242.htmdatasheet上UBRDIVn寄存器部分寫著:
UART BAUD RATE DIVISOR REGISTER
There are three UART baud rate divisor registers including UBRDIV0, UBRDIV1 and UBRDIV2 in the UART block.
The value stored in the baud rate divisor register (UBRDIVn), is used to determine the serial Tx/Rx clock rate (baudrate) as follows:
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
( UART clock: PCLK, FCLK/n or UEXTCLK )
Where, UBRDIVn should be from 1 to (216-1), but can be set zero only using the UEXTCLK which should be smaller than PCLK.
For example, if the baud-rate is 115200 bps and UART clock is 40 MHz, UBRDIVn is:
UBRDIVn = (int)(40000000 / (115200 x 16) ) -1
= (int)(21.7) -1 [round to the nearest whole number]
= 22 -1 = 21
也就是說,只要知道這個UART clock 就計算出UBRDIVn 的值,下面分別講:
1. UEXTCLK
查手冊:The UART can support bit rates up to 115.2K bps using system clock. If an external device provides the UART with UEXTCLK, then the UART can operate at higher speed.是說當用系統(tǒng)時鐘(system clock)時UART波特率最高可達到115200,但是如果用這個UEXTCLK(external clocks for the UART operation)串口外設時鐘,可以設置115200以上的波特率。
2. PCLK和FCLK/n
這里又分兩種情況:使用MPLL和不使用MPLL
我們知道s3c2410最高頻率可達266M,s3c2440最高頻率可達533M,而一般外接晶振只有幾十M,如何使幾十M變成幾百M呢?這就是MPLL的功勞了
s3c2410有兩個pll(phase locked loop,鎖相環(huán),在高頻中學過,可以實現(xiàn)倍頻,s3c2410的高頻就是由此電路產(chǎn)生的)。其中一個是MPLL,M即為main,用來產(chǎn)生三種時鐘信號:Fclk(給CPU核供給時鐘信號,我們所說的s3c2410的cpu主頻為200MHz,就是指的這個時鐘信號,相應的,1/Fclk即為cpu時鐘周期)、Hclk(為AHB bus peripherals供給時鐘信號,AHB為advanced high-performance bus)、Pclk(為APB bus peripherals供給時鐘信號,APB為advanced peripherals bus)。AHB和APB這兩種總線所連的外設是有區(qū)別的。AHB總線連接高速外設,低速外設則通過APB總線互連。顯然,對不同總線上的外設,應該使用不同的時鐘信號,AHB總線對應Hclk,APB總線對應Pclk。那么事先就應該弄清楚,每條總線對應的外設有那些,這樣在設置好時鐘信號后,對應外設的初始化的值就要依此而確定了。
當不使用MPLL(即不設置MPLLCON寄存器)時,外部晶振直接作為系統(tǒng)時鐘。一般外部晶振有兩個,一是用于系統(tǒng)時鐘,為12MHz(或其他,由具體板子決定);一個用于實時時鐘(RTC,real time clock,根據(jù)CPU的要求送出或設定時鐘、日歷的各種數(shù)據(jù)),為32.768KHz。此時,PCLK即為12MHz。
當使用MPLL時,要通過對寄存器MPLLCON和CLKDIVN的設置來得到FCLK、HCLK和PCLK。
得到這個UART clock(PCLK, FCLK/n or UEXTCLK ),根據(jù)公式
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
來計算就簡單了。
評論