ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:25.91KB ,
资源ID:6649221      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6649221.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(nios 常见错误0.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

nios 常见错误0.docx

1、nios 常见错误0NIOS II 常见错误: 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的前

2、面给LED_PIO_BASE赋值,如#define LED_PIO_BASE 0x00001800,后面的这个地址要与SOPC中的地址对应. 2. 怎样在NIOSII中操作PIO,提供一种参考方法。 答:hello_led.c是这样写IO口的: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led); 首先在altera_avalon_pio_regs.h找到定义 include #define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0) #define IOWR_ALTERA_AVALON_PIO_DA

3、TA(base, data) IOWR(base, 0, data) 因此在NIOSII中可以调用i nclude库函数IORD/IOWR来操作PIO。 在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中有关Nios

4、II的配置,就是通过system.h来传送给IDE的!) 最后用IOWR(0x00004000, 0, led);替代 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);编译,下载到开发板上,运行成功! 3.出错信息如下: Linking hello_world_0.elf. /cygdrive/e/DE2Project_restored/software/hello_wor ld_0_syslib/Debug/libhello_world_0_syslib.a(alt_mai n.o)(.text+0x60): In function alt_ma

5、in: /cygdrive/c/altera/72/nios2eds/components/altera_h al/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 答:将主函数名字写错了. 应该写成int main(void),结果写成了 int mian() 4.IOWR_ALTERA_AVALON_PIO_DATA怎么使用? 答:I

6、OWR_ALTERA_AVALON_PIO_DATA是一个宏定义,其位置在altera_avalon_pio_regs.h中,另外还要参考io.h头文件。NiosII IDE为了避开NiosII的Cache以及简化IO端口操作程序的编写,定义了两类基本的宏(以IOWR_开头的为写PIO操作,以IORD_开头的为读PIO操作),其效果与使用指针的效果不完全一样。 LED_PIO_BASE是在system.h中定义的一个宏,是LED_PIO端口的基地址。 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led)的含义就是往LED_PIO端口的数据输出寄存器写入le

7、d, 具体可以参考 Altera_embeded_peripherals 一文,这里讲解了一个PIO端口包含了那些寄存器。参考NiosII_software_developers_handbook 进行驱动设计。这两个文件可以在Altera的官方网站上下载。 NIOS_II 学习笔记: 在这里先简单介绍一下各头文件的作用,这个头文件包含了标准输入、输出、错误函数库;system.h,这个文件描述了每个设备并给出了以下一些详细信息:设备的硬件配置、基地址、中断优先级、设备的符号名称,用户不需要编辑system.h 文件,此文件由HAL 系统库自动生成,其内容取决于硬件配置和用户在IDE 中设置的

8、系统库属性;“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_8 有符号8 位整数 alt_u8 无符号8 位整数 alt_16 有符号16 位整数 alt_u16 无符号16 位

9、整数 alt_32 有符号32 位整数 alt_u32 无符号32 位整数 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0x f); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x 0); IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE); alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,h andle_button_interrupts) 在文件altera_avalon_pio_regs.

10、h中有如下定义 #define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base,data)IOWR(bas e,2,data) #define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base,data)IOWR(bas e,3,data) #define IORD_ALTERA_AVALON_PIO_EDGE_CAP(base)IORD(base,3) 第一个函数是使能中断函数,是按位来势能的,比如0xf表示四位全部使能,而0x7表示使能低3位中断; 第二个函数是设置边沿捕获寄存器函数,用来重新设定寄存器的值;一般在读取之后会重新设定为0;

