ADI的SHARC系列处理器的内核PLL管理(4.2)
SHARC处理器使用PLL来获得比时钟源(CLKIN)更高频率的时钟。PLL产生处理器的外设、处理器内核和内部存储器所需的时钟。在硬件上电期间,处理器的CLK_CFG1-0引脚选择处理器内核时钟(CCLK)与CLKIN之比,通过开关来选择比值,比值包括6:1,16:1,32:1。电源管理控制寄存器(PMCTL)可实现由软件对PLL的动态编程。PMCTL用于选择硬件引脚不支持的CCLK与CLKIN的比值。
PLL的框图如图所示:
它包括单输入分频器、乘法器和一个产生CCLK的分频器。
对于ADSP-2136x和ADSP-2137x处理器来说PCLK是CCLK的一半。
下面介绍一下PLL编程步骤:
在设置了乘法器的值之后,仅使用乘法器对PLL编程时,应用程序应将PLL设置为旁路模式并等待PLL锁定在新频率。在旁路模式,处理器内核运行频率为CLKIN。PLL在4096个CCLK周期(在本例是CLKIN周期)之后才能锁定于编程频率。一旦PLL锁定,应将旁路模式取消。
仅使用分频器对PLL编程时,分频器的值通过PLLDx位设置,在同一指令中用DIVEN位将分频器使能。
同时使用分频器和乘法器对PLL进行编程有两种方法:
(1)方法一
设置PLL乘法器和分频器的值,并将DIVEN位设置为1使能分频器;
一个CCLK时钟周期之后,通过设置旁路位(PLLBP)为1将PLL设置为旁路模式。在对PMCTL寄存器进行写操作之前将DIVEN位清除;
在旁路状态等待最少4096个周期直到PLL锁定;
通过清除旁路位(PLLBP=0)撤销PLL旁路模式。在对PMCTL寄存器进行写操作之前确保已经清除了DIVEN位。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Address 0x2000,
pmctlsetting= *pPMCTL;
pmctlsetting &= ~(0xFF); //Clear
// CLKIN= 24.576 MHz, Multiplier= 27, Divisor= 2, CCLK_SDCLK_RATIO 2.
// Core clock = (24.576 MHz * 27) /2 = 331.776 MHz
// SDRAM Clock=[(24.576MHz*27)/2]/2=166MHz
//PLL enable
pmctlsetting= SDCKR2|PLLM27|PLLD2|DIVEN;
*pPMCTL= pmctlsetting;
pmctlsetting|= PLLBP;
*pPMCTL= pmctlsetting;
pmctlsetting^=DIVEN; //异或,同则0,非同,则1
//在设置PMCTL寄存器的DIVEN位和将PLL设置为旁路模式之间有一个内核周期的延时
//Wait for around 4096 cycles for the pll to lock.
for (i=0; i<4096; i++)
asm("nop;");
*pPMCTL ^= PLLBP; //Clear Bypass Mode
*pPMCTL |= (CLKOUTEN); //and start clkout
(2)方法二
设置PLL乘法器和分频器的值并将旁路位(PLLBP)设置为1使PLL处于旁路状态;
在旁路状态等待最少4096个周期直到PLL锁定;
通过清除旁路位(PLLBP=0)撤销PLL旁路模式;
等待一个CCLK周期;
通过设置DIVEN位使能分频器。
对PMCTL寄存器编程时需要考虑下面几个问题:
使用乘法器和分频器对PLL编程时,在同一个CCLK周期不要同时对DIVEN和PLLBP位编程。对它们编程时至少间隔一个CCLK周期。
在用户应用程序中,根据下述条件选择PLL乘法器的值:
如果输入分频器未使能(INDIV=0),CLKIN和PLLM的乘积不要超过400MHz;
如果输入分频器使能了(INDIV=1),CLKIN和PLLM的乘积不要超过800MHz.
最大的VCO频率不能超过800MHz.VCO频率按照下面的式子计算:
VCO频率计算:fVCO = 2 * PLLM * fINPUT
CCLK频率计算:fCCLK = (2 * PLLM * fINPUT) / (2 * PLLN)
式中:fVCO=VCO频率,fCCLK =CCLK频率;PLLM=乘法器编程值;PLLN=分频器编程值;fINPUT =PLL输入频率;fINPUT=CLKIN(当禁用输入分频器时),或CLKIN/2(当使能输入分频器时)。
(3)将PLL设置为旁路模式(通过将PLLBP位设置为1)或者取消PLL的旁路模式(清除PLLBP位)过程中在写PMCTL寄存器时要清除DIVEN位。
(4)在PMCTL寄存器中设置CCLK与SDCLK之比时要对DIVEN位置位。
PLL用于产生内核时钟和外设时钟。如果对PLL编程错误,PLL不会锁定在需要的频率上。这会使处理器内核和外设的运行出现异常。