nios中alt_main下的中断问题

2019-03-25 10:51发布

在网上看了一下alt_main使用中断需要自己注册,但我注册了程序却任进不了中断程序。
我的程序如下:(sopc builder 中设置:一个input口,边沿中断 either edge ; 一个output口)
............................
#include "system.h"

#include "alt_types.h"

#include "sys/alt_irq.h"

#include "altera_avalon_pio_regs.h"

static void keydown(void* context,alt_u32 id)//中断处理函数

{

  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x0);

   while(1);
}
int alt_main(void)
{
   int   led=0;
   int   i;

    alt_irq_init(ALT_IRQ_BASE);//初始化中断

    alt_irq_enabled(  );//使能中断

    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x0);

    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x1);//打开中断

  alt_irq_register(PIO_KEY_IRQ,0,keydown);//注册中断函数

    while(1)
   {
      led = ~led;
      IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led灯闪烁
      i = 0;
      while(i<200000)
           i++;
   }
}
中断使能也用过alt_irq_enable_all(PIO_KEY_BASE );
不知为什么始终进不了中断程序(led灯一直在闪烁)~~  跪求why! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
Sea_eeworld
2019-03-25 17:23
我不知道你有没有将那个IO口设置为 边沿 触发,你可以参看下面运行成功的中断程序:
static void init_button_pio()
{
    void *edge_capture_ptr=(void *)&edge_capture;
  /* 初始化LED_PIO为输出,KEY为输入 */
  IOWR_ALTERA_AVALON_PIO_DIRECTION(INT_IN_BASE, 0);
  /* 开KEY的中断 */
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT_IN_BASE, 0x0f);
  /* 清边沿捕获寄存器 */  
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT_IN_BASE, 0);
   alt_irq_register(INT_IN_IRQ,edge_capture_ptr,handle_button_interrupt);   
}
//中断服务程序
static void handle_button_interrupt(void *context,alt_u32 id)
{
    volatile int *edge_capture_ptr=(volatile int*)context;
    *edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(INT_IN_BASE);
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT_IN_BASE,0);
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT_IN_BASE,0x0f);   
}

一周热门 更多>