1:brfd的用處
在k60的資料參考手冊的第1552頁中有給出一道波特率的求解公式
uart baud rate = uart module clock / (16 × (sbr[12:0] + brfd));即波特率=uart時鐘頻率/[16*(sbr暫存器的值+brfd)];,
b***是乙個5位的精細調整暫存器(位於uartx_c4暫存器的低5位),其數值除以32為brfd的值,易知brfd為0-1間的小數。brfd是為了使得公式計算出來的波特率接近於常用的波特率,說白了,就是減小誤差。
具體分析如下:若不設定b***暫存器,則brfd=0,那麼根據公式則有:uart baud rate = uart module clock / (16 × sbr[12:0] );比如uart時鐘頻率為10.2mhz,如果要求波特率為38400,那麼sbr[12:0]=17時,得出結果為10.2m/16/17=37500;若sbr[12:0]=16,結果為39843.75,可見無論取17還是16,都與38400有誤差,且誤差比較大。誤差出現的原因在於整數相除,如果分母能夠為小數,則誤差會小很多,brfd就是專門來為分母提供小數部分的。b***暫存器共5位,從00000-11111,brfd=b***[4:0]/32,結果必然為從0到31/32的小數;上面的例子中,取b***=10011b=19d;那麼brfd=19/32=0.59375;sbr[12:0]=16;波特率=10.2m/16/16.59375=38418,明顯的,該波特率已經非常接近38400了,誤差小了很多,這都是b***暫存器的功勞。
2:波特率的數值設定
根據上面給出的公式,波特率的設定問題就不難了。
比如設定波特率為9600(可以是其他的值),且已知uart時鐘頻率(單位為mhz,一般k60的uart0,uart1時鐘頻率為系統時鐘頻率,uart2-uart5的頻率為匯流排時鐘頻率),據公式可得sbr[12:0]+brfd=clock*10^6/16/9600,結果必然為一小數,整數部分為sbr[12:0],小數部分為brfd,所以只需對其取整即可,即sbr[12:0]=(uint32_t)clock*10^6/16/9600;接下來就可以求brfd了,已知sbr[12:0],那麼
brfd=clock*10^6/16/9600-sbr[12:0],等式兩邊同乘以32,b***=brfd*32=clock*10^6/4800-sbr[12:0]*32;至此,暫存器的值都求解完成,sbr[12:8]賦值給uart_bdh暫存器低5位,sbr[7:0]賦值給uart_bdl暫存器;b***賦值給uartx_c4的低5位。
至此,波特率設定的難點已經解決。
飛思卡爾k60從零開始之PLL
k60的時鐘相比51複雜很多很多,但是我們一般常用的時鐘就是經過鎖相環 pll 計算出來的時鐘,因為他用的是外部晶振,比晶元內部的晶振要準確,長時間不會產生飄逸等等優點。建議新手對照手冊,看一篇配置步驟即可,沒有必要弄的很通透,知道分頻是多少,倍頻是多少,最後設定出來的核心時鐘是多少即可。因為往後的...
飛思卡爾 UART 最高波特率的問題
在st的手冊中可以看到有uart最高波特率的說明,比如對於stm32f051,在其官方手冊中可以看到以下說明 其最高波特率為6 mbit s.作為搞飛思卡爾的我也研究了一下它是如何計算出來的 最高的波特率是 48m 2 16 6m 再來看看飛思卡爾uart最高的波特率,可惜的是在飛思卡爾手冊中並沒有...
簡述逐飛 K60 定時器程式的使用
程式使用 k60 逐飛科技庫 pit init ms pit1,1 設定定時器時間為 1ms定時器時間過長,會造成程式執行後出現的效果非常遲鈍。定時器時間過短,可能會使定時器裡的程式執行時間不夠,從而造成溢位。所以在時間方面需要細心拿捏。設定定時器的優先順序 set irq priority pit...