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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值