关于恩智浦MCS9SXEP100芯片时钟配置的问题
起因: 最近工作上用到了恩智浦的MC9SXEP100芯片,在对其使用过程中对时钟模块配置和调试看门狗芯片SGM760时遇到的一些问题进行记录和交流,方便大家一起探讨。
初体验
刚拿到MC9SXEP100开发板查看数据手册时,就感到这款芯片调试起来会很麻烦,相较于其他芯片的库函数版程序,XEP100全部需要对寄存器进行操作。无形中增加了很多调试难度,和学习成本。
XEP100的时钟配置
关于XEP100的时钟配置主要有9个寄存器,其中我们主要需要配置的是3个寄存器,
- 1. SYNR(时钟合成器寄存器)
SYNR 寄存器用来控制锁相环的倍频系数,并确定VCOCLK的频率范围。
其中 VCOFRQ[0:1] 作用是确定VCOCLK的频率范围。
而我们最终想要的busClock是通过PLLClock得到的
(后面有详细的解释)
SYNDIV[5:0]——锁相环的倍频系数
- 2. REFDV(参考时钟分频器寄存器)
REFFRQ[1:0]—参考时钟频率选择
这两位用来配置内部锁相环的滤波器,以达到最佳的稳定性和锁定时间。这两位的选取要根据实际的参考时钟REFCLK的频率确定,REFCLK时钟的频率可以通过下式进行计算:
POSTDIV[4:0] (POST分频器寄存器)
POSTDIV 寄存器控制VCOCLK与PLLCLK之间的分频系数。PLLCLK时钟的频率如下式计算
如果POSTDIV =0,则FPLL=Fvco
实例演示
假如现在的外部晶振是8MHz,我们想配置一个32MHZ的BusClock
由BusClock为32MHz可知PLL时钟为64MHZ
若配置POSTDIV 为0
则Fvco为64MHz
由图可知:
(SYNDIV+1)/(REFDIV+1)=4
则可以配置REFDIV为1,SYNDIV为7
由这个公式可知Fref为4MHz
查表可知 REFFRQ[1:0] 需要配置为01
总结一下:
SYNR为0x07
REFDV为0x11
POSTDIV=0
程序演示
void setbusclock(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
SYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]
// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
// fPLL= fVCO/(2 × POSTDIV)
// fBUS= fPLL/2
// VCOCLK Frequency Ranges VCOFRQ[7:6]
// 32MHz <= fVCO <= 48MHz 00
// 48MHz < fVCO <= 80MHz 01
// Reserved 10
// 80MHz < fVCO <= 120MHz 11
REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]
// fREF=fOSC/(REFDIV + 1)
// REFCLK Frequency Ranges REFFRQ[7:6]
// 1MHz <= fREF <= 2MHz 00
// 2MHz < fREF <= 6MHz 01
// 6MHz < fREF <= 12MHz 10
// fREF > 12MHz 11
// pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)
// If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).
_asm(nop); // BUS CLOCK=16M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
不难看出代码中需要先禁止PLL输出到系统,然后再打开PLL进行配置,配置完成后等待时钟稳定后就可以输出到系统了