NIOS II 按键中断问题,请大家指点下?
下面是用NIOS II 的按键中断的代码,有几个问题(1)、alt_irq_register(K_KEY0_IRQ,edge_capture_ptr,button_ISR0);//中断函数注册
这个函数的第二个参数,是怎么和中断函数button_ISR0进行参数传递?
(2)、我在 intmain(void)
{
while(1)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0X20); //如果这个语句执行的话,按键中断就不能执行,如果把这个语句注释掉了,按键中断可以执行;
}
}
请教哪位大侠指点!!!!!
//***************************************************************************************************//
#include <stdio.h>
#include "system.h" //包含基本的硬件描述信息
#include "altera_avalon_pio_regs.h"//包含基本的I/O口信息
#include "sopc.h"
#include "sys/alt_irq.h" //中断函数
#include "unistd.h" //延时函数usleep
#include "altera_avalon_timer_regs.h"//定义内核寄存器的映射,提供对底层硬件的符号化访问
#include "alt_types.h" //Altera定义的数据类型(alt_8等)
#include "io.h"
//***************************************************************************************************//
volatile int edge_capture;//定义变量
//***************************************************************************************************//
void button_ISR0(void* context,alt_u32 id) //中断处理
{
volatile int* edge_capture_ptr=(volatile int*)context;//捕获外部中断,进行分别处理,争对多个中断源的程序
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(K_KEY0_BASE);//当系统进入中断处理程序内部时,要将中断清除,以便下一次的中断产生.
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(K_KEY0_BASE,0x0);//对多个中断源进行分别处理,采用switch语句进行
switch(edge_capture)
{
case 0x1:
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0X07);
break;
case 0x2:
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0X01);
break;
default:
break;
}
}
void button_ISR1(void* context,alt_u32 id) //中断处理
{
volatile int* edge_capture_ptr=(volatile int*)context;//捕获外部中断,进行分别处理,争对多个中断源的程序
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(K_KEY1_BASE);//当系统进入中断处理程序内部时,要将中断清除,以便下一次的中断产生.
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(K_KEY1_BASE,0x0);//对多个中断源进行分别处理,采用switch语句进行
switch(edge_capture)
{
case 0x1:
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0X38);
break;
case 0x2:
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0X20);
break;
default:
break;
}
}
//***************************************************************************************************//
void init_keyISR(void)//中断初始化
{
//其实alt_irq_register的第二个形参和ISR的形参是关联的,如果需要向ISR传递参数,
//就可以写这个值,然后在ISR里处理context,就上面的程序而言,都可以写为NULL。
void *edge_capture_ptr=(void*) &edge_capture;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(K_KEY0_BASE,0x0);//清除中断
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(K_KEY0_BASE,0x0f);//中断使能
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(K_KEY1_BASE,0x0);//清除中断
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(K_KEY1_BASE,0x0f);//中断使能
alt_irq_register(K_KEY0_IRQ,edge_capture_ptr,button_ISR0);//中断函数注册
alt_irq_register(K_KEY1_IRQ,edge_capture_ptr,button_ISR1);//中断函数注册
}
//***************************************************************************************************//
int main(void)
{
init_keyISR();//按键中断初始化
while(1)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0X20);
}
}
//***************************************************************************************************//
页:
[1]