Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сонфигурация PLL в LPC23xx
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
KeMikadze
Здравствуйте! Работаю с ARM7 LPC2368. Пытаюсь сконфигурировать его на работу с внешним осцилятором и использовать PLL. В качестве источников тактирования пробовал подключать и кварцевые резанаторы, и генераторы на разные частоты, но все тщетно. PLL ни в какую не хочет работать с источниками внешнего тактирования подключенными к выводам XTAL.
Смог разве что подключить PLL к часовому кварцу на 32кГц подключенному к RTCX выводам.
Пробовал уже и проц перепаивать, но все то же самое.
Пробовал конфигурировать PLL через Wizard но проц зависает не дойдя до main-а. Пробовал конфигурировать непосредственно в Си коде:
Код
//1.Disconnect the PLL with one feed sequence if PLL is already connected.
    PLLCON    &= ~0x02;                                        
    
    PLLFEED    = 0xAA;        //Write the feed sequence
    PLLFEED    = 0x55;    

    //2.Disable the PLL with one feed sequence.
    PLLCON    &= ~0x01;
                                
    PLLFEED    = 0xAA;        //Write the feed sequence
    PLLFEED    = 0x55;
                                        
    //3.Change the CPU Clock Divider setting to speed up operation without the PLL, if
    //desired.    

    /*...*/

    //4.Write to the Clock Source Selection Control register to change the clock source.
    CLKSRCSEL = 0x01;     //Selects the main oscillator as the PLL clock source.
    SCS    &= ~0x00000010;    //The frequency range of the main oscillator is 1MHz to 20MHz.
    
    SCS    |=    0x00000020;    //The main oscillator is enabled
       
    while (OSCSTAT)     //Wait for it to settle
    { }

    //5.Write to the PLLCFG and make it effective with one feed sequence. The PLLCFG can
    //only be updated when the PLL is disabled.
            
    PLLCFG  = 0x00000006; //Set the PLL M and N constants

    PLLFEED    = 0xAA;          //Write the feed sequence
    PLLFEED    = 0x55;

    //6.Enable the PLL with one feed sequence.
    PLLCON |= 0x01;

    PLLFEED    = 0xAA;          //Write the feed sequence
    PLLFEED    = 0x55;


    //7.Change the CPU Clock Divider setting for the operation with the PLL. It's critical to do
    //this before connecting the PLL.
    CCLKCFG            = 0x00000003;


    
    //8.Wait for the PLL to achieve lock by monitoring the PLOCK bit in the PLLSTAT register

    while (!(PLLSTAT & 0x04000000))         //Wait for it to settle
    { }

    //9.Connect the PLL with one feed sequence.
    PLLCON |= 0x02;                            
    PLLFEED    = 0xAA;          //Write the feed sequence
    PLLFEED    = 0x55;

Старался все делать по шагам User Manual-а но проц виснет где-то в этом коде. То ли при подключении в качестве источника тактирования Main Oscilator-а, то ли при подключении PLL... Дело в том что в отладке я не могу отднозначно этого определить так как отладчик отваливается в разных местах.
Пробовал запускать данный код без подключенного отладчика, но процессор снова зависал да так что оживлялся только пересбросом питания, даже на внешний RESET не реагировал.
Пользуюсь отладчиком J-Link (JTAG Speed - Adaptive Clocking).
Подскажите где мне искать ошибку?
Либо возможно у кого-то есть точно рабочий код инициализации PLL для LPC23xx?
M_Andrey
Вот код из примеров IAR 5.50:

CODE

/*************************************************************************
* Function Name: InitClock
* Parameters: void
* Return: void
*
* Description: Initialize PLL and clocks' dividers. Hclk - 288MHz,
* Usbclk - 48MHz
*
*************************************************************************/
void InitClock(void)
{
// 1. Init OSC
SCS_bit.OSCRANGE = 0;
SCS_bit.OSCEN = 1;
// 2. Wait for OSC ready
while(!SCS_bit.OSCSTAT);
// 3. Disconnect PLL
PLLCON_bit.PLLC = 0;
PLLFEED = 0xAA;
PLLFEED = 0x55;
// 4. Disable PLL
PLLCON_bit.PLLE = 0;
PLLFEED = 0xAA;
PLLFEED = 0x55;
// 5. Select source clock for PLL
CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source.
// 6. Set PLL settings 288 MHz
PLLCFG_bit.MSEL = 24-1;
PLLCFG_bit.NSEL = 2-1;
PLLFEED = 0xAA;
PLLFEED = 0x55;
// 7. Enable PLL
PLLCON_bit.PLLE = 1;
PLLFEED = 0xAA;
PLLFEED = 0x55;
// 8. Wait for the PLL to achieve lock
while(!PLLSTAT_bit.PLOCK);
// 9. Set clk divider settings
CCLKCFG = 4-1; // 1/6 Fpll - 72 MHz
USBCLKCFG = 6-1; // 1/6 Fpll - 48 MHz
PCLKSEL0 = PCLKSEL1 = 0; // other peripherals
// 10. Connect the PLL
PLLCON_bit.PLLC = 1;
PLLFEED = 0xAA;
PLLFEED = 0x55;
}



