Не могу сделать простой пример работы с прерываниями GPIO. Процессор Altera Cyclone V (ARM Cortex A9). Приложение bare-metal.
К порту С подключены кнопки.
Делаю прерывание по уровню, вроде бы работает, при нажатии на кнопку вызывается ISR, и вызывается непрерывно, пока кнопка нажата. Если я пытаюсь сделать прерывания по фронту, то после первого нажатия на кнопку ISR вызывается, и продолжает вызываться непрерывно после этого.
Уже перепробовал все комбинации уровень/фронт и полярность. Ошибка явно в чём-то другом
CODE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <inttypes.h>
#include “alt_interrupt.h”
#include “alt_timers.h”
#include “alt_generalpurpose_io.h”
volatile bool blink = false;
/******************************************************************************/
/*!
* ISR Callback
*
* \param icciar
* \param context ISR context.
* \return none
*/
static void gpio_isr_callback() {
long mask = alt_gpio_port_int_status_get(ALT_GPIO_PORTC);
// Clear interrupt source don't care about the return value
long status = alt_gpio_port_int_status_clear(ALT_GPIO_PORTC, 0x00200000);
mask = alt_gpio_port_int_status_get(ALT_GPIO_PORTC);
alt_gpio_port_data_write(ALT_GPIO_PORTB, 0x0F000000, blink << 24);
blink = !blink;
}
/******************************************************************************/
/*!
* Main entry point
*
*/
int main(void) {
alt_gpio_init();
alt_gpio_port_datadir_set(ALT_GPIO_PORTB, 0x0F000000, 0x0F000000);
// System init
alt_gpt_all_tmr_init();
// Setup Interrupt
alt_int_global_init();
// Initialize CPU interrupts
alt_int_cpu_init();
// Set interrupt distributor target
int cpu_target = 0x1; //CPU0 will handle the interrupts
alt_int_dist_target_set(ALT_INT_INTERRUPT_GPIO2, cpu_target);
// Set interrupt trigger type
alt_int_dist_trigger_set(ALT_INT_INTERRUPT_GPIO2, ALT_INT_TRIGGER_EDGE);
// Enable interrupt at the distributor level
alt_int_dist_enable(ALT_INT_INTERRUPT_GPIO2);
// Enable CPU interrupts
alt_int_cpu_enable();
// Enable global interrupts
alt_int_global_enable();
alt_gpio_port_datadir_set(ALT_GPIO_PORTC, 0x01e00000, 0x00000000);
alt_gpio_port_debounce_set(ALT_GPIO_PORTC, 0x01e00000, 0x00200000);
alt_gpio_port_int_type_set(ALT_GPIO_PORTC, 0x01e00000, 0x00200000);
alt_gpio_port_int_pol_set(ALT_GPIO_PORTC, 0x01e00000, 0x00200000);
// Register gpio ISR
alt_int_isr_register(ALT_INT_INTERRUPT_GPIO2, gpio_isr_callback, NULL);
alt_gpio_port_int_enable(ALT_GPIO_PORTC, 0x00200000);
while(1);
return 0; //unreachable
}
Сообщение отредактировал IgorKossak - Jul 21 2017, 13:25
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!