Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прерывания в IAR для LPC21x8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
slava2148
Помогите, пожалуйста понять почему у меня не работают прерывания? Уже всё перечитал и перепробовал - не работает!!! Вот обработчик:
Код
#pragma vector=0x18
__irq __arm void IRQ_ISR_Handler (void)
{
    void (*interrupt_function)();
    unsigned int vector;

    vector = VICVectAddr;     // Get interrupt vector.
    interrupt_function = (void(*)())vector;
    (*interrupt_function)();  // Call vectored interrupt function.
}
вот майн:
int main()
{
    MEMMAP = 2;       // Must set this way when executing code out of RAM
    FrecInit();
    VIC_Init();
    __enable_interrupt();
    LedInit();
    T0_Init();                                     // 10 msec tick
    //PWM_Init();
    while(1)
    {
        if (f_10ms)                                // every 10 mseconds
        {
            f_10ms = 0;                            // reset flag
        }
    }
}
... и инициализация таймера
void T0_Isr(void)                         // Timer 0 ISR every 10 msec
{
    int IntStatus;
//    IntStatus = TIMER_CheckIntType(TIMER0);
//    TIMER_ClearInt(TIMER0, IntStatus);
//    if(cnt&1)
//        IO0CLR_bit.P0_23 = 1;
//    else
        IO0SET_bit.P0_23 = 1;
//    f_10ms = 1;                                 // toggles every 10 mseconds
//    if (++cnt > 20)
//    {
//        f_200ms = 1;                            // toggles every 200 mseconds
//        LedOn();
//    }
//    if (++cnt > 50)
//    {
//        cnt = 0;
//      LedOff();
//    }
    T0IR = 0xFF;                                // reset interrupt flag
    VICVectAddr = 0;                            // reset VIC
}
//------------------------------------------------------------------------------
void T0_Init(void)
{
    VICIntSelect &= ~(1<<VIC_TIMER0);            // Timer 0 intrpt is an IRQ (VIC_TIMER0 = 4)
    VICVectAddr0 = (unsigned int)&T0_Isr;        // Install ISR in VIC addr slot 0
    VICVectCntl0 = 0x20 | VIC_TIMER0;            // IRQ type, TIMER 0 int enabled
    VICIntEnable |= (1<<VIC_TIMER0);             // Turn on Timer0 Interrupt

    T0IR=0xFF;                                  // reset match and capture event interrupts
    T0MR2 = 0;                                    // match on the next positive edge of PCLK
    T0MR3 = 1;                                    //
    T0MCR_bit.MR3RES=1;                            // reset timer
    T0EMR_bit.EM2   =1;                            // MAT1.2 is on
    T0EMR_bit.EM3   =1;                            // MAT1.3 is on
    T0EMR_bit.EMC2  =1;                            // output set to low
    T0EMR_bit.EMC3  =2;                            // output set to high
    T0PR  = 0;                                    // prescale counter = 0 ms
    T0TC  = 0;                                  // reset Timer counter
    PINSEL1_bit.P0_28=3;                        // connect MAT1.2 to pin 19
    PINSEL1_bit.P0_29=3;                        // connect MAT1.3 to pin 20
    T0TCR = 1;                                  // enable Timer

    unsigned int pclk=GetPclk();
    T0TCR = 0;                                  // disable Timer
    PINSEL1_bit.P0_23=0;
    IO0DIR_bit.P0_23 = 1;
    IO0CLR_bit.P0_23 = 1;

    T0MCR_bit.MR3RES=1;                            // reset timer
    T0MCR_bit.MR3INT=1;                            // call interrupt
    T0EMR_bit.EMC2  =3;                            // toggle output
    T0EMR_bit.EMC3  =3;                            // toggle output
    T0MR2 = pclk/100;                            // = 10 msec
    T0MR3 = pclk/100;                            // = 10 msec
prescale counter = 1 ms
    T0TC  = 0;                                  // reset Timer counter
    T0TCR = 1;                                  // enable Timer
}

в обработчике таймера уже всё убрал, оставил только дёрганье ногой чтоб узнать сработало ли прерывание.
Заранее благодарен
Поправил, IgorKossak
zltigo
Moderator:
Настоятельно не рекомедуется постить обширные неформатированные и нечитабельные исходники. Как минимум пользуйтесь соответствущими тэгами.
slava2148
Цитата(zltigo @ Dec 11 2007, 18:16) *
Moderator:
Настоятельно не рекомедуется постить обширные неформатированные и нечитабельные исходники. Как минимум пользуйтесь соответствущими тэгами.


Прошу прощения у многоуважаемого Moderator'a, это видимо Explorer съел форматирование, а без достаточного количества текста, мне покзалось, невозможно понять что к чему. Но надеюсь, что это не причина, чтобы не отвечать.
slava2148
Спасибо профессионалам и форуму. Разобрался сам, наощупь. Неделю угробил. Если кому интересно, то чтобы работали прерывания, не ставьте Hardware reset в опциях проекта в настройке J-Link. Не знаю почему. Также излишне писать MEMMAP=2, т.к. это приводит к тому, что половина векторов прерываний (точнее адресного пространства) отображаются в ОЗУ и никто их там не прописывает.
Сергей Борщ
Цитата(slava2148 @ Dec 13 2007, 10:22) *
Если кому интересно, то чтобы работали прерывания, не ставьте Hardware reset в опциях проекта в настройке J-Link.
Не угадали. Hardware reset выполняется один раз при запуске сеанса отладки, перед загрузкой программы. При нажатии на иконку ресета в отладчике выполняется программный сброс ядра, но не периферии. Если хотите сбросить периферию (в том числе и контроллер прерываний) - напишите макрос execUserReset(). Если на момент сброса выполнялось прерывание и VIC не получил сигнал окончания обработки (VICVectAddr = 0) - дальнейшие прерывания с таким и более низким приоритетом будут заблокированы. Для их разблокировки надо выполлнить запись VICVectAddr из execUserReset()
Цитата(slava2148 @ Dec 13 2007, 10:22) *
Не знаю почему. Также излишне писать MEMMAP=2, т.к. это приводит к тому, что половина векторов прерываний (точнее адресного пространства) отображаются в ОЗУ и никто их там не прописывает.
Удивительно было бы ожидать чего-то другого от MEMMAP = 2.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.