Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Изучение ARM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
mempfis_
Добрый вечерsmile.gif
Прошу помощи у ARMщиков
Скачал с олимекса иаровский проект моргания светодиодом и пробую переделать под свою плату с lpc2468. Всё воскресенье бъюсь но никак заставить его моргать не могу sad.gif
Даже не знаю в каком направлении копать. Взял пример инициализации МК из проэкта (там настраивается PLL и выводы), настраиаю пин на вывод и дальше в цикле светодиод должен моргать. В симуляторе всё работает, а в железе нетsad.gif
Ниже привожу код а в аттачменте сам проэкт (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
******************************************************************************/
zltigo
Поскольку для мигания светодиодом достаточно нескольких строчек кода, то для начала выкиньте нафиг всякий хлам из проекта. Точнее возьмите чистый "лист" и начните писать только то, что сами понимаете.
Сергей Борщ
Цитата(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++);
mempfis_
Цитата(zltigo @ Oct 12 2008, 23:39) *
Поскольку для мигания светодиодом достаточно нескольких строчек кода, то для начала выкиньте нафиг всякий хлам из проекта. Точнее возьмите чистый "лист" и начните писать только то, что сами понимаете.


Убрал всё лишнее и написал то что понимаю
(точнее так как сделал-бы если-бы это был процессор AVR):
- настройка всего порта GPIO на выход
- сброс/установка порта
- в основном цикле с задержкой в ~2000000 тактов включаю/выключаю светодиод

Не работает sad.gif

Пробовал такое писать в 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++);


Он совсем не светитсяsad.gif
У меня есть hex-файл откомпилированного проэкта.
И когда я зашиваю его то всё работает как положено.

P.S. поробовал сделать так как Вы сказали, тоже не работает.
zltigo
Цитата(mempfis_ @ Oct 12 2008, 23:35) *
Убрал всё лишнее и написал то что понимаю

Посмотрел то, что приложено Вами там больше десятка файлов - не верю sad.gif.
Начните с одного:
mempfis_
Цитата(zltigo @ Oct 13 2008, 00:42) *
Посмотрел то, что приложено Вами там больше десятка файлов - не верю sad.gif.
Начните с одного:


Доброе утро.
Вот опять не поверите мне но:
-взял Ваш проект
-откомпилировал
-зашил
эффект тот-же sad.gif
Там всё до ужаса просто. Даже если процессор стартует на какойто дэфолтной частоте то я должен заметить или тусклое свечение или быстрое моргание. Мне кажется процессор просто не работает из-за отсутствия тактовой частоты.

Может я не правильно шью ? Использую Флэш-мажик.
Или необходимы какие-то дополнительные настройки?

P.S. Не бросайте меня одного с этой бедой!!!!!!
Пройду этап запуска процессора а дальше сам смогу разобраться !!!!!
uriy
Цитата
Мне кажется процессор просто не работает из-за отсутствия тактовой частоты.
Вы же сами писали: "У меня есть hex-файл откомпилированного проэкта.
И когда я зашиваю его то всё работает как положено." Значит с тактовой частотой все нормально. Кроме этого раз вы зашиваете с помощью флеш-мэджик это еще раз подтверждает что с тактовой все нормально.
garbuz
А вы пример из примеров KEIL возьмите - они моргают точно !

Да и в симуляторе KEIL можно посмотреть
mempfis_
Цитата(uriy @ Oct 13 2008, 12:59) *
Вы же сами писали: "У меня есть hex-файл откомпилированного проэкта.
И когда я зашиваю его то всё работает как положено." Значит с тактовой частотой все нормально. Кроме этого раз вы зашиваете с помощью флеш-мэджик это еще раз подтверждает что с тактовой все нормально.


Это откомпилированный hex-файл который шёл вместе с примером, а не тот, который получается при компиляции моего проекта. Т.е. Вы хотите сказать что если микросхема читается и программируется программатором то всётаки генерация частоты в ней есть? В чём тогда может быть ошибка? 07.gif Порты GPIO я настроил, разобрался как установить-сбросить их, код программы простейший, в симуляторе всё работает. Может быть настройки компилятора?


Цитата(garbuz @ Oct 13 2008, 13:05) *
А вы пример из примеров KEIL возьмите - они моргают точно !

Да и в симуляторе KEIL можно посмотреть


Keil у меня старой версии расчитанный на LPC21xx и я не знаю каким образом прикрутить его к моему LPC2468, но примеры оттуда в симуляторе работают. Буду искать в настройках компилятора (IAR). Жаль нигде нет подробного описания настроек IARa для совсем чайников в ARM.
uriy
C LPC я тоже начинающий. Тоже решил попробовать поморгать светодиодом. Не работает! Плата точно рабочая. Будем разбираться.
Цитата
Т.е. Вы хотите сказать что если микросхема читается и программируется программатором то всётаки генерация частоты в ней есть?
Ну да, разве нет.
uriy
Вобщем у меня заработало. Видимо какие-то проблемы с PLL. Скорее всего эти проблемы вызваны не достаточным знанием матчасти. Проект делал в Keil. В Configuration wizard для стартап файла убрал галочку PLL Setup. В моем понимании это означает что PLL отключен и проц тактируется сразу от кварца. Пробовал ставить коэффициенты MSEL и PSEL по единице вроде результат должен был получится тот же самый, но нет не получилось.
Почитал User Manual и нашел свою ошибку "FCCO is in the range of 275 MHz to 550 MHz" (У меня контроллер LPC2378). Где FCCO частота PLL а я пытался сделать ее равной 12 МГц. mempfis_ и вам советую внимательно перечитать manual.
mempfis_
Цитата(uriy @ Oct 14 2008, 08:05) *
Вобщем у меня заработало. Видимо какие-то проблемы с PLL. Скорее всего эти проблемы вызваны не достаточным знанием матчасти. Проект делал в Keil. В Configuration wizard для стартап файла убрал галочку PLL Setup. В моем понимании это означает что PLL отключен и проц тактируется сразу от кварца. Пробовал ставить коэффициенты MSEL и PSEL по единице вроде результат должен был получится тот же самый, но нет не получилось.
Почитал User Manual и нашел свою ошибку "FCCO is in the range of 275 MHz to 550 MHz" (У меня контроллер LPC2378). Где FCCO частота PLL а я пытался сделать ее равной 12 МГц. mempfis_ и вам советую внимательно перечитать manual.


a14.gif
Спасибо!!!!
И у меня тоже заработало!!!!
Есть лучик света в конце тунелля smile.gif
Почитаю матчасть и попробую разобраться с настройкой PLL smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.