Board logo

标题: 中断的老问题? [打印本页]

作者: zydz70398    时间: 2006-5-31 19:45     标题: 中断的老问题?

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;
}


作者: kzw    时间: 2006-6-1 09:46

你用main去操作,不要用alt_main.
作者: zydz70398    时间: 2006-6-1 19:27

恩!果然对了,那alt_main()和普通的main()有什么不同呢?我用了main()以后ram 不够用添加了SDRAM才搞定





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0