DSP2335的时钟PLL配置

2024-01-08 23:43:46

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;
    }
}

文章来源:https://blog.csdn.net/qq_36658033/article/details/135467192
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。