Но меня он то-же не всегда спасает. В основном все работает, но если выключить питание на короткое время, то может просто не запуститься и ресет не спасает, приходится ждать сек 30 - потом запускается нормально. Пробовал этот, но результат тот-же.

CODE


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

PLLCON = 0; /* Disable PLL (PLLE=0, PLLC=0), disconnected */
PLLFEED = 0xAA;
PLLFEED = 0x55;

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

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

PLLCFG_bit.MSEL = PLL_MValue;
PLLCFG_bit.NSEL = PLL_NValue;
PLLFEED = 0xAA;
PLLFEED = 0x55;

PLLCON = 1; /* Enable PLL (PLLE=1), disconnected */
PLLFEED = 0xAA;
PLLFEED = 0x55;

CCLKCFG = 4-1; // 1/4 Fpll - 72 MHz
USBCLKCFG = 6-1; // 1/6 Fpll - 48 MHz
PCLKSEL0 = PCLKSEL1 = 0; // other peripherals

while ( ((PLLSTAT & (1 << 26)) == 0) ); /* Check lock bit status (PLOCK==0)*/
while ( (PLLSTAT_bit.MSEL != PLL_MValue) && ( PLLSTAT_bit.NSEL != PLL_NValue) );

PLLCON = 3; /* enable and connect (PLLE=1, PLLC=1)*/
PLLFEED = 0xAA;
PLLFEED = 0x55;
while ( ((PLLSTAT & (1 << 25)) == 0) ); /* Check connect bit status */




KeMikadze
Цитата(M_Andrey @ May 2 2011, 17:35) *
Но меня он то-же не всегда спасает. В основном все работает, но если выключить питание на короткое время, то может просто не запуститься и ресет не спасает, приходится ждать сек 30 - потом запускается нормально. Пробовал этот, но результат тот-же.

За код спасибо, но чего-то я начинаю подозревать что не в коде у меня дело так как с теме же настройками но часовому кварцу я подключаюсь нормально. Вот только не пойму где искать. Да и в кварцах вроде ломаться нечему...
M_Andrey
Хочу поиграться с кондерами согласно этих табличек, но руки пока не доходят.

Нажмите для просмотра прикрепленного файла
KeMikadze
Цитата(M_Andrey @ May 2 2011, 20:34) *
Хочу поиграться с кондерами согласно этих табличек, но руки пока не доходят.

Нажмите для просмотра прикрепленного файла

Ну не думаю что это эффект даст. У меня там сейчас кварц стоит на 12МГц и два кондера на 22 пика. Но до этого я пробовал ставить разные генераторы которым, как известно, кондеры и не нужны вовсе, но эффекта это тоже не дало.
Вы кстати тоже лучше попробуйте вместо кварца генератор поставить. В прошлых разработках у нас тоже были проблемы со стабильностью работы от кварца, генератор хоть и стоит дороже, но работает намного устойчивее.
KeMikadze
В общем сегодня после бокала темного пива понял я в чем причина такого поведения моего процессора.
В коде у меня все нормально, проблема была в кварце, а вернее в дорожках между кварцем и процессором. Дело в том что я использовал переходную плату для данного стоногово зверя. А так как кварц у меня запаян не на ноги процессора а на ноги платы то там получается расстояние около сантиметра, чего было достаточно для создания длинной линии при кварце 12МГц. А ввиду низкой частоты, уменьшающей эффект длинной линии, пусть не всегда стабильно но работал часовой кварц в качестве источника тактирования. Но опять же при больших значениях множителя умножалась и ошибка вызванная помехой, из-за чего собственно при увеличении множителя данный кварц "отваливался". В общем буду думать как передвинуть кварц ближе к ногам.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.