本帖最后由 mxj1005071012 于 2013-10-22 17:05 编辑
PLL 就是锁相环,作用就是提高总线的工作频率,通俗讲设置 PLL 锁相环就相当于超频。 概念:无源晶振为 crystal(晶体),而有源晶振则叫做 oscillator(振荡器)。
根据这三个公式设置总线频率
公式说明:
压控振荡器 VCO
OSC、FOSC、OSCCLK:外加晶振频率(待确定)
SYNDIV 由 SYNR 寄存器的 0-5 位设定:
synthesizer :1.合成器,综合器 2.合成仪 3.频率合成器 注意其写入条件。PLLSEL=1,即在PLL启动后写无效了
SYNR寄存器的7、6位设定条件如下
Frequency:频率SYNR:CRG 合成器寄存器CRG:时钟及复位发 REFDIV由REVDV寄存器的0-5位决定:
Reference:n. 参考,参照;涉及,提及;参考书目;介绍信;证明书
Divider:分配器REFDV:CRG 参考分频寄存器
POSTDIV:快速分频控制寄存器
应该是控制FVCO 和PLLCLK 的分频比,一般设置为 0,这时FPLL= FVCO/1=FVCO,即当POSTDIV=0时,fPLL=fVCO FPLL、PLLCLK:锁相环频率(待确定)FBUS、Bus Clock:总线频率(待确定)
CLKSEL:时钟选择寄存器
PLLSEL 位,选定锁相环(PLL Select)位,置为1 选定锁相环时钟。0:系统时钟来自晶振1:系统时钟来自锁相环PSTP 位,选定伪停止(PSEUDO Stop)模式下振荡器工作还是停止,置为1 则振荡器不停止。0:在停止模式下,震荡器停止1:在停止模式下,震荡器不停止XCLKS:显示震荡器配置状态0:闭环控制的皮尔斯振荡器被选择1:外部时钟/全速震荡的皮尔斯振荡器被选择
PLLWAI:PLL 停止在等待模式下0:IPLL 保持运行在等待模式下1:IPLL 在等待模式下停止如果PLLWAI 的设置, S12XECRG 将清除PLLSEL 位在进入等待模式之前,PLLON 位将保持设置在等待模式中,但IPLL 将被关机。在退出等待模式时,PLLSEL 位不得不手动设置,如果PLL 时钟需要RTIWAI,置Wait 模式下内核时钟停止工作位置为l,则Wait 模式下内实时时钟停止工作。0:RTI 在等待模式下继续运行1:RTI 停止并初始化分配器COPWAI 位,置Walt 模式下看门狗时钟停止工作位置为1,则Wait 模式下看门狗时钟停止工作。CLKSEL //CLKSEL=0,选择外部晶振为时钟源CLKSEL_COPWAICLKSEL_RTIWAICLKSEL_PLLWAICLKSEL_XCLKSCLKSEL_PSTPCLKSEL_PLLSEL
PLLCTL:锁相环控制寄存器
CME 位,时钟监控允许位(Clock MonitorEnable),CME=1 时,时钟监控允许;CME;=0禁止PLLON 位,锁相环电路允许位,PLLON=1 时,锁相环电路允许;=0 时,禁止。FM1, FM0:IPLL 频率调制使能位
这两位是用来减少躁声用的,任何时候都可以写,除了PLLSEL=1时FSTWKP:快速唤醒从完全停止位0:快速唤醒被禁止1:快速唤醒被允许,当允许后系统会立刻恢复到自时钟模式,SCMIF 将不会被置位,该系统将继续留在自我时钟模式,振荡器和时钟监控停用直到FSTWKP位清除,清理
FSTWKP 将启动振荡器,时钟监测和时钟质量检查,如果时钟质量检查成功,将开起S12XECRG 所有系统时钟到OSCCLKPRE 位,CPU 伪停止状态时(Pseudo STOP),PRE=1(实时中断RTI)允许PRE=O 时,实时中断(RTI)禁止。PCE,CPU 虚拟停止时,看门狗(COP)允许位。PCE=1 时,允许看门狗:PCE=0 时,禁止看门狗。SCME 位,自时钟方式允许位(SEIF clock Mode Enable)*SCME=l 时,探测到外部晶振失效时产生复位信号;SCME;0 时,探测到外部晶振失效时进入自给时钟方式。通常,单片机的片内寄存器在CPU复位时都是清0的。在此,注意到,这个锁相环控制寄存器见PLLCTL在复位后有2位为1,在没有全面掌握某个CPU的特性之前,尽可能使用复位后的默认参数是一条原则,这可以使系统初始化的处理尽量简单。使用默认参数,可以不对PLLCTL寄存器做任何初始化。对于复位后清零的寄存器恐怕要想一想这些O 参数是否合理,是否能工作。PLLCTLPLLCTL_SCMEPLLCTL_PCEPLLCTL_PREPLLCTL_FSTW**LLCTL_FM0PLLCTL_FM1PLLCTL_PLLONPLLCTL_CMEPLLCTL_FM
补充:中断配置(若需要) 实时时钟,锁相环和自时钟模式中断使能,当相应标志位置位时,中断发生。CRGINTCRGINT_SCMIECRGINT_RTIECRGINT_LOCKIE CRG标志寄存器:
RTIF 位,实时中断标志位。RTIF=1 表示发生了实时中断超时中断,向该位写1 清中断标志位PORF 位,上电复位标志。0:没发生1:复位发生LVRF:低电压复位标志1:发生电压太低复位LOCKIF=1 表示锁相环锁定位发生变化产生中断请求。LOCK 位,锁相环频率锁定标志。LOCK=1 表示时钟频率已稳定锁相环频率已锁定。ILAF:不合法的地址复位标志1:地址不合法,发生复位的标记SCMIF 位,自给时钟中断标志。SCMIF;1 表示SCM 位发生了变化;SCM 位,自给时钟状态(Self Clock Mode)位SCM=1 表示系统靠自给时钟工作,外部晶振停振。与系统时钟初始化有关的是锁相环频率锁定标志LOCK,为1 表示时钟频率已稳定锁相环频率已锁定。CRG标志寄存器CRG标志寄存器_SCMCRG标志寄存器_SCMIFCRG标志寄存器_ILAFCRG标志寄存器_LOCKCRG标志寄存器_LOCKIFCRG标志寄存器_LVRFCRG标志寄存器_PORFCRG标志寄存器_RTIFCRGINTCRGINT_SCMIECRGINT_LOCKIECRGINT_RTIE PLL初始化步骤:1. 设定总线频率由外部晶振频率决定
2. 设置PLL相关参数,改变fBUS 值3. 等待PLL稳定4. 设定总线频率由fPLL决定 几点疑问:1.代码里while(!CRG标志寄存器_LOCK);这句是干什么的?答:时钟校正同步2.为什么代码中会有多多少少的几句空语句?答:锁相环从设定到最后稳定还是需要一点点时间的,所以需要加几条空指令 _asm(nop);执行一个空语句 null(无效的) opreation(操作) 延时3.PLL 锁相环怎么设置?答:通过写REFDV(CRG 参考分频寄存器)和SYNR(CRG 合成器寄存器)进行设置4.SYNR 和REFDV都是低6 位来设定所要超的频率,其高2 位是根据你要超的频率来配置,通过合理的配置VCOFRQ,REFFRQ 来提高系统时钟稳定性格式:VCOFRQ[7:6]=0b11;SYNDIV[5:0]=0b001001,,0b为二进制5.运算符 ‘丨’按位或
void pll_init()
{
/*
#define BIT_SET(x) 1<<x
#define BIT_CLR(y) ~(1<<y)
*/
SIM_SCGC4 |= SIM_SCGC4_LLWU_MASK;
LLWU_CS |= LLWU_CS_ACKISO_MASK;
//进入FBI
MCG_C1|=BIT_SET(7);//选择外部时钟
while(!(MCG_S&0x08));//确认在使用外部时钟
//进入了FBI,准备进入FBE
MCG_C1&=BIT_CLR(2);//给FLL选择外部参考时钟
while(MCG_S&0x10);//确认FLL使用的是外部参考时钟
//进入了FBE,准备进入PBE
MCG_C6|=BIT_SET(6);
MCG_C5=0x13;
MCG_C6|=0x10;
while(!(MCG_S&0x40));
//进入了PBE,准备进入PEE
MCG_C1=0;
while((MCG_S&0x0c)!=0x0c);
//进入了PEE
} |