1、注册中断处理程序
在sys/alt_irq.h文件中,注册中断使用的函数是
extern int alt_irq_register (alt_u32 id, void* context, void (*irq_handler)(void*, alt_u32));
id 是IRQ的编号,system.h 会自动生成
context是上下文,还不知道有什么用
void (*irq_handler)(void*, alt_u32) 是中断函数,中断函数的定义需要完全依照void * ,alt_32) 方式来定义
2、编写中断函数
比如使用的PIO_BUTTON 中断,则可编写中断服务函数如下
//中断服务子程序 static void keydown_interrupts(void* context, int id) { char c; c=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,c); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,Seg_Value[(alt_u8)c]^0xff); printf("按键中断产生:%d\n",c); }
main文件如下
/* * 增加系统的ID识别 2010年11月28日16:46:09 超群天晴 * */ #include <stdio.h> #include <string.h> #include "sys/alt_stdio.h" #include "alt_types.h" #include "system.h" #include "altera_avalon_pio_regs.h" #include "sys/alt_irq.h" #define int1 1 //数码管译码 alt_u8 Seg_Value[16]= { 63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; void Delay(int delay) { while(delay--); } //中断服务子程序 static void keydown_interrupts(void* context, int id) { char c; c=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,c); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,Seg_Value[(alt_u8)c]^0xff); printf("按键中断产生:%d\n",c); } //中断初始化 void init_pio(void) { //初始化输入,输出('1'out,'0'in) //IOWR_ALTERA_AVALON_PIO_DIRECTION(HEX0_D_BASE,0xff); //IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_BUTTON_BASE,0x00); //打开中断('1'中断使能) IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BUTTON_BASE,0xff); //清边沿捕捉寄存器 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0x00); //注册中断服务程序 alt_irq_register(PIO_BUTTON_IRQ,NULL,keydown_interrupts); } int main() { #ifdef int1 alt_putstr("Nios II 按键中断测试! 超群天晴 2010年11月28日21:15:08\n"); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_DP_BASE,1);//果然是共阳的! 2010年11月16日22:40:08 超群天晴
init_pio(); while(1); #endif #ifdef seg //按键显示数 //alt_u8 Led = 0x01; //alt_u8 Key_Value; alt_u32 i= 100000; alt_u8 status = 0; alt_putstr("seg2 TEST from Nios II!\n"); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_DP_BASE,1);//果然是共阳的! 2010年11月16日22:40:08 超群天晴
while (1) { //Key_Value=IORD_ALTERA_AVALON_PIO_DATA(SW_BASE);//读取地址值 IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,Seg_Value[status]^0xff); status++; if(status==16) status=0; //Delay i=500000; while(i--); } #endif return 0; }
2010年11月28日21:31:38,测试通过