(原创)NIOS中断编程

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

posted on 2010-11-28 21:30  超群天晴  阅读(1903)  评论(0编辑  收藏  举报

导航