nios的外部中断,按下按键对应的LED 点亮,为什么不行呢?高手帮忙给看看
#include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "sys/alt_irq.h"
volatile int data;
int main (void) __attribute__ ((weak, alias ("alt_main")));
/* * Use alt_main as entry point for this free-standing application */ void delay1000ms(alt_u32 time) { alt_u32 i ; for(i=0;i<time;i++); }
static void handle_button_interrupts(void* context, alt_u32 id) { volatile int* edge_capture_ptr = (volatile int*) context; *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_RISING_PIO_BASE); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_RISING_PIO_BASE, 0); }
static void init_button_pio( void ) { void* edge_capture_ptr = (void*) &data; IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_RISING_PIO_BASE, 0xf); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_RISING_PIO_BASE, 0x0); alt_irq_register( KEY_RISING_PIO_IRQ, edge_capture_ptr, handle_button_interrupts ); }
int alt_main (void) { int last_tested ; last_tested = 0xffff; data = 0x0000; init_button_pio(); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01); delay1000ms(200000); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x02); delay1000ms(200000); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x04); delay1000ms(200000); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x08); delay1000ms(200000); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00); while(1) { if (last_tested == data) { continue; } else { last_tested = data; switch (data) { case 0x0001: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01); break; case 0x0002: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x02); break; case 0x0004: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x04); break; case 0x0008: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x08); break; } } } return 0; }
|