飛思卡爾k60從零開始之PLL

2021-07-16 12:39:09 字數 1856 閱讀 6602

k60的時鐘相比51複雜很多很多,但是我們一般常用的時鐘就是經過鎖相環(pll)計算出來的時鐘,因為他用的是外部晶振,比晶元內部的晶振要準確,長時間不會產生飄逸等等優點。建議新手對照手冊,看一篇配置步驟即可,沒有必要弄的很通透,知道分頻是多少,倍頻是多少,最後設定出來的核心時鐘是多少即可。因為往後的其他所有的外圍模組都會涉及到時鐘,會讓你一點點明白它的。

閒話少說,先上**:

mcg->c1 = mcg_c1_clks(2) ;//選擇外部時鐘

mcg->c5 = mcg_c5_prdiv(pll_prdiv);//分頻後結果控制在2m`4m之間       

///設定系統分頻器

//mcg=pll, core = mcg, bus = mcg/2, flexbus = mcg/3, flash clock= mcg/8

sim->clkdiv1 = sim_clkdiv1_outdiv1(0) | sim_clkdiv1_outdiv2(1) 

| sim_clkdiv1_outdiv3(2) | sim_clkdiv1_outdiv4(7);       

mcg->c6 = mcg_c6_plls_mask | mcg_c6_vdiv(pll_vdiv);  

while (!(mcg->s & mcg_s_pllst_mask)){}; // wait for pll status bit to set    

while (!(mcg->s & mcg_s_lock_mask)){}; // wait for lock bit to set     

mcg->c1=mcg_c1_clks(0) ;//選擇pll時鐘輸出

//等待時鐘狀態位更新

while (((mcg->s & mcg_s_clkst_mask) >> mcg_s_clkst_shift) != 0x3){};

// 核心時鐘(系統時鐘)=外部時鐘(50m晶振頻率)/ (pll_prdiv+1)*(pll_vdiv+24);

core_clk=50000000/(pll_prdiv+1)*(pll_vdiv+24);

bus_clk =core_clk/2;

以上兩個紅色的就是分頻和倍頻。手冊上寫分頻後的頻率要在2~4m之間。經我實際測試,可以有出入。

最後兩句是我計算出來的核心時鐘和匯流排時鐘,和微控制器暫存器配置無關,可以刪掉,是為了給大家看看具體計算的過程用的。

為什麼計算prdiv和vdiv都要加1和24,理由如下:

prdiv這個暫存器內,寫入1,實際計算的是2,寫2,實際計算的是3.

vdiv寫0,實際用於計算的是24,寫1,計算用的是25.依此類推。

以我用的是50m的外部晶振,要配置核心時鐘為100m為例:

就是            pll_prdiv       = 24;//官方推薦頻率100m

pll_vdiv        = 26;

核心時鐘=50m/(24+1)*(26+24)=100m;

k60官方推薦的頻率是100m,很多同學喜歡超頻,喜歡更高的頻率,實際意義不大。首先超頻會簡短晶元壽命,其次,超頻到到臨界點時,頻率是很快,但是會不穩定,比如震動,靜電,會很容易讓mcu復位或者程式跑飛。

本人實測:100腳的k60,大概能超頻到180m。144引腳,dn系列k60能超頻到200左右,fn系列能超頻到220左右。

本人不是大神,可定有**講的不好的,不對的地方,希望大家指出,指教。可以加 飛思卡爾智慧型車恩智浦 254833542這個群,大家一起討論下。

飛思卡爾K60系列的UART的波特率設定問題

1 brfd的用處 在k60的資料參考手冊的第1552頁中有給出一道波特率的求解公式 uart baud rate uart module clock 16 sbr 12 0 brfd 即波特率 uart時鐘頻率 16 sbr暫存器的值 brfd b 是乙個5位的精細調整暫存器 位於uartx c4...

飛思卡爾ATD模組

s12xs系列mcu的atd模組有27個暫存器,六個轉換控制暫存器,兩個轉換狀態暫存器,乙個比較使能暫存器,乙個比較方式暫存器和16個轉換結果暫存器,附上一段例程 void atd init void 一般常用到的也就是這段例程中用到的幾個暫存器。include include derivative...

飛思卡爾中斷設定

對於飛思卡爾codewarrior的中斷使用,一般有3種方法 1.把 pragma trap proc放在中斷程式前面,並把中斷向量表放到 prm。例如 pragma trap proc void pit1 void 例如 interrupt void intpit1 void 向量表的首位址放入 ...