mcg_div_count( pll);
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK; //PTA18 和 PTA19 用于 晶振
// set clock dividers to desired value
SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(mcg_div.core_div) | SIM_CLKDIV1_OUTDIV4(mcg_div.bus_div);
//上电复位后,单片机会自动进入 FEI 模式,使用 内部参考时钟
//FEI -> FBE
OSC0_CR = ( 0
| OSC_CR_ERCLKEN_MASK //使能 外部参考时钟
//| OSC_CR_SC2P_MASK //配置电容
//| OSC_CR_SC4P_MASK //配置电容
//| OSC_CR_SC8P_MASK //配置电容
| OSC_CR_SC16P_MASK //配置电容
);
MCG_C2 = ( 0
| MCG_C2_RANGE0(2)
| MCG_C2_EREFS0_MASK
);
MCG_C1 = (0
| MCG_C1_CLKS(2)
| MCG_C1_FRDIV(7)
| MCG_C1_IRCLKEN_MASK
);
while (MCG_S & MCG_S_IREFST_MASK) {}; //等待FLL参考时钟 为 外部参考时钟(S[IREFST]=0,表示使用外部参考时钟,)(就卡在这里)
while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(0x2)) {}; //等待选择外部参考时钟
for(int i=1000;i>0;i--);
//现在已经进入了 FBE模式
//FBE -> PBE
MCG_C5 = MCG_C5_PRDIV0(mcg_cfg[pll].prdiv); //分频, EXTAL_IN_MHz/( PRDIV+1)
MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV0(mcg_cfg[pll].vdiv) ; //倍频, EXTAL_IN_MHz/( PRDIV+1) * (VDIV+24)
while (!(MCG_S & MCG_S_PLLST_MASK)) {}; //等待时钟源选择PLL
while (!(MCG_S & MCG_S_LOCK0_MASK)) {}; //等待 PLL锁了(锁相环)
// 现在已经进入了 PBE 模式
// PBE -> PEE
//MCG_C1 &= ~MCG_C1_CLKS_MASK;
MCG_C1 = MCG_C1_IRCLKEN_MASK;
while (((MCG_S & MCG_S_CLKST_MASK) ) != MCG_S_CLKST(0x3)) {};//等待选择输出PLL
// 现在已经进入了 PEE 模式
return mcg_cfg[pll].clk;
} //pll_init
|