PLL总结——设置时钟频率

PLL设置序列

要使PLL初始化运行,那么必须按步骤完成下面的序列:

 1. 如果PLL已被连接,则用一个馈送序列断开与PLL的连接。

2. 用一个馈送序列禁止PLL。

3. 如果需要,在没有PLL的情况下改变CPU时钟分频器设置来加速操作。

4. 写时钟源选择控制寄存器来改变时钟源。

5. 写PLLCFG并用一个馈送序列使其有效。PLLCFG仅可在PLL被禁止时更新。

6. 用一个馈送序列使能PLL。

7. 改变CPU时钟分频器设置使之与PLL一起操作。在连接PLL之前完成这个操作是很重要的。

8. 通过监控PLLSTAT寄存器的PLOCK位或使用PLOCK中断来等待PLL实现锁定,或当PLL的输入时钟为低(也就是32kHz)时等待一个固定的时间。当PLL参考频率(REFCLK的频率FREF与预分频器值分频所得的PLL输入频率相等)少于100kHz或大于20MHz时,PLOCK的值可能不稳定。在这些情况下,可以假设PLL在启动时间过后稳定下来。当FREF大于400kHz时,这个时间为500μs;当FREF少于400kHz时,这个时间为200/FREF秒。

9. 用一个馈送序列连接PLL。

值得注意的是不要归并(merge)上面的任何一个步骤。例如,不能用相同的馈送序列同时更新PLLCFG和使能PLL。


void ConfigurePLL ( void )
{
uint32 MValue, NValue;


if ( PLLSTAT & (1 << 25) )
    {
PLLCON = 1; /* Enable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
    }


    PLLCON = 0; /* Disable PLL, disconnected */
    PLLFEED = 0xaa;
    PLLFEED = 0x55;


SCS |= 0x20; /* Enable main OSC */
    while( !(SCS & 0x40) ); /* Wait until main OSC is usable */


    CLKSRCSEL = 0x1; /* select main OSC, 12MHz, as the PLL clock source */


    PLLCFG = PLL_MValue | (PLL_NValue << 16);
    PLLFEED = 0xaa;
    PLLFEED = 0x55;


    PLLCON = 1; /* Enable PLL, disconnected */
    PLLFEED = 0xaa;
    PLLFEED = 0x55;


    CCLKCFG = CCLKDivValue; /* Set clock divider */
#if USE_USB
    USBCLKCFG = USBCLKDivValue; /* usbclk = 288 MHz/6 = 48 MHz */
#endif


    while ( ((PLLSTAT & (1 << 26)) == 0) ); /* Check lock bit status */


    MValue = PLLSTAT & 0x00007FFF;
    NValue = (PLLSTAT & 0x00FF0000) >> 16;
    while ((MValue != PLL_MValue) && ( NValue != PLL_NValue) );


    PLLCON = 3; /* enable and connect */
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
while ( ((PLLSTAT & (1 << 25)) == 0) ); /* Check connect bit status */
return;
}

PLL总结——设置时钟频率