#include <stdlib.h> #include <io.h> #include "sys/alt_irq.h" #include "altera_avalon_pio_regs.h" #include "system.h" #ifdef PIO_BUTTON_BASE /* 按键中断服务程序*/ static void handle_button_interrupts(void* context, alt_u32 id) { /* 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; /* Store the value in the Button's edge capture register in *context. */ *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE); /* Reset the Button's edge capture register. */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0x00); } /* 按键IO初始化 */ 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(PIO_BUTTON_BASE, 0xff); /* Reset the edge capture register. */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE, 0x00); /* Register the interrupt handler. */ alt_irq_register(PIO_BUTTON_IRQ, edge_capture_ptr, handle_button_interrupts ); } #endif void delay(int i) { int j; for(j=0;j<i;j++); } int main (void) __attribute__ ((weak, alias ("alt_main"))); int alt_main(void) { alt_irq_init(ALT_IRQ_BASE); //使能中断
init_button_pio(); while(1) { switch(edge_capture) { case 0x01: { led=led^0x01; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x02: { led=led~0x02; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x04: { led=led^0x04; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x08: { led=led^0x08; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x10: { led=led^0x10; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x20: { led=led^0x20; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x40: { led=led^0x40; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } case 0x80: { led=led^0x80; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,led); break; } default: { IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x00); edge_capture=0; break; } } } return 0; }
|
注意,在添加按键PIO时一定要使能中断!研究过一段时间的Nios II,感觉还是很有收获,深刻体会到了SOPC技术的灵活性,但目前速度方面是其最大的缺点,相信Nios II会慢慢流行起来....
阅读(3641) | 评论(1) | 转发(0) |