
名词解释:PLL:锁相环,作用是产生稳定的时钟信号,通过输入时钟选择(主振荡器,内部RC振荡器IRC,RTC振荡器)其 一,经过M倍频,N分频,产生时钟信号PLLCLK也叫Fcco,这个时钟信号是所有其他部件时钟的源泉。倍频:将频率放大若干倍,计算式:*2*M分频:将频率缩小若干倍,计算式:/NFcco:锁相环PLL的输出频率,计算式:Fcco=Fin*2*M/N;其中Fin即使硬件电路选择的晶振频率,一般选择12M, M,N是通过PLL配置寄存器PLLCFG设置实现的。Fcclk:CPU时钟信号,计算式:Fcclk=FcLKCFG。其中CCLKCFG是CPU时钟配置寄存器。Fpclk:外围器件时钟信号,计算式:Fpclk_xyz=Fcclk/2 or /4 or/1,其中xyz表示不同的外设,具体分频根 据外设分频寄存器(PCLKSEL)的设置为准。时钟逻辑理解: 在上电或者任何复位时,LPC2300使用IRC即内部RC震荡电路输出的4M大小时钟信号,而三种时钟信号均可用作PLL的时钟源,所以需要通过软件对时钟源进行选择,如果选择主振荡器作为PLL的时钟源,需要设置系统控制和状态寄存器SCS的相关位进行使能主振荡器,PLL对输入的时钟源分别进行M倍频和N分频,然后输出Fcco,Fcco作为所有时钟的源头,经过不同的分频产生Fusbclk,Fcclk,Fcclk再经过不同的分频用于不同的外设。 值得注意的是,对于PLL的配置过程十分重要,要严格按照使用手册的设置序列进行设置,PLL设置序列: 1. 如果 PLL 已被连接,则用一个馈送序列断开与 PLL的连接。 2. 用一个馈送序列禁止 PLL 。 3. 如果需要,在没有 PLL 的情况下改变 CPU时钟分频器设置来加速操作。 4. 写时钟源选择控制寄存器来改变时钟源。 5. 写PLLCFG 并用一个馈送序列使其有效。PLLCFG 仅可在 PLL被禁止时更新。 6. 用一个馈送序列使能 PLL 。 7. 改变CPU 时钟分频器设置使之与 PLL 一起操作。在连接 PLL之前完成这个操作是 很重要的。 8. 通过监控 PLL S TAT 寄存器的 PLOCK位或使用 PLOCK中断来等待 PLL实现锁定,或当PLL 的输入时钟 为低(也就是 32kHz )时等待一个固定的时间。当 PLL参 考频率(REFCLK 的频率FREF 与预分频器值 分频所得的 PLL 输入频率相等)少于100kHz或大于20MHz时,PLOCK的值可能不稳定。在这些情况下, 可以假设 PLL在启动时间过后稳定下来。当FREF 大于400kHz时,这个时间为 500µ s;当 FREF 少于 400kHz时,这个时间为 200/FREF秒。 9. 用一个馈送序列连接 PLL 。 值得注意的是不要归并(merge)上面的任何一个步骤。例如,不能用相同的馈送序列 同时更新 PLLCFG 和使能PLL 。配置PLL的函数程序:voidConfigurePLL ( void ){ DWORD MValue,NValue; if ( PLLSTAT& (1 << 25)){PLLCON = 1;PLLFEED = 0xaa;PLLFEED = 0x55;} PLLCON =0; PLLFEED =0xaa; PLLFEED =0x55; SCS |=0x20; while( !(SCS& 0x40) ); CLKSRCSEL =0x1; PLLCFG = PLL_MValue |(PLL_NValue <<16); PLLFEED =0xaa; PLLFEED =0x55; PLLCON =1; PLLFEED =0xaa; PLLFEED =0x55; CCLKCFG =CCLKDivValue;#if USE_USB USBCLKCFG =USBCLKDivValue;#endif while ( ((PLLSTAT& (1 << 26)) == 0)); MValue = PLLSTAT& 0x00007FFF; NValue = (PLLSTAT& 0x00FF0000) >>16; while ((MValue !=PLL_MValue) && ( NValue !=PLL_NValue) ); PLLCON =3; PLLFEED =0xaa; PLLFEED =0x55; while ( ((PLLSTAT& (1 << 25)) == 0));return;}