реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> прерывания в IAR для LPC21x8
slava2148
сообщение Dec 11 2007, 14:09
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 11-12-07
Пользователь №: 33 185



Помогите, пожалуйста понять почему у меня не работают прерывания? Уже всё перечитал и перепробовал - не работает!!! Вот обработчик:
Код
#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

Сообщение отредактировал IgorKossak - Dec 12 2007, 14:23
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 11 2007, 15:16
Сообщение #2


Гуру
******

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



Moderator:
Настоятельно не рекомедуется постить обширные неформатированные и нечитабельные исходники. Как минимум пользуйтесь соответствущими тэгами.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
slava2148
сообщение Dec 12 2007, 08:23
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 11-12-07
Пользователь №: 33 185



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


Прошу прощения у многоуважаемого Moderator'a, это видимо Explorer съел форматирование, а без достаточного количества текста, мне покзалось, невозможно понять что к чему. Но надеюсь, что это не причина, чтобы не отвечать.
Go to the top of the page
 
+Quote Post
slava2148
сообщение Dec 13 2007, 08:22
Сообщение #4





Группа: Новичок
Сообщений: 7
Регистрация: 11-12-07
Пользователь №: 33 185



Спасибо профессионалам и форуму. Разобрался сам, наощупь. Неделю угробил. Если кому интересно, то чтобы работали прерывания, не ставьте Hardware reset в опциях проекта в настройке J-Link. Не знаю почему. Также излишне писать MEMMAP=2, т.к. это приводит к тому, что половина векторов прерываний (точнее адресного пространства) отображаются в ОЗУ и никто их там не прописывает.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 13 2007, 12:09
Сообщение #5


Гуру
******

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



Цитата(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.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016