Цитата(yurmala @ Mar 4 2011, 10:32)

Приветствую!
Беру любой мелкий рабочий проект из примеров Keil для LPC23XX/LPC24XX где в коде идет конфигурация PLL.
Проекты рабочие - проверял заливая их на отладочные платы Olimex 2378/Olimex 2478. светодиоды мигают, все работает...
Есть JTAG адаптер MT-LINK.
Он настроен в Keil как J-link. В опциях установлен режим сброса "Hardware, halt after reset (normal)".
Если запускаю пошаговую отладку, то проект зависает в функции инициализации PLL.
Вот функция:
Код
void InitPLL(void)
{
unsigned int MValue;
unsigned int NValue;
#define PLL_MVALUE 11 // (12-1)
#define PLL_NVALUE 0 // (1-1)
#define CCLK_DIV_VALUE 4
if(rPLLSTAT & (1 << 25)) // Если PLL подключен, отключаем его
{
rPLLCON = 1; // PLLE(bit 0)= 1, PLLC(bit1) = 0 // Enable PLL, disconnected
rPLLFEED = 0xaa; rPLLFEED = 0x55; // Применение настроек регистров
}
rPLLCON = 0; // Отключаем и запрещаем PLL
rPLLFEED = 0xaa; rPLLFEED = 0x55; // Применение настроек регистров
rSCS |= (1 << 5); // Активация main OSC
while( !(rSCS & 0x40) ); // Wait until main OSC is usable
rCLKSRCSEL = 0x01; // Выбор главного кварца - 12Мгц в качестве источника для PLL
rPLLCFG = PLL_MVALUE | (PLL_NVALUE << 16); // Конфигурация кварца
rPLLFEED = 0xAA; rPLLFEED = 0x55; // Применение изменений
rPLLCON = 1; // Отключаем но разрешаем PLL
rPLLFEED = 0xaa; rPLLFEED = 0x55; // Применение настроек регистров
rCCLKCFG = CCLK_DIV_VALUE; // Set clock divider
while ( ((rPLLSTAT & (1 << 26)) == 0) ); // Check lock bit status
MValue = rPLLSTAT & 0x00007FFF;
NValue = (rPLLSTAT & 0x00FF0000) >> 16;
while((MValue != PLL_MVALUE) && ( NValue != PLL_NVALUE));
rPLLCON = 3; // Enable PLL and connect
rPLLFEED = 0xAA; rPLLFEED = 0x55; // Применение изменений
while(((rPLLSTAT & (1<<25)) == 0)) {;} // Check connect bit status
return;
}
При пошаговом хождении по функции вижу (в окне с данными PLL) что команды PLLFEED не имеют эффекта (в регистре PLLSTAT остается 0 и выходные частоты не меняются)
И в конечном итоге отладка зависает на цикле
Код
while ( ((rPLLSTAT & (1 << 26)) == 0) ); // Check lock bit status
Может как-то нужно хитро настроить JTAG?
добавлю, что в остальном работа с MT-LINK идет без проблем - отлаживал таймеры, GPIO. Заливал HEX-файлы на демо-платы...
точно такая же ерунда
Код
void ConfigurePLL ( void )
{
unsigned int 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;
}
только при этом ничего не работает, хочу просто посмотерть работоспособность простой программки
FIO0DIR0 |= 0x01; // P0[0] - output
FIO0PIN0 &= ~0x01; //output 0
на своем макете, в итоге на ножке постоянно третье состояние, хотя с ресетом все в порядке
Сообщение отредактировал addi - Oct 21 2011, 18:52