1、六JTAG UART内核实验2.2 JTAG UART内核实验1.实验目的(1)熟悉JTAG UART内核结构;(2)熟悉用C标准库函数访问JTAG UART;(3)熟悉用HAL API访问JTAG UART;2.实验现象 (1)简单应用实验:在信息栏打印“Hello from Nios II!”(2)C标准库实验:根据用户从Nios II IDE窗口“Console”栏输入04Nios II系统执行不同的操作,0-两个灯全灭,1-第一个灯亮,2-第二个灯亮,3-两个灯全亮,4-退出;若实验板上的第1个键按下,信息栏显示“Key1 was pressed”,第2个键按下,信息栏显示“Key2
2、was pressed”。(3)HAL API实验:根据用户从Nios II IDE窗口“Console”栏输入04Nios II系统执行不同的操作,0-两个灯全灭,1-第一个灯亮,2-第二个灯亮,3-两个灯全亮,4-退出。3.实验原理 实验原理如图2.2.1所示,Quartus II顶层原理图如图2.2.2所示。JTAG UART和Jtag Debug Module实际上是通过JTAG 集线器连到JTAG控制器上再与电脑相连。带Avalon接口的JTAG UART设备实现PC与Nios II系统间的串行通信。在许多设计中,JTAG UART常取代RS-232通信设备,用于字符的输入和输出。与
3、UART设备不同的是,JTAG UART是通过JTAG接口来传输数据的。用户可以通过HAL API和ANSI C标准库访问JTAG UART。图2.2.1由图2.2.1我们可以得到如表2.2.1所示的外设一览表:表2.1.1外设名称描述备注cpuNios II/e Debug Module=Level1sysid系统ID系统的唯一标识sdramCustom,Row=12,Column=8Data width=16,Banks=4flashCustom,Address width=21Data width=8三态桥Registeredled_pioPIO,2 bits,output only根据
4、用户输入显示keyPIO,2 bits,input only下降沿中断, 使能边沿捕获jtag_uart使用默认设置图2.2.24.实验内容(1)在Quartus II中建立一个工程;(2)使用SOPC Builder建立生成一个具有表2.2.2所示元件的Nios II硬件系统;(3)在Quartus II工程中添加PLL;(4)建立基于Nios II的硬件系统并编译生成配置文件*.sof;(5)在Nios II IDE中建立对应硬件系统的Nios II C/C+ Application,编写通过ANSI C标准库访问JTAG UART设备的程序并验证;(6)再建立一个Nios II C/C+
5、 Application,编写通过HAL API访问JTAG UART设备的程序并验证;5.实验步骤硬件系统的搭建不再详细介绍,整个系统如图2.2.3所示。JTAG UART内核的详细构造参考“附录四Volume 5 Embedded Peripherals”。图2.2.31)添加JTAG UART在可用元件列表里双击JTAG UART(图2.2.4),不更改弹出的设置对话框的参数(图2.2.5),因为默认参数可以使面积和速度实现相对均衡。图2.2.42)通过ANSI C标准库访问JTAG UART首先我们使用Nios II IDE提供的Hello World模板(图2.2.6)实现一个最简单
6、而又经常用到的JTAG UART应用。系统库属性中将stdout、stdin、stderr均选为jtag_uart(图2.2.7)。程序如下所示,运行结果如图2.2.8所示。图2.2.5/* * Hello World example. * * This example prints Hello from Nios II to the STDOUT stream. It runs on * the Nios II standard, full_featured, fast, and low_cost example * designs. It runs with or without the
7、MicroC/OS-II RTOS and requires a STDOUT * device in your systems hardware. * The memory footprint of this hosted application is 69 kbytes by default * using the standard reference design. * * For a reduced footprint version of this template, and an explanation of how * to reduce the memory footprint
8、 for a given application, see the * small_hello_world template. * */#include int main() printf(Hello from Nios II!n); return 0;图2.2.6图2.2.7图2.2.8下面所示程序将演示另一个稍为复杂的应用,程序注释得比较清楚,不再详细介绍,有关C标准库函数(fprintf(),fwrite(),getc()等)请读者自查阅相关书籍。运行结果如图2.2.9所示。/*版权声明* * 新疆大学信息科学与工程学院创新实验室 * 文件名: JTAG_CLib.c * 创建者: 吴占
9、敏 * 创建日期: 2010.4.30 * 校验者: * 校验日期: * 版本号: V1.0 * 功能描述: 使用C库函数访问JTAG UART设备。1、在IDE的Console栏打印 * 菜单信息,操作者通过电脑键盘输入04五个数字中的一个控制 * 实验板的LED灯开关状态;2、若有实验板上的按键按下,则在 * Console栏打印按键信息。 */#include #include #include system.h#include altera_avalon_pio_regs.h#include sys/alt_irq.h#include alt_types.h/* 名 称:KeyEdge
10、_Isr()* 功 能:下降沿触发中断服务子程序*/ void KeyEdge_Isr(void* context,alt_u32 id) /清边沿捕获寄存器 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0); /两个键共用一个中断,所以应把按键的状态读回以判断是哪一个键触发的中断 alt_u8 key_state = 0; key_state = IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE); key_state &= 0x03; switch(key_state) case 0x01:/第1个按键 /重要说明:为了验证方便
11、在中断服务子程序里使用了printf()函数, /实际应用时不建议在中断服务子程序里使用C标准库函数 printf(key1 was pressed.n); break; case 0x02:/第2个按键 printf(key2 was pressed.n); break; default:break; /* 名 称:PIO_Init()* 功 能:PIO口初始化,注册中断服务*/ void PIO_Init(void) /中断使能 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE,0xff); /清边沿捕获寄存器 IOWR_ALTERA_AVALON_PIO_
12、EDGE_CAP(KEY_BASE,0); /LED初始化,全灭 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,3); alt_irq_register(KEY_IRQ, NULL, KeyEdge_Isr);/* 名 称:main()* 功 能:使用C库函数访问JTAG UART设备。*/int main() char prompt = 0;/实时存储输入信息 FILE* fp;/文件指针,指向JTAG UART char* msg = Please Enter Your Choice:n; PIO_Init(); /以文件读写方式打开JTAG UART设
13、备 fp = fopen(JTAG_UART_NAME,r+); if(fp) /打印菜单信息 fprintf(fp,Menu:n); fprintf(fp,0:All LED Offn); fprintf(fp,1:LED1 Onn); fprintf(fp,2:LED2 Onn); fprintf(fp,3:All LED Onn); fprintf(fp,4:Exitn); /该句fprintf(fp,Please Enter Your Choice:n); /=printf(Please Enter Your Choice:n); fwrite(msg,strlen(msg),1,fp
14、); while(prompt != 4)/若输入4表示结束操作 prompt = getc(fp);/通过JTAG UART读取一个字符 switch(prompt) case 0:/两个LED均灭 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x03); break; case 1:/第1个LED亮 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x01); break; case 2:/第2个LED亮 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x02); break; ca
15、se 3:/两个LED均亮 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x00); break; default:break; if(ferror(fp) /检查错误是否与文件指针一起出现,若是,则清除 clearerr(fp); fprintf(fp,Exit.n); fclose(fp); else printf(Open JTAG UART failed.n); return 0;图2.2.93)使用HAL API访问JTAG UART 详细程序如下所示,通过HAL API访问JTAG UART主要用到了几个具有UNIX风格的IO操作函数(writ
16、e(),open(),read()等),有关这几个函数的详细使用方法请参考“附录五NiosII software developer”。运行结果如图2.2.10所示。/*版权声明* * 新疆大学信息科学与工程学院创新实验室 * 文件名: JTAG_API.c * 创建者: 吴占敏 * 创建日期: 2010.5.1 * 校验者: * 校验日期: * 版本号: V1.0 * 功能描述: 使用HAL API访问JTAG UART设备。在IDE的Console栏打印 * 菜单信息,操作者通过电脑键盘输入04五个数字中的一个控制 * 实验板的LED灯开关状态。 */#include #include #
17、include #include system.h#include unistd.h#include altera_avalon_pio_regs.h /* 名 称:main()* 功 能:使用HAL API访问JTAG UART设备。*/int main(void) int fd; int count; char *menu = Menu:n; char *choice0 = 0:All LED Offn; char *choice1 = 1:LED1 Onn; char *choice2 = 2:LED2 Onn; char *choice3 = 3:All LED Onn; char *
18、choice4 = 4:Exitn; char *msg = Please Enter Your Choice:n; char *buf; fd = open(JTAG_UART_NAME, O_RDWR); /以可读写方式打开设备文件 if (fd 0) /打开失败 printf(Open JTAG UART failed.n); return 1; /打印菜单信息 write(fd,menu,strlen(menu); write(fd,choice0,strlen(choice0); write(fd,choice1,strlen(choice1); write(fd,choice2,s
19、trlen(choice2); write(fd,choice3,strlen(choice3); write(fd,choice4,strlen(choice4); write(fd,msg,strlen(msg); while(*buf != 4) count = read(fd,buf,1); /读入数据,读者可以观察一下count的值 write(fd,buf,count); /输出读入数据 switch(*buf) case 0:/两个LED均灭 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x03); break; case 1:/第1个LED亮 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x01); break; case 2:/第2个LED亮 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x02); break; case 3:/两个LED均亮 IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x00); break; default:break; printf(nExit.); close(fd);/关闭设备 return 0; 图2.2.10
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1