Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием данных по прерыванию
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Naixrim
Здравствуйте уважаемые форумчане, недавно стал осваивать ПЛИС и работу с ней. Такого вопроса не нашел, потому и создаю тему.
В необходимой мне задаче необходимо принять со входа PIO_BASE данные по прерыванию с помощью HAL, которые генерирует сам PIO_BASE.
Не могу разобраться со структурой регистрации прерывания и обработчика из мануала.
Код
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
static void handle_button_interrupts(void* context)
#else
static void handle_button_interrupts(void* context, alt_u32 id)
#endif
{
/* Cast context to edge_capture's type. It is important that this
be declared volatile to avoid unwanted compiler optimization. */
volatile int* edge_capture_ptr = (volatile int*) context;
/*
* Read the edge capture register on the button PIO.
* Store value.
*/
*edge_capture_ptr =
IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
/* Write to the edge capture register to reset it. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0);
/* Read the PIO to delay ISR exit. This is done to prevent a
spurious interrupt in systems with high processor -> pio
latency and fast interrupts. */
IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
}

и
Код
#include "sys/alt_irq.h"
#include "system.h"
...
/* Declare a global variable to hold the edge capture value. */
volatile int edge_capture;
...
/* Initialize the button_pio. */
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;
/* Enable all 4 button interrupts. */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
/* Reset the edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
/* Register the ISR. */
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,
BUTTON_PIO_IRQ,
handle_button_interrupts,
edge_capture_ptr, 0x0);
#else
alt_irq_register( BUTTON_PIO_IRQ,
edge_capture_ptr,
handle_button_interrupts );
#endif
}

Хотел бы получить в кратце обоснования как это работает и куда же мне вставлять уже МОИ команды, которые я хочу обработать в прерывании?
doom13
handle_button_interrupts() и есть Ваш обработчик прерывания от PIO.
В init_button_pio() происходит настройка порта и регистрация прерывания.
Naixrim
Да, но там еще куча непонятных зачем команд, например при инициализации прерывания от таймера, можно было обойтись только инициализацией и обработчиком, а тут еще куча внутренних макросов,зачем они?
doom13
Цитата(Naixrim @ Jun 4 2015, 21:41) *
Да, но там еще куча непонятных зачем команд, например при инициализации прерывания от таймера, можно было обойтись только инициализацией и обработчиком, а тут еще куча внутренних макросов,зачем они?

Настроек для таймера в Вашем примере нет, там только то, что касается PIO.
А макросы - это запись в соответствующий региср PIO нужного значения.
Если Вы про #ifdef, то оно выбирает тип interrupt-контроллера, который присутствует в системе.
Naixrim
Спасибо огромное за разбор и помощь, действительно, хватило вставить в обработчик все мои функции как все заработало, правда нужно было еще при инициализации выставить настройку маски прерывания в качестве отработки по всем значениям 0xFF так как он 8ми битный.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.