Перейти к содержанию
    

Работа с таймером в ниос

Коллеги, почему то не выходит ниос из прерывания от таймера. Контроллер прерываний встроенный.

Обработчик:

void Timer0_isr()
    {
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
    flag_isr_tmr = 1;
    }

Ставлю здесь точку остановки , программа в main() больше не возвращается.

Ведь командой

IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);

я должен снять запрос прерывания.

Собственно зависание происходит в библиотечной функции alt_irq_handler. Я так понял что не сбрасывается запрос.

........................
    active = alt_irq_pending ();
    
  } while (active);

 

active всегда не равен нулю. Что ещё глянуть?

post-18832-1535373225_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 2008 году работал с Nios-2. Там правда был не таймер, а кнопки, на которые были поставлены прерывания.

Обработчик кнопок был такой:

 

#ifndef MY_INTERRUPT_H_

#define MY_INTERRUPT_H_

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//---- my_interrupts.h -------------------------

//----------------------------------------------

static void handle_button_interrupts(void* context, alt_u32 id)

{volatile int* edge_capture_ptr = (volatile int*) context; //cast the context pointer to an integer pointer

*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);//Read the EDGE_CAP reg. button PIO & Store value.

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0x0);

}

#endif /*MY_INTERRUPT_H_*/

 

А инициализация кнопок такая:

 

//--------------------------------------------

static void init_button_pio()//Recast the edge_capture pointer to match the alt_irq_register() function prototype.

{void* edge_capture_ptr = (void*) &edge_capture;

IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0); // Reset the edge capture register.

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf); // Enable all 4 button interrupts.

alt_irq_register(BUTTON_PIO_IRQ, edge_capture_ptr, handle_button_interrupts); // Register the ISR.

edge_capture=0x00; edge_timer=0; LED=0x00;

//IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, LED);

IOWR_ALTERA_AVALON_PIO_DATA(SEVEN_SEG_PIO_BASE, 0xffffffff);

}

 

Прерывание по таймеру не ставил, так как время контролировал в режиме "полинга", т.е. времени вполне хватало, и можно было просто считывать показания таймера и сравнивать с требуемым.

Пример этот привел просто для сравнения. Бывает, что не хватает каких-то закорючек, и все уже не работает...

Изменено пользователем 608

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за желание помочь. Я лет 5 назад писал прогу с таймером, всё работало прекрасно.

Вот этот кусок из старой рабочей программы.

void Timer0_isr()
    {
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
    if (CommTimeOut)
       {
       if (CommTimeOut > 1) CommTimeOut--;
       else {CommTimeOut = 0; IndexUartToCom = 0; rx_counter = 0; crc8 = 0;}
       }
    }

Похоже что дело не в обработчике, наверняка пропустил какую то важную штучку. Не могу найти какую...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как вы его включаете?

 

Вообще кажется, что он срабатывает снова, сразу как вы его сбрасываете.

Посмотрите просто в сигнал тапе и все будет понятно.

 

вот например у меня устанавливается таймер и сбрасывается (но это с VIC, хотя разницы особо нет:

void ru_timer_isr() {
   IOWR(PERIPHERAL_TIMER_RU_BASE,0,0);
   ...
}
void ru_timer_irq_init()
{
    alt_u32 timer_cnt = sys_freq; // 1sec
    IOWR(PERIPHERAL_TIMER_RU_BASE, 2, timer_cnt & 0xFFFF);
    IOWR(PERIPHERAL_TIMER_RU_BASE, 3, (timer_cnt>>16) & 0xFFFF);
    IOWR(PERIPHERAL_TIMER_RU_BASE, 0, 0x00);
    IOWR(PERIPHERAL_TIMER_RU_BASE, 1, 0x07); // timer start, cont, irq

    alt_ic_isr_register( 0x00, PERIPHERAL_TIMER_RU_IRQ, ru_timer_isr, NULL, 0x00 );
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Установил флажок fixed period и всё нормально заработало. Меня это устраивает.

Так и думал что пропустил что-то...

Всем спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...