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下载,这里不了解,还望有人帮我解释下。