11、第三个函数是读取边沿捕获寄存器函数,用来读取寄存器的值; 下面是alt_irq_register函数的原形,此函数用来声明ISR,在软使用IRS之前一定要先声明; extern int alt_irq_register(alt_u32 id, void*context, void(*irq_handler)(void*,alt_u32); 一般在开发按键中断程序时,handle_button_interrupts()和init_button_pio()这两个函数直接使用,不用再编辑。 系统配置文件如下: 1.流水灯 #include system.h #include altera_avalo

12、n_pio_regs.h #include alt_types.h #include stdio.h #include unistd.h int main (void) _attribute_ (weak, alias (alt_main); int alt_main (void) unsigned char led = 0; while (1) for(led=0;led8;led+) IOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE, 1led); usleep(500000); /延时0.5秒 return 0; 2.流水灯 count_binary.

13、h文件 #ifndef COUNT_BINARY_H_ #define COUNT_BINARY_H_ #include alt_types.h #include #include #include system.h #include sys/alt_irq.h #include altera_avalon_pio_regs.h #define ESC 27 #define ESC_TOP_LEFT 1;0H #define ESC_COL2_INDENT5 2;5H #define ESC_CLEAR K #define ECS_COL1_INDENT5 1;5H #endif /*COUN

14、T_BINARY_H_*/ main.c文件: #include count_binary.h int main(void) int i; int data; while(1) i=0; data= for(i=0;i=1; usleep(500000); /* 注: 函数原型:IOWR(BASE, REGNUM, DATA) 输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据 函数说明:往偏移量为REGNUM寄存器中写入数据。寄存器的值在地址总线的范围之内。 返回值: */ 3.独立键盘 count_binary.h文件见上 main.c文件 /* 硬件

15、环境:DE2开发板 按键未按时是高电平 按下后是低电平 4个按键控制4个灯(配置的系统有八个灯,4个键只点亮高四位的灯) */ #include count_binary.h int alt_main() int key,data; data= while(1) key=IORD(BUTTON_PIO_BASE,0); if(key=0x7) data= key=IORD(BUTTON_PIO_BASE,0); if(key=0xb) data= key=IORD(BUTTON_PIO_BASE,0); if(key=0xd) data= key=IORD(BUTTON_PIO_BASE,0)

16、; if(key=0xe) data= IOWR(LED_GREEN_BASE,0,data); /* IO操作函数 函数原型:IORD(BASE, REGNUM) 输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量 函数说明:从基地址为BASE的设备中读取寄存器中偏移量为REGNUM的单元里面的值。寄存器的值在地址总线的范围之内。 返回值: */ 说明: 下面的程序采用的是另一套配置文件,即ptf文件同上面的不同,是DE2开发板自带的,用起来挺方便! 4.外部中断点亮数码管 /* 硬件环境:DE2开发板 四个按键对应着四个不同的外部中断 通过不同的按键在数码管上面显示不同的数字

17、 */ #include count_binary.h volatile int edge_capture; /*外部中断服务子函数声明(与单片机不同,这里需要声明一下)*/ static void handle_button_interrupts(void *context,alt_u32 id); /*按键初始化*/ static void init_button_pio() void *edge_capture_ptr=(void*)&edge_capture; /*使能四个按键的中断(外部中断)*/ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_

18、BASE,0x f); /*复位边沿捕获寄存器*/ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x 0); /*注册四个按键锁对应的外部中断*/ alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,h andle_button_interrupts); /*主函数*/ int main(void) init_button_pio(); while(1) switch(edge_capture) /*按键3按下时8个数码管全部显示1*/ case 0x08: IOWR(SEG7_DISPLAY_B

19、ASE,0,0x11111111); break; case 0x04: IOWR(SEG7_DISPLAY_BASE,0,0X22222222);break; case 0x02: IOWR(SEG7_DISPLAY_BASE,0,0X33333333); break; /*按键0按下时8个数码管全部显示4*/ case 0x01: IOWR(SEG7_DISPLAY_BASE,0,0x44444444); break; /*外部中断服务子函数*/ static void handle_button_interrupts(void *context,alt_u32 id) volatile

20、int * edge_capture_ptr=(volatile int *)context; /*键按键的值存储到边沿捕获寄存器中*/ *edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP( BUTTON_PIO_BASE); /*复位边沿捕获寄存器*/ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0) ; 5.定时器 #include count_binary.h int alt_main() int second=0; while(1) usleep(100000); second+; IO

21、WR(SEG7_DISPLAY_BASE,0,second); 6.1602液晶驱动程序 lcd.h文件 #ifndef LCD_H_ #define LCD_H_ #define lcd_write_cmd(base,data) IOWR(base,0,data) #define lcd_read_cmd(base) IORD(base,1) #define lcd_write_data(base,data) IOWR(base,2,data) #define lcd_read_data(base) IORD(base,3) void lcd_init(); void lcd_show_te

22、xt(char * text); void lcd_line2(); void lcd_test(); #endif /*LCD_H_*/ main.c文件 /*硬件环境:DE2开发板 * 软件环境:quaters II 7.2,NIOS II 7.2 * 函数功能:1602液晶驱动程序 */ #include #include #include #include system.h #include lcd.h void lcd_init() /*采用8位数据总线的方式,两行显示*/ lcd_write_cmd(LCD_16207_0_BASE,0X38); usleep(2000); /*关

23、显示,关光标闪烁方式*/ lcd_write_cmd(LCD_16207_0_BASE,0X0C); usleep(2000); /*清显示*/ lcd_write_cmd(LCD_16207_0_BASE,0X01); usleep(2000); /*光标前移方式,不允许整屏移动*/ lcd_write_cmd(LCD_16207_0_BASE,0X06); usleep(2000); /*显示指针指向处事位置*/ lcd_write_cmd(LCD_16207_0_BASE,0X80); usleep(2000); /*显示一行字符*/ void lcd_show_text(char *

24、text) int i; for(i=0;istrlen(text);i+) lcd_write_data(LCD_16207_0_BASE,texti); usleep(2000); void lcd_line1() lcd_write_cmd(LCD_16207_0_BASE,0X80); usleep(2000); /*换行,即切换到第二行*/ void lcd_line2() lcd_write_cmd(LCD_16207_0_BASE,0XC0); usleep(2000); int main() char text116=Wu Qin De Shi; char text216=Ji

25、e,Wu Qin De Ni; lcd_init();/液晶初始化 while(1) /*切换到第一行*/ lcd_line1(); /*显示第一行字符*/ lcd_show_text(text1); /*切换到第二行*/ lcd_line2(); /*显示第二行字符*/ lcd_show_text(text2); usleep(4000000); lcd_write_cmd(LCD_16207_0_BASE,0X01);/清屏 usleep(2000); /*切换到第一行*/ lcd_line1(); lcd_show_text(Liu Ya Li,); lcd_line2(); /*显示第

26、二行字符*/ lcd_show_text(I Love You!); usleep(4000000); return 0; 7.1602用NIOS II 的fprintf标准函数控制显示 /*硬件环境: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_162

27、07_0,w); /*1602液晶第一行显示的内容*/ fprintf(lcd,I love NIOS II!n); /*1602液晶第二行显示的内容*/ fprintf(lcd,I love you!); fclose(lcd);return 0; 8.综合例程 count_binary.h文件 #ifndef COUNT_BINARY_H_ #define COUNT_BINARY_H_ #include alt_types.h #include #include #include system.h #include sys/alt_irq.h #include altera_avalon_pio_regs.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1