В документации описан алгоритм. Написал программу инициализации согласно этому алгоритму,
но PLL не запускается.
Опытным путём выяснил что зависает вот на этой строчке:
Код
//ждём пока PLL не захватит частоту
while ( ! (PLLSTAT & (1 << PLOCK)) ); /* Check lock bit status */
while ( ! (PLLSTAT & (1 << PLOCK)) ); /* Check lock bit status */
Частота кварца 12 МГц, M и N расчитаны по примеру из документации.
Посмотрите пожалуйста на мой код инициализации

P.S. поиск по сайту ничего не дал, в yandex тоже, в апноутах на сайте NXP пока не нашёл примера инициализации PLL, в эррата на LPC2468 есть допуски на частоту Fcco=290 но M и N подобраны так чтобы попадать в диапазон 275-290МГц
Код
#include <LPC21xx.H>
//PLLCFG
//31:24 unused
//23:16 NSEL
//15 unused
//14:0 MSEL
//PLLSTAT
#define PLLC 25
#define PLOCK 26
#define SCS (*((volatile unsigned long *) 0xE01FC1A0))
#define OSCEN 5
#define OSCSTAT 6
#define CLKSRCSEL (*((volatile unsigned long *) 0xE01FC10C))
#define CCLKCFG (*((volatile unsigned long *) 0xE01FC104))
#define PLL_MValue 12
#define PLL_NValue 1
#define CCLKDivValue 0
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void ConfigurePLL ( void )
{
int i;
//если PLL подсоединена то отсоединяем её
if ( PLLSTAT & (1 << PLLC) )
{
PLLCON = 1; /* Enable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
//отключаем PLL
PLLCON = 0; /* Disable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
//включаем основной осцилятор
SCS |= (1<<OSCEN); /* Enable main OSC */
while( !(SCS & (1<<OSCSTAT)) ); /* Wait until main OSC is usable */
//выбираем основной осцилятор как источник тактового сигнала для PLL
CLKSRCSEL = 0x01; /* select main OSC, 12MHz, as the PLL clock source */
//заносим М и N в регистр
PLLCFG = (PLL_MValue-1) | ((PLL_NValue-1) << 16);//M=12, N=1
PLLFEED = 0xaa;
PLLFEED = 0x55;
//включаем PLL
PLLCON = 1; /* Enable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
//устанавливаем коэф деления для тактирования процессора
CCLKCFG = CCLKDivValue; /* Set clock divider */ //CCLKDivValue=0
//ждём пока PLL не захватит частоту
for(i = 100000; i; i--);
// while ( ! (PLLSTAT & (1 << PLOCK)) ); /* Check lock bit status */
//включаем и подсоединяем PLL
PLLCON = 3; /* enable and connect */
PLLFEED = 0xaa;
PLLFEED = 0x55;
//ждём пока PLL не подключится
for(i = 100000; i; i--);
// while ( ((PLLSTAT & (1 << PLLC)) == 0) );
}
//PLLCFG
//31:24 unused
//23:16 NSEL
//15 unused
//14:0 MSEL
//PLLSTAT
#define PLLC 25
#define PLOCK 26
#define SCS (*((volatile unsigned long *) 0xE01FC1A0))
#define OSCEN 5
#define OSCSTAT 6
#define CLKSRCSEL (*((volatile unsigned long *) 0xE01FC10C))
#define CCLKCFG (*((volatile unsigned long *) 0xE01FC104))
#define PLL_MValue 12
#define PLL_NValue 1
#define CCLKDivValue 0
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void ConfigurePLL ( void )
{
int i;
//если PLL подсоединена то отсоединяем её
if ( PLLSTAT & (1 << PLLC) )
{
PLLCON = 1; /* Enable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
//отключаем PLL
PLLCON = 0; /* Disable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
//включаем основной осцилятор
SCS |= (1<<OSCEN); /* Enable main OSC */
while( !(SCS & (1<<OSCSTAT)) ); /* Wait until main OSC is usable */
//выбираем основной осцилятор как источник тактового сигнала для PLL
CLKSRCSEL = 0x01; /* select main OSC, 12MHz, as the PLL clock source */
//заносим М и N в регистр
PLLCFG = (PLL_MValue-1) | ((PLL_NValue-1) << 16);//M=12, N=1
PLLFEED = 0xaa;
PLLFEED = 0x55;
//включаем PLL
PLLCON = 1; /* Enable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
//устанавливаем коэф деления для тактирования процессора
CCLKCFG = CCLKDivValue; /* Set clock divider */ //CCLKDivValue=0
//ждём пока PLL не захватит частоту
for(i = 100000; i; i--);
// while ( ! (PLLSTAT & (1 << PLOCK)) ); /* Check lock bit status */
//включаем и подсоединяем PLL
PLLCON = 3; /* enable and connect */
PLLFEED = 0xaa;
PLLFEED = 0x55;
//ждём пока PLL не подключится
for(i = 100000; i; i--);
// while ( ((PLLSTAT & (1 << PLLC)) == 0) );
}