В прошлый раз писал о том, как создать проект с процессором 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.
В обработчике прерывания сбрасываем бит прерывания и можно запретить/разрешить прерывание на время обработки.