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,测试通过