admin管理员组

文章数量:815297

关于恩智浦MCS9SXEP100芯片时钟配置的问题

关于恩智浦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 systemPLLCTL_PLLON=1;			// turn on PLLSYNR=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进行配置,配置完成后等待时钟稳定后就可以输出到系统了

本文标签: 关于恩智浦MCS9SXEP100芯片时钟配置的问题