天行健,君子以自强不息
分类: C/C++
2010-07-13 20:53:19
答:这是因为名字不一致引起的比如,在生成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操作),其效果与使用指针的效果不完全一样。
1.这个错误是由什么引起?提示LED_ PIO_BASE没有声明
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
首先在altera_avalon_pio_regs.h找到定义
#i nclude
#define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0)
#define IOWR_ALTERA_AVALON_PIO_DATA(base, data) IOWR(base, 0, data)
因此在NIOSII中可以调用#i nclude
在smallsoftwarehello_led_0_syslibDebugsystem_des cription下的system.h
中,有以下内容:
#define LED_PIO_TYPE "altera_avalon_pio"
#define LED_PIO_BASE 0x00004000
其中LED_PIO_BASE(IO寄存器地址?)为0x00004000同SOPCBuilder中设置一致!
(其实在SopcBuilder中有关NiosII的配置,就是通过system.h来传送给IDE的!)
最后用IOWR(0x00004000, 0, led);替代
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);编译,下载到开发板上,运行成功!
/cygdrive/e/DE2Project_restored/software/hello_world_0_syslib/Debug/libhello_world_0_syslib.a(alt_main.o)(.text+0x60): In function `alt_main':
/cygdrive/c/altera/72/nios2eds/components/altera_hal/HAL/src/alt_main.c:163: undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [hello_world_0.elf] Error 1
Build completed in 1.953 seconds
答:将主函数名字写错了.
LED_PIO_BASE是在system.h中定义的一个宏,是LED_PIO端口的基地址。
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led)的含义就是往LED_PIO端口的数据输出寄存器写入led,
具体可以参考 Altera_embeded_peripherals 一文,这里讲解了一个PIO端口包含了那些寄存器。参考NiosII_software_developer's_handbook 进行驱动设计。这两个文件可以在Altera的官方网站上下载。
在这里先简单介绍一下各头文件的作用,, 的硬件配置、基地址、中断优先级、设备的符号名称,用户不需要编辑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 #include #include #include #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 /*定时器1中断服务子函数*/ /*定时器1初始化函数*/
|
#include /*定时器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 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; |