1.这个错误是由什么引起?提示LED_
PIO_BASE没有声明
答:这是因为名字不一致引起的比如,在生成SOPC系统时,双击PIO(Parallel I/O)(在Avalon Modules -> Other 下),为系统添加输出接口,你没有把该组件改名成LED_PIO,而是保留了原始的名字:PIO_0;但你又通过 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);来向该组件写入数据,就会导致上述错误。解决办法:1.可以修改sopc系统,为该PIO改名为LED_PIO ;2.在hello_led.c的前面给LED_PIO_BASE赋值,如#define LED_PIO_BASE 0x00001800,后面的这个地址要与SOPC中的地址对应. 2. 怎样在NIOSII中操作PIO,提供一种参考方法。 答:hello_led.c是这样写IO口的: 3.出错信息如下: Linking
hello_world_0.elf... 应该写成int main(void),结果写成了 int mian() 悲剧!!!!!! 4.IOWR_ALTERA_AVALON_PIO_DATA怎么使用?
答:IOWR_ALTERA_AVALON_PIO_DATA是一个宏定义,其位置在altera_avalon_pio_regs.h中,另外还要参考io.h头文件。NiosII IDE为了避开NiosII的Cache以及简化IO端口操作程序的编写,定义了两类基本的宏(以IOWR_开头的为写PIO操作,以IORD_开头的为读PIO操作),其效果与使用指针的效果不完全一样。 |
在这里先简单介绍一下各头文件的作用,,<stdio.h>这个头文件包含了标准输入、输出、错误函数库;"system.h",这个文件描述了每个设备并给出了以下一些详细信息:设备 的硬件配置、基地址、中断优先级、设备的符号名称,用户不需要编辑system.h 文件,此文件由HAL 系统库自动生成,其内容取决于硬件配置和用户在IDE 中设置的系统库属性;“altera_avalon_pio_regs.h ” 这个文件是通用I/O 口与高层软件之间的接口.IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led)这个函数就是在此文件中定义的,此函数的功能为将数值(led)赋给LED_PIO_BASE 为基地址的用户自定义的I/O 口上,也就是将led 这个值赋给我们硬件中LED 灯所接的FPGA 管脚上;“alt_types.h”头文件定义了数据类型,如下表所示 类型 说明 alt_u32 无符号32 位整数 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf); |
#include "system.h" while (1) |
count_binary.h文件 #ifndef COUNT_BINARY_H_
main.c文件: #include "count_binary.h" /* 注: 函数原型:IOWR(BASE, REGNUM,
DATA) */ |
count_binary.h文件见上
main.c文件 /* /* IO操作函数 */ |
/* case
0x08: /*外部中断服务子函数*/ |
#include "count_binary.h" int alt_main() { int second=0; while(1) { usleep(100000); second++; IOWR(SEG7_DISPLAY_BASE,0,second); } } |
lcd.h文件 #ifndef LCD_H_ main.c文件 /*硬件环境:DE2开发板 |
/*硬件环境:DE2开发板 * 软件环境:quaters II 7.2,NIOS II 7.2 * 函数功能:1602液晶驱动程序 * 使用NIOS II的fprintf标准函数对lcd编程比较简单! */ #include <unistd.h> #include <stdio.h> #include <string.h> #include <io.h> #include "system.h" int main(void) { FILE *lcd; lcd=fopen("/dev/lcd_16207_0","w"); /*1602液晶第一行显示的内容*/ fprintf(lcd,"I love NIOS II!\n"); /*1602液晶第二行显示的内容*/ fprintf(lcd,"I love you!"); fclose(lcd); return 0; } |
count_binary.h文件 #ifndef
COUNT_BINARY_H_
main.c文件 #include
"count_binary.h" unsigned int
data=segments[hex&15]|(segments[(hex>>4)&15]<<8); static void lcd_init(FILE
*lcd) static void
count_led() |
#include
<stdio.h> /*定时器1中断服务子函数*/ /*定时器1初始化函数*/
|
#include
<stdio.h> /*定时器1中断服务子函数*/ /*定时器1初始化函数*/
|
/*硬件环境:DE2开发板 int i = 0,j = 0,flag;
while(1);
//清除Timer中断标志寄存器
//重新启动定时器
//闪烁频率先高后低然后又变高 if(flag ==
0){
//清除中断标志位
//清除Timer2中断标志寄存器
|
/*硬件环境:DE2开发板 //UART接收子程序
|
#define timer2 /*定时器2中断服务子函数*/ /*定时器1初始化函数*/ /*定时器1中断服务子函数*/ /*定时器1初始化函数*/
|
首先,对memest()函数进行一下介绍。 memest原型 (please type "man memset" in your shell)
#include
<stdio.h> int
main(void)
|
#include "system.h" #ifdef _LED
流水灯2: #include "system.h" unsigned int i=0;
需要注意的是: 当你的CPU选择的是NIOS II/f(*的那种)的时候,在高速缓存的配置的地方要注意一下,应选择none,否则 灯是不会亮的!如果选择的是其他两种CPU的话,就不用注意这种问题:
|
/* 硬件环境: DE2开发板 alt_u32 count=0; |