PLL模块框图
xclkin是直接进来的外部时钟;
而下面的是振荡器(晶振出来)的时钟
PLLSTS 锁相环状态寄存器 PLLCR 锁相环控制寄存器
PLLSTS【oscoff】 决定着外部时钟的输入
PLLSTS【plloff】 锁相器关闭位 0使能PLL
锁相环控制寄存器用于控制芯片 PLL 的倍数,在向 PLL 控制寄存器进行写操
作之前,需要具备以下两个条件。
(1)在 PLL 完全锁住后,即 PLLSTS[PLLLOCKS]=1。
(2)芯片不能工作在 LIMP 模式,即 PLLSTS[MCLKSTS]=0。
PLLSTS寄存器
mclksts判断此位不能是1,如果是1
使用mclkclr位写1,mclksts清零此位
PLLCR 寄存器
DIV就是旁路PLL,即pLL配置了,不通给不作为系统时钟;
使用此PLLCR寄存器额外注意需要PLLSTS DIVSEL=0;
DIV设置好了,等待锁相环锁住就完成配置了
使用此寄存器倍频后,等待PLLSTS寄存器的PLLLOCK位=1完全锁住如下说明
最后通过PLLSTS【DIVSEL】分频送进系统时钟
最终的系统频率=输入时钟*DIV/DIVSEL div 有对应的表 DIVSEL也是
程序
void InitPll(Uint16 val, Uint16 divsel)//12 2
{
volatile Uint16 iVol;
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)//时钟信号丢失位 1为丢失
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1;//时钟信号丢失 清除/复位
EDIS;
asm(" ESTOP0"); // Uncomment for debugging purposes
}
if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)//如果分频了
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;//设置为不分
EDIS;
}
if (SysCtrlRegs.PLLCR.bit.DIV != val)
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;//丢失时钟检测关闭位 关闭
SysCtrlRegs.PLLCR.bit.DIV = val;//倍频
EDIS;
DisableDog();
while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)//等待锁相器锁上 等于1
{
}
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;//丢失时钟检测关闭位 开启
EDIS;
}
if((divsel != 2)) //
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;//采用2分
EDIS;
}
}