ADSP处理器的锁相环和时钟控制[原创]
0赞继之前的GPIO的学习,今天准备学一下ADSP处理器的锁相环和时钟控制。ADSP处理器使用来自外部晶振的正弦输入,或经过缓冲整形的外部时钟。如果使用外部时钟,该时钟信号应该是TTL兼容信号,而且正常运行时,此时钟不能停止、改变、或低于指定的频率。此外部时钟应连到DSP的CLKIN引脚,且XTAL引脚必须悬空。还有另外一种方法,由于ADSP处理器有片内振荡电路,所以外部晶振也可以使用。外部晶振应当连接到CLKIN和XTAL引脚,并与两个电容相连,如下图所示。晶振最好使用并联谐振、基因频率、微处理器级的晶振。

如下图为所用BF531开发板上的时钟电路,该处理器使用经过缓冲整形的外部时钟,外部时钟输出口直接接处理器的CLKIN输入口,可供大家设计参考:

外部时钟经过CLKIN端口进入处理器后,又是经过怎样的处理后再分配给内部各个处理部分的呢?下面我们再来看ADSP-BF531处理器的内部时钟是怎么控制的,如下图是时钟从输入端到内部的时钟处理环节:

如上图,内核时钟CCLK和系统外设时钟SCLK可由输入时钟CLKIN信号获得。首先输入时钟CLKIN经过DF和MSEL控制位的控制获得VCO时钟信号,然后VCO信号再经过SSEL和CSEL控制位分别获得CCLK和SCLK信号。下面是四种控制位对输入时钟的控制作用:分频位DF和倍频因子选择位MSEL可以用来对CLKIN进行多种不同的倍频,但最终的倍频结果不能超过VCO的最高频率。其中DF是用来使能输入分频器,MSEL用来控制反馈回路中的分频器。如下图为DF和MSEL输出不同值时VCO与CLKIN之间的倍率:

而设置这两种控制位的值则通过设置PLL_CTL寄存器的相应位的值来设置,PLL_CTL寄存器的各个位的作用如下:

DF位于该寄存器的0位,MSEL位于该寄存器的9至14位,对照前面的表格就可以设置出不同的VCO时钟信号。例如,当DF=1,MSEL等于16时,VCO=0.5*16CLKIN=8CLKIN,即8位频。呵呵,是不是挺好理解的。
接着我们来看SSEL和CSEL是如何控制VCO信号的?请看下面这个寄存器PLL_DIV:
1121
由图我们可以很清楚地看到SSEL位于PLL_DIV寄存器的0至3位,而且由SCLK=VCO/X(1<X<15),我们可以看出这是一个分频信号,分频范围为1至15倍。而CSEL位于PLL_DIV寄存器的4至5位,并且通过这两位的值的不同,CCLK可以获得1、2、4、8这四种分频结果。
总结一下,通过以上的学习,我们可以大概知道输入时钟CLKIN先经过DF和MSEL控制位的倍频处理,然后再经过CSEL和MSEL控制位的分频处理,最终可以得到各种时钟频率。
下面我们以一个实例来讲一下ADSP是怎么设置系统时钟的,程序如下:
void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel; //设置系统时钟分频系数,内核时钟不做分频,CSEL=0,即表示1分频
asm("ssync;"); //系统同步
new_PLL_CTL = (pmsel & 0x3f) << 9; //将VCO倍频系数移位至设置的位置,由寄存器我们可以知道MSEL位于第9至14位,位长为6位,所以先与上3f,而由于是从第9位开始,所以要左移9位。
*pSIC_IWR |= 0xffffffff; //将系统中断唤醒使能
if (new_PLL_CTL != *pPLL_CTL) //判断是否已经配置过倍频系数
{
*pPLL_CTL = new_PLL_CTL;//如果没有则继续配置倍频系数
asm("ssync;"); //同样是系统同步
asm("idle;"); //最后将处理器设置为空闲状态
}
}
假设处理器的输入时钟为25MHZ,那么我们可以在系统初始化中通过Set_PLL(16,3)语句来设置系统时钟,其中16为倍频系数,3为分频系数,整个语句表示将内核时钟配置为16倍倍频,将系统时钟再配置为3倍分频。所以内核时钟为25*16MHZ=400MHZ,系统时钟再3倍分频,即400/3=133MHZ。
