Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PWM в LPC2378 работает только под отладчиком
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
richie
Добрый день, Многоуважаемый All!

Пытаюсь на чипе LPC2378 запустить генерацию частоты (меандр, 50%, ~1,2 МГц)
ШИМом на канале 4.

И наблюдаю такую картину:
Под отладчиком частота генерится, все нормально.
Однако, если запускаю программу не в отладчке, то частоты нет...

При этом светодид, кнопки и UART0 обслуживаются.

Дамп регистров PWM:
1. При работе под отладчиком:
PWM1TC=00000001 (счетчик таймера изменяется от 0 до 9, что и нужно)
PWM1TCR=00000009
PWM1MR0=00000009 (период выходной последовательности PWM)
PWM1MR4=00000004 (смещение для нисходящего фронта)
PWM1PCR=00001000
PWM1MCR=00000002
PWM1LER=00000000
PCLKSEL0=AAAA8A2A (тактовая частота для PWM 12МГц, понизил для отладки)

2. Без отладчика:
PWM1TC=AE849F4C (счетчик изменяется циклически во всем диапазоне)
PWM1TCR=00000009
PWM1MR0=00000000 (период выходной последовательности PWM НЕ ЗАДАН)
PWM1MR4=00000000 (смещение для нисходящего фронта НЕ ЗАДАНО)
PWM1PCR=00001000
PWM1MCR=00000002
PWM1LER=00000000
PCLKSEL0=AAAA8A2A

Мысли иссякли и у меня и у электронщика...
В чем разникца исполнения программы под отладчикам и без?
Куда смотреть и что делать?

P.S. ARM только начали изучать.
KRS
Цитата(richie @ Feb 27 2008, 17:42) *
2. Без отладчика:
PWM1TC=AE849F4C (счетчик изменяется циклически во всем диапазоне)
....

А откуда вы знаете что в регистрах, без отладчика?
Макросы случайно никакие не используются при старте отладки?(какая среда, отладчик)
И еще хорошо бы исходник посмотреть
richie
Цитата(KRS @ Feb 27 2008, 17:55) *
А откуда вы знаете что в регистрах, без отладчика?
Макросы случайно никакие не используются при старте отладки?(какая среда, отладчик)
И еще хорошо бы исходник посмотреть


1. Через УАРТ запрашию содержимое регистров.
2. Среда ИАР 4.41A, его отладчик через RDI и MT-Link.
3. Исходники:

Цитата
#define LER0_EN ( 1 << 0 )
#define LER1_EN ( 1 << 1 )
#define LER2_EN ( 1 << 2 )
#define LER3_EN ( 1 << 3 )
#define LER4_EN ( 1 << 4 )
#define LER5_EN ( 1 << 5 )
#define LER6_EN ( 1 << 6 )

#define TCR_CNT_EN 0x00000001
#define TCR_RESET 0x00000002
#define TCR_PWM_EN 0x00000008

#define PWMSEL2 ( 1 << 2 )
#define PWMSEL3 ( 1 << 3 )
#define PWMSEL4 ( 1 << 4 )
#define PWMSEL5 ( 1 << 5 )
#define PWMSEL6 ( 1 << 6 )
#define PWMENA1 ( 1 << 9 )
#define PWMENA2 ( 1 << 10 )
#define PWMENA3 ( 1 << 11 )
#define PWMENA4 ( 1 << 12 )
#define PWMENA5 ( 1 << 13 )
#define PWMENA6 ( 1 << 14 )

static void PWM_Init( void )
{
PWM1PR = 0x00000000;
PWM1TCR = TCR_RESET;
PWM1MCR = 0x00000002;
}

static void PWM_Set( INT32U freq )
{ int i = 3;
INT32U period;

lPWMSET:
i--;
if ( i < 0 ) {
goto lEND;
}
period = BSP_CPU_PclkFreq( PCLK_PWM1 );
period = period / freq;

PWM1MR0 = period;
PWM1MR4 = period / 2;
PWM1LER = LER0_EN | LER4_EN;

for ( period = 0; period <= 1000; period++ ) {}; // DEBUG: wait PWM1MRx apply
if ( PWM1LER != 0 ) {
goto lPWMSET;
}
lEND:;
}

static void PWM_Start( void )
{
PWM1PCR |= PWMENA4;
PWM1TCR = TCR_CNT_EN | TCR_PWM_EN;
}

static void PWM_Stop( void )
{
PWM1PCR &= ~PWMENA4;
PWM1TCR = 0x00;
}

void main (void)
{
CPU_INT08U err;

BSP_IntDisAll(); /* Disable all interrupts until we are ready to accept them */

#if ( PWM_FREQ_OUT == DEF_ENABLED )
PWM_Stop();
PWM_Init();
PWM_Set( 1228800 );
PWM_Start();
#endif //PWM_FREQ_OUT
....


4. Из МАКРОСов только LPC2378_Flash.mac:
Цитата
execUserPreload()
{
__writeMemory32(0x00000001, 0xE01FC040, "Memory"); // MEMMAP = 1;
}
richie
help.gif help.gif help.gif

Други! Ну, направте в нужную сторону мысль!

help.gif help.gif help.gif
DASM
Могу только свой точно работающий код предложить. Писалось наспех, в нарущении всех правил, ну хоть работает и ладно.
Код
    PWMPCR = (1 << 13);// PWM 5 enabled
    PWMPR = 0;// pckl
    PWMPC = 0;// pckl

    PWMMR0 = 0x4000;
    PWMMR5 = 0x3800;

    PWMMCR = (1 << 1); // reset on pwmmr0
    PWMTCR = (1 << 3) | (1 << 0);// PWM and counter enable
    PWMLER = 0xFF;

Ну и PINSEL1 не забыть настроить на работу пина как PWM а не GPIO
Еще раз - не ругайте за дурной код, сам знаю :-)
eu_point
вот только написал... работает на 4-х различных платах

/* ШИМ инициализация */
PINSEL3 = 0x00200000; // 21:20 P1.26 GPIO Port 1.26 PWM1.6 (10)
PWM1PR = 12; // предделитель 1MГц на 12МГц
PWM1PCR = 0x00004000; // разрешить PWM6 в однофронтовом режиме
PWM1MCR = 0x00000002; // сброс при совпадении по 0-му каналу (т.е. период)
PWM1MR0 = 200; // период 200 тактов

vol_pwm = 100;
PWM1MR6 = vol_pwm; // спад на 8й такт

PWM1LER = 0x00000040; // разр. теневой рег. защелку для PWM6
PWM1TCR = 0x00000002; // сброс счетчика и предделителя
PWM1TCR = 0x00000009; // разреш. счетчика и PWM6
KAlex
Цитата(richie @ Feb 27 2008, 18:09) *
period = BSP_CPU_PclkFreq( PCLK_PWM1 );
period = period / freq;
PWM1MR0 = period;
PWM1MR4 = period / 2;

А period через UART посмотреть?
richie
Други, спасибо!

Проблема найдена и решена.
На caxape натолкнули на верное направление.
Есть такой чудесный регистр PINSEL10 в котором есть БИТ-3 (GPIO/TRACE),
состояние которого при старте зависит от внешних условий (состояние ноги RTCK).

Если этот бит не обнулить, то наблюдается описанная проблема с программированием PWMа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.