не стоит паниковать.
берете platform studio из EDK, делаете проц.
Новый проект используя base system builder на основе axi
отвечаете на вопросы визарда
добавляете в проект таймер на 2 экране, и ставите галочку чтобы тот прерывания использовал
ждете...
получите проц где все соединено.
собираете его и экспортите в SDK, там есть стандартный тест перефирии.
Общий принцип прерываний микроблайза - это вызов экцепшена, общий для всех прерываний, внутри которого вы смотрите что именно произошло.
чтобы все работало вам надо
сделать функцию
Код
void InterruptHandler_Timer(void *CallbackRef, int TmrCtrNumber)
- эта функция будет вызываться когда сработает прерывание
инициализировать контроллер прерываний, зарегистрировав в нем прерывание от таймера
Код
XIntc_Connect(int_controller, XPAR_INTC_0_TMRCTR_0_VEC_ID, XTmrCtr_InterruptHandler, (void *)TimerCounter);
где
XIntc *int_controller - указатель на контроллер прерываний
XPAR_INTC_0_TMRCTR_0_VEC_ID - это идентификатор прерывания таймера, кажется генерится в хедере сам
XTmrCtr_InterruptHandler - стандартная функция обработки прерываний, как раз там идет разбор кто куда
TimerCounter - это указатель на структуру обработки таймера
static XTmrCtr _TimerCounter; //структура настройки Таймера
XTmrCtr *TimerCounter = &(_TimerCounter); //указатель для удобства использования функций
далее запустить контроллер
Код
XIntc_Start(int_controller, XIN_REAL_MODE);
включить прерывание
Код
XIntc_Enable(int_controller, XPAR_INTC_0_TMRCTR_0_VEC_ID);
еще я вот такое дописал
Код
//на момент написания программы это пустая функция, вызовим
//на случай если в будующем эта функция станет наполнена
Xil_ExceptionInit();
//добавим указатель на функцию обработки исключения "прерывание"
//это уже настроено через libgen, добавим явное определение на всякий случай
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XIntc_InterruptHandler,
int_controller);
//Запустим исключение и включим прерывания (глобально)
Xil_ExceptionEnable();
при настройке самого таймера надо указать ему обработчик его прерываний
Код
XTmrCtr_SetHandler(TimerCounter,(XTmrCtr_Handler)InterruptHandler_Timer,(void *)TimerCounter);
вот и все. Очень много сделано не логично. Смысл действий такой. libgen тот что запускается при создании проекта, делает так что при прирывании будет вызвана главная функция разбора. Которая пробежится по всему и вся, и запустит то что надо.
При этом создается хедер с кучей констант среди которых есть и
XPAR_INTC_0_TMRCTR_0_VEC_ID
функция
XIntc_Connect
добавляет в таблицу указатель на структуру обработчик данного "вектора" то есть в нашем случае на структуру таймера.
а в структуре таймера есть функция callback которую надо вызвать если что.
когда происходит прерывание, произойдет экцепшен проца, который позовет главную функцию, которая найдет структуру обработчик, и позовет из нее функцию обработчик уже того что вам надо.... вот
на все это дело есть и готовый пример. если что пишите