LPC2148的振荡器可以工作在两种模式:从属模式也就是外部输入信号源,频谱范围为1~50M。还有一种就是常用的政党模式,采用外部晶振,频谱范围1~30M。LPC2148上有两个 PLL 模块。当 PLL1 必须在 48MHz 的固定速率下提供 USB 时钟时,PLL0 生成 CCLK 时钟(系统时钟)。这两个 PLL 在结构上都相同,不同的是 PLL 的中断功能只保留用于 PLL0。PLL0 和 PLL1 接受的输入时钟频率范围仅为 10MHz~25MHz。输入频率通过使用一个电流控制振荡器(CCO)倍增到范围 10MHz~60MHz 用于 CCLK 以及 48MHz 用于 USB 时钟。下面是PLL的框图:
使用到的寄存器有:
PLLCON 控制寄存器,只有当其中的第0位PLLE和第1位都为1时,PLL输出时钟才能连接到微控制器中。
PLLCFG 配置寄存器,设置倍频值和分频值
PLLSTAT 状态寄存器,主要用于查询第10位PLCOK,看PLL是否锁定指定的频率。
PLLFEED 馈送寄存器,必须将正确的馈送序列写入 PLLFEED 寄存器才能使 PLLCON 和 PLLCFG 寄存器的更改生效。馈送序列如下:依次写入0XAA,0X55,有点像看门狗的功能。
板上的外部晶振为Fosc=12M,我们希望获得最快时钟Fcclk=60M,根据上面的图我们计算出M=60/12=5;因此设置PLLCFG 配置寄存器的分频值为M-1=4;根据Fcco的取值范围, 1.3<P<2.67,所以PLLCFG 配置寄存器的倍频值P只能取值2.然后我们按照这个顺序编写代码,设置成功电亮LED1
z PLLCON=1——设定 PLL 之前,必须使能 PLL,但不能连接 PLL;
z 设定 P 和 M 的值(PLLCFG);
z 发送 PLL 馈送序列;
z 等待 PLL 锁定——PLLSTAT. 10 = 1;
z PLLCON=3——设定 P 和 M 之后,连接 PLL;
z 发送 PLL 馈送序列,把 P 和 M 的值写入硬件。
主要代码:
#include <LPC214X.H>
#include "led.h"
void PLL_Init(void)//设置系统时钟CCLK=60M,默认VPB四分频=15M
{
PLL0CON=1; //使能PLL0
PLL0CFG=0X23; //设置M=4 P=2
PLL0FEED=0XAA; //发送PLL0馈送序列
PLL0FEED=0X55;
while((PLL0STAT&(1<<10))==0);//等待锁定
PLL0CON=3; //PLL0使能并连接
PLL0FEED=0XAA;
PLL0FEED=0X55;
}
int main(void)
{
PLL_Init();
Led_Init();
LED1_ON();
while(1)
{
} }
|