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;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |