|
|
  |
Изучение ARM, не моргает светодиод |
|
|
|
Oct 12 2008, 20:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Добрый вечер  Прошу помощи у ARMщиков Скачал с олимекса иаровский проект моргания светодиодом и пробую переделать под свою плату с lpc2468. Всё воскресенье бъюсь но никак заставить его моргать не могу  Даже не знаю в каком направлении копать. Взял пример инициализации МК из проэкта (там настраивается PLL и выводы), настраиаю пин на вывод и дальше в цикле светодиод должен моргать. В симуляторе всё работает, а в железе нет  Ниже привожу код а в аттачменте сам проэкт (IAR 5.20EV). Подскажите чего там не хватает? Код /* ********************************************************* Function declarations ********************************************************* */
/********************************************************** Header files **********************************************************/ #include "LPC23xx.h" #include "target.h" #include "target.c" #include "macroses.h"
// LED1 (MCIPWR on Olimex LPC-2378-STK has an indicator LED)
/********************************************************** MAIN **********************************************************/
int main (void) { // TargetResetInit(); // set io pins for led P0.21 IODIR0 |= 0x00200000; // pin P0.21 is an output, everything else is input after reset IOSET0 = 0x00200000; // led off IOCLR0 = 0x00200000; // led on // endless loop to toggle the red LED P0.21 while (1) {
{ SET_LED(); for(unsigned long i=0; i<2000000; i++); CLR_LED(); for(unsigned long i=0; i<2000000; i++); } } } Код #include "LPC23xx.h" #include "type.h" #include "irq.h" #include "target.h"
/****************************************************************************** ** Function name: TargetInit ** ** Descriptions: Initialize the target board; it is called in a necessary ** place, change it as needed ** ** parameters: None ** Returned value: None ** ******************************************************************************/ void TargetInit(void) { /* Add your codes here */ return; }
/****************************************************************************** ** Function name: GPIOResetInit ** ** Descriptions: Initialize the target board before running the main() ** function; User may change it as needed, but may not ** deleted it. ** ** parameters: None ** Returned value: None ** ******************************************************************************/ // void GPIOResetInit( void ) - mthomas, add static, avoid missing proto warning static void GPIOResetInit( void ) { /* Reset all GPIO pins to default: primary function */ PINSEL0 = 0x00000000; PINSEL1 = 0x00000000; PINSEL2 = 0x00000000; PINSEL3 = 0x00000000; PINSEL4 = 0x00000000; PINSEL5 = 0x00000000; PINSEL6 = 0x00000000; PINSEL7 = 0x00000000; PINSEL8 = 0x00000000; PINSEL9 = 0x00000000; PINSEL10 = 0x00000000; IODIR0 = 0x00000000; IODIR1 = 0x00000000; IOSET0 = 0x00000000; IOSET1 = 0x00000000; FIO0DIR = 0x00000000; FIO1DIR = 0x00000000; FIO2DIR = 0x00000000; FIO3DIR = 0x00000000; FIO4DIR = 0x00000000; FIO0SET = 0x00000000; FIO1SET = 0x00000000; FIO2SET = 0x00000000; FIO3SET = 0x00000000; FIO4SET = 0x00000000; return; }
/****************************************************************************** ** Function name: ConfigurePLL ** ** Descriptions: Configure PLL switching to main OSC instead of IRC ** at power up and wake up from power down. ** This routine is used in TargetResetInit() and those ** examples using power down and wake up such as ** USB suspend to resume, ethernet WOL, and power management ** example ** parameters: None ** Returned value: None ** ******************************************************************************/ void ConfigurePLL ( void ) { DWORD 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; }
/****************************************************************************** ** Function name: TargetResetInit ** ** Descriptions: Initialize the target board before running the main() ** function; User may change it as needed, but may not ** deleted it. ** ** parameters: None ** Returned value: None ** ******************************************************************************/ void TargetResetInit(void) {
// mthomas #if 0 #ifdef __DEBUG_RAM MEMMAP = 0x2; /* remap to internal RAM */ #endif
#ifdef __DEBUG_FLASH MEMMAP = 0x1; /* remap to internal flash */ #endif #endif
#ifdef __DEBUG_RAM MEMMAP = 0x2; /* remap to internal RAM */ #else MEMMAP = 0x1; /* remap to internal flash */ #endif
#if USE_USB PCONP |= 0x80000000; /* Turn On USB PCLK */ #endif /* Configure PLL, switch from IRC to Main OSC */ ConfigurePLL();
/* Set system timers for each component */ #if (Fpclk / (Fcclk / 4)) == 1 PCLKSEL0 = 0x00000000; /* PCLK is 1/4 CCLK */ PCLKSEL1 = 0x00000000; #endif #if (Fpclk / (Fcclk / 4)) == 2 PCLKSEL0 = 0xAAAAAAAA; /* PCLK is 1/2 CCLK */ PCLKSEL1 = 0xAAAAAAAA; #endif #if (Fpclk / (Fcclk / 4)) == 4 PCLKSEL0 = 0x55555555; /* PCLK is the same as CCLK */ PCLKSEL1 = 0x55555555; #endif
/* Set memory accelerater module*/ MAMCR = 0; #if Fcclk < 20000000 MAMTIM = 1; #else #if Fcclk < 40000000 MAMTIM = 2; #else MAMTIM = 3; #endif #endif MAMCR = 2;
GPIOResetInit();
//init_VIC(); //malka proba!!!! return; }
/****************************************************************************** ** End Of File ******************************************************************************/
|
|
|
|
|
Oct 12 2008, 21:12
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(mempfis_ @ Oct 12 2008, 23:23)  Подскажите чего там не хватает? Если у вас нет осциллографа и "не моргает" вы определяете на глаз и на глаз он просто светится, то весьма вероятно, что включеный оптимизатор компилятора выкинул ваши циклы задержки, как не делающие ничего полезного. При этом светодиод мигает, но быстро-быстро. Попробуйте так: Код SET_LED(); for(volatile unsigned long i=0; i<2000000; i++);
CLR_LED(); for(volatile unsigned long i=0; i<2000000; i++);
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 12 2008, 21:35
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(zltigo @ Oct 12 2008, 23:39)  Поскольку для мигания светодиодом достаточно нескольких строчек кода, то для начала выкиньте нафиг всякий хлам из проекта. Точнее возьмите чистый "лист" и начните писать только то, что сами понимаете. Убрал всё лишнее и написал то что понимаю (точнее так как сделал-бы если-бы это был процессор AVR): - настройка всего порта GPIO на выход - сброс/установка порта - в основном цикле с задержкой в ~2000000 тактов включаю/выключаю светодиод Не работает  Пробовал такое писать в Keil (он сам вставляет код startup - настройку PLL) тоже не работает. Расскажите в двух словах что обязательно должно быть перед main? Код #include "LPC23xx.h"
/********************************************************** MAIN **********************************************************/
int main (void) { // set io pins for led P0.21 IODIR0 = 0xffffffff; // pin P0.21 is an output, everything else is input after reset IOSET0 = 0xffffffff; // led off IOCLR0 = 0xffffffff; // led on // endless loop to toggle the red LED P0.21 while (1) {
{ IOSET0 = 0xffffffff; // led off for(unsigned long i=0; i<2000000; i++); IOCLR0 = 0xffffffff; // led on for(unsigned long i=0; i<2000000; i++); } } } Цитата(Сергей Борщ @ Oct 13 2008, 00:12)  Если у вас нет осциллографа и "не моргает" вы определяете на глаз и на глаз он просто светится, то весьма вероятно, что включеный оптимизатор компилятора выкинул ваши циклы задержки, как не делающие ничего полезного. При этом светодиод мигает, но быстро-быстро. Попробуйте так: Код SET_LED(); for(volatile unsigned long i=0; i<2000000; i++);
CLR_LED(); for(volatile unsigned long i=0; i<2000000; i++); Он совсем не светится  У меня есть hex-файл откомпилированного проэкта. И когда я зашиваю его то всё работает как положено. P.S. поробовал сделать так как Вы сказали, тоже не работает.
|
|
|
|
|
Oct 12 2008, 21:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(mempfis_ @ Oct 12 2008, 23:35)  Убрал всё лишнее и написал то что понимаю Посмотрел то, что приложено Вами там больше десятка файлов - не верю  . Начните с одного:
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 13 2008, 05:35
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(zltigo @ Oct 13 2008, 00:42)  Посмотрел то, что приложено Вами там больше десятка файлов - не верю  . Начните с одного: Доброе утро. Вот опять не поверите мне но: -взял Ваш проект -откомпилировал -зашил эффект тот-же  Там всё до ужаса просто. Даже если процессор стартует на какойто дэфолтной частоте то я должен заметить или тусклое свечение или быстрое моргание. Мне кажется процессор просто не работает из-за отсутствия тактовой частоты. Может я не правильно шью ? Использую Флэш-мажик. Или необходимы какие-то дополнительные настройки? P.S. Не бросайте меня одного с этой бедой!!!!!! Пройду этап запуска процессора а дальше сам смогу разобраться !!!!!
|
|
|
|
|
Oct 13 2008, 09:05
|
Участник

Группа: Новичок
Сообщений: 54
Регистрация: 12-10-08
Пользователь №: 40 892

|
А вы пример из примеров KEIL возьмите - они моргают точно !
Да и в симуляторе KEIL можно посмотреть
|
|
|
|
|
Oct 13 2008, 10:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(uriy @ Oct 13 2008, 12:59)  Вы же сами писали: "У меня есть hex-файл откомпилированного проэкта. И когда я зашиваю его то всё работает как положено." Значит с тактовой частотой все нормально. Кроме этого раз вы зашиваете с помощью флеш-мэджик это еще раз подтверждает что с тактовой все нормально. Это откомпилированный hex-файл который шёл вместе с примером, а не тот, который получается при компиляции моего проекта. Т.е. Вы хотите сказать что если микросхема читается и программируется программатором то всётаки генерация частоты в ней есть? В чём тогда может быть ошибка?  Порты GPIO я настроил, разобрался как установить-сбросить их, код программы простейший, в симуляторе всё работает. Может быть настройки компилятора? Цитата(garbuz @ Oct 13 2008, 13:05)  А вы пример из примеров KEIL возьмите - они моргают точно !
Да и в симуляторе KEIL можно посмотреть Keil у меня старой версии расчитанный на LPC21xx и я не знаю каким образом прикрутить его к моему LPC2468, но примеры оттуда в симуляторе работают. Буду искать в настройках компилятора (IAR). Жаль нигде нет подробного описания настроек IARa для совсем чайников в ARM.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|