首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

中断的老问题?

中断的老问题?

nios的外部中断,按下按键对应的LED 点亮,为什么不行呢?高手帮忙给看看


#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"


 


volatile int   data;


int main (void) __attribute__ ((weak, alias ("alt_main")));


  /*
   * Use alt_main as entry point for this free-standing application
   */
void delay1000ms(alt_u32 time)
{
   alt_u32 i ;
   for(i=0;i<time;i++);
 
}


static void handle_button_interrupts(void* context, alt_u32 id)
{
  volatile int* edge_capture_ptr = (volatile int*) context;
  *edge_capture_ptr =  IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_RISING_PIO_BASE);
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_RISING_PIO_BASE, 0);
}


static void init_button_pio( void )
{
  void* edge_capture_ptr = (void*) &data;
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_RISING_PIO_BASE, 0xf);
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_RISING_PIO_BASE, 0x0);
  alt_irq_register( KEY_RISING_PIO_IRQ, edge_capture_ptr, handle_button_interrupts );
}



int alt_main (void)
{
  int last_tested ;
  last_tested = 0xffff;
  data = 0x0000;
  init_button_pio();
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01);
  delay1000ms(200000);
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x02);
  delay1000ms(200000);
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x04);
  delay1000ms(200000);
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x08);
  delay1000ms(200000);
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00);
 
 
    while(1)
    {
     
      if (last_tested == data)
      {
        continue;
      }
      else
      {
        last_tested = data;
        switch (data)
        {
          case 0x0001:
            IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01);
            break;
          case 0x0002:
            IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x02);
            break;
          case 0x0004:
            IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x04);
            break;
          case 0x0008:
            IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x08);
            break;
        } 
      }
    }
  return 0;
}

你用main去操作,不要用alt_main.
在交流中前进,共同实现nios的应用。
恩!果然对了,那alt_main()和普通的main()有什么不同呢?我用了main()以后ram 不够用添加了SDRAM才搞定
返回列表