Nios II Таймеры

В прошлый раз писал о том, как создать проект с процессором Nios — Nios II Быстрый старт. А сейчас поговорим о таймерах в нем. Ведь таймер — едва ли не самая важная периферия в контроллере. Без него ни время не посчитаешь, ни операционную систему не установишь.
У Altera есть готовый модуль для шины авалон. Его мы и добавим в наш проект.
При добавлении видим такое окно.

Справа — заготовленные конфигурации.
Вы можете выбрать значение периода по умолчанию, которое можно задать в удобных величинах. Оно будет пересчитано в тики и заботливо уложено в нужный регистр.
Можно поэкономничать и убрать возможность старта остановки, сделать период фиксированным, разрешить/запретить читать значение счетчика.
Как и любую другую периферию, наш таймер необходимо подключить к шине тактирования, данных и вывести прерывание.

Программа для работы с таким таймером очень проста.

#include <stdio.h>
#include "alt_types.h"
#include "system.h"
#include <sys/alt_irq.h>
#include "altera_avalon_timer_regs.h"

void timer_interrupt_latency_irq()
{
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,0);
    alt_ic_irq_disable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ);

    alt_ic_irq_enable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ);
}

int main()
{
    /* Register the interrupt */
    alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ, timer_interrupt_latency_irq, TIMER_0_BASE, NULL);
    /* Load period value */
    IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE,10000);
    IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE,1000);
    /* Start timer */
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
            | ALTERA_AVALON_TIMER_CONTROL_CONT_MSK
            | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
    while (1);//Event Loop
    return 0;
}

Важно записать в регистр управления флаги для разрешения прерываний (ALTERA_AVALON_TIMER_CONTROL_ITO_MSK), непрерывного счета (ALTERA_AVALON_TIMER_CONTROL_CONT_MSK) и старта счета (ALTERA_AVALON_TIMER_CONTROL_START_MSK).
Значение периода счетчика состоит из двух частей и записывается в два присеста. Не путаем L с H.
В обработчике прерывания сбрасываем бит прерывания и можно запретить/разрешить прерывание на время обработки.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий