KeMikadze 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба Здравствуйте! Работаю с 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 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба Вот код из примеров IAR 5.50: /************************************************************************* * 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 - потом запускается нормально. Пробовал этот, но результат тот-же. 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 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба Но меня он то-же не всегда спасает. В основном все работает, но если выключить питание на короткое время, то может просто не запуститься и ресет не спасает, приходится ждать сек 30 - потом запускается нормально. Пробовал этот, но результат тот-же. За код спасибо, но чего-то я начинаю подозревать что не в коде у меня дело так как с теме же настройками но часовому кварцу я подключаюсь нормально. Вот только не пойму где искать. Да и в кварцах вроде ломаться нечему... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба Хочу поиграться с кондерами согласно этих табличек, но руки пока не доходят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KeMikadze 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба Хочу поиграться с кондерами согласно этих табличек, но руки пока не доходят. Ну не думаю что это эффект даст. У меня там сейчас кварц стоит на 12МГц и два кондера на 22 пика. Но до этого я пробовал ставить разные генераторы которым, как известно, кондеры и не нужны вовсе, но эффекта это тоже не дало. Вы кстати тоже лучше попробуйте вместо кварца генератор поставить. В прошлых разработках у нас тоже были проблемы со стабильностью работы от кварца, генератор хоть и стоит дороже, но работает намного устойчивее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KeMikadze 0 3 мая, 2011 Опубликовано 3 мая, 2011 · Жалоба В общем сегодня после бокала темного пива понял я в чем причина такого поведения моего процессора. В коде у меня все нормально, проблема была в кварце, а вернее в дорожках между кварцем и процессором. Дело в том что я использовал переходную плату для данного стоногово зверя. А так как кварц у меня запаян не на ноги процессора а на ноги платы то там получается расстояние около сантиметра, чего было достаточно для создания длинной линии при кварце 12МГц. А ввиду низкой частоты, уменьшающей эффект длинной линии, пусть не всегда стабильно но работал часовой кварц в качестве источника тактирования. Но опять же при больших значениях множителя умножалась и ошибка вызванная помехой, из-за чего собственно при увеличении множителя данный кварц "отваливался". В общем буду думать как передвинуть кварц ближе к ногам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться