自己通过学习NIOS,主要学习NIOS中PIO控制,主要实现一个按键控制LED灯亮和灭,按键控制部分采用中断方式,因为只是简单学习PIO控制,所以按键部分没有做相关消抖处理,实际中按键控制没那么完美,还需完善。
下面先讲述步骤,先在Quartus中新建一个Qsys文件,在文件中添加如下对应模块:
其中,要注意的选项是对应将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下载,这里不了解,还望有人帮我解释下。
原文:http://www.cnblogs.com/wuqingjianke/p/3549779.html