NIOS简单程序之按键控制LED

  自己通过学习NIOS,主要学习NIOS中PIO控制,主要实现一个按键控制LED灯亮和灭,按键控制部分采用中断方式,因为只是简单学习PIO控制,所以按键部分没有做相关消抖处理,实际中按键控制没那么完美,还需完善。 

      下面先讲述步骤,先在Quartus中新建一个Qsys文件,在文件中添加如下对应模块(图中注意要将NIOS processor的jtag_debug_module_reset这个复位信号连接到RAM和epcs的reset信号上,否则会在烧写epcs时候出问题):

    

     其中,要注意的选项是对应将epcs的基地址设置为0x00,并且锁定。在连接好后,Generate,等success后,进入到NIOS编程了,至于如何建立NIOS工程,这里就不说了,下面是我的NIOS程序:

#include <system.h>
#include <altera_avalon_pio_regs.h>
#include <alt_types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/alt_irq.h>
#include <io.h>

void delay(void);

alt_u8 SW_value;

static void handle_sw_interrupts(void)
{
 SW_value = IORD_ALTERA_AVALON_PIO_DATA(SW_PIO_BASE);
 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);
}

//初始化 SW_PIO
void init_SW(void)
{
 SW_value = 0xff;
 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_PIO_BASE,0xff);      //使能PIO中断
 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);  //对EDGE_REGISTER清零
 alt_irq_register(SW_PIO_IRQ,SW_PIO_BASE,handle_sw_interrupts);
}

int main()
{
  alt_u8 timer = 0x00;
  init_SW();

  while(1)
  {
   if((SW_value&0x0F) == 0x0E)
   {
    printf("hello,LED0! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfE);
    delay();
    timer++;
   }
   else if((SW_value&0x0F) == 0x0D)
   {
    printf("hello,LED1! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfd);
    delay();
    timer++;
   }
   else if((SW_value&0x0F) == 0x0B)
   {
    printf("hello,LED2! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfB);
    delay();
    timer++;
   }
   else if((SW_value&0x0f) == 0x07)
   {
    printf("hello,LED3! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xf7);
    delay();
    timer++;
   }
   else if(SW_value==0xff)
   {
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfF);
   }
  }
  return 0;
}

void delay(void)
{
 alt_u32 i=0;
 while(i<400000)
  i++;
}

在练习NIOS中(采用Quartus II  13.0版本),碰到一个问题:在用NIOS中,如果采用调试模式,烧写sof和elf文件分开烧写发现是可以的,但是采用NIOS Flash Programmer烧写就发现问题,(在烧写前先要下载sof文件进去,然后点开NIOS Flash Programmer,在界面下点击new file界面烧写,添加sof和elf文件进去)无法烧写成功。错误如下:

后来将sys_id去除,问题解决,所以这里就奇怪,Altera官方是推荐用sys_id的,可是sys_id又影响NIOS下载,这里不了解,还望有人帮我解释下。

posted on 2014-02-14 16:24  无情剑客lufy  阅读(1993)  评论(2编辑  收藏  举报

导航