APP下载

基于NIOS II系统的异步串行通信功能的实现

2011-08-20颜丽莎朱力宏

郑州铁路职业技术学院学报 2011年3期
关键词:波特率寄存器字符

颜丽莎 朱力宏

(郑州铁路职业技术学院,河南 郑州 450052)

NIOS II系统是Altera公司推出的32位RSIC嵌入式处理器。它具有完善的软件开发套件,包括编译器、集成开发环境、JTAG调试等,设计者能够用Altera Quarter II开发软件的SOPC Builde系统开发工具创建处理器系统,并能够根据需求添加其组件。[1]

通用异步收发器(UART),是嵌入式系统上很常用的一个串行接口,由于其方便、简单、易用等特性,在嵌入式系统中扮演着十分重要的角色。UART通过电平转换可实现RS232、RS485、RS422等工业标准的接口,在相关工业控制通信中应用十分广泛。UART通信主要通过RXD和TXD两条信号线,即可实现全双工串行通信。

在一些应用中,往往需要两三个甚至多个串口,选用现成的MCU方案,显然很难满足需求。由于UART作为一个组件与其相关外设的IP放在SOPC Builder里,可供用户直接调用。因此,基于FPAG芯片的NIOS系统,可根据需求方便地配置出多个,甚至是几十个串口,而且可任意分配引脚。因此,讨论和采用NIOS II系统实现串口通信功能具有重要的实际意义。

在以往的关于基于NIOS II系统串口使用的文章中,往往只针对于寄存器控制等某一细节问题进行讨论。实际使用中,串口的软件控制可以通过HAL系统库、寄存器等几种不同的控制方法实现。其每一种方法又各有优劣,适合于不同的应用场合。本文从NIOS II系统中串口硬件定制入手,重点讨论几种不同软件控制方法的实现及特点,并提供了详细的例程代码,为NIOS II系统的使用开发者提供设计参考。

1 硬件设计

本设计中要实现带NIOS II的FPGA系统与其它系统间的串行通讯,首先要建立硬件连接。在硬件设计中,通常采用接口芯片MAX3232构成RS232硬件电路实现不同系统间的电平匹配。

在Quartus II中新建工程,将图形设计作为顶层文件,通过SOPC将NIOS II系统模块建立到顶层文件中。NIOS II处理器提供了丰富的外围设备,可以根据需求在SOPC Builder中添加,其中主要包括UART串口IP核。

UART核实现了基于FPGA的嵌入式系统与外部器件之间的串行字符流通信。该核可实现RS-232协议,提供可以调节的波特率、校验、停止/数据位,以及可选的RTS/CTS控制信号,用户可以根据需要配置该核。

UART核提供了一个简单的寄存器映像Avalon从端口,它允许Avalon主外设(如NIOS II处理器)简单地通过读和写控制寄存器与该核实现通信。

该核可直接由SOPC Builder工具创建,创建完成后的接口信号有RXD、TXD、CTX和RTS(其中后两项可选)。定制时,可通过配置对话框设定UART核的各项参数。

主要参数有:

(1)波特率设置选项

UART核可以实现RS-232的所有标准波特率。波特率可以设定为固定波特率和可变波特率。当设定为固定波特率时,通过下拉框可选115200/9600等,不能通过软件修改。可变波特率可以通过写divisor寄存器设定分频值,来改变波特率值。

(2)数据位、停止位和奇偶校验位设置

这些参数只能在配置系统创建时设置,不能在系统生成后通过写相应的寄存器修改。

(3)流控制

当流控制选项Include CTS/RST pin& contro lregister bits选中时,UART核的cts、dcts、rts、idcts等寄存器位直接反映流控制信号,如果该选项未被选中时,这些状态位总是读为0。

UART核中的Avalon接口可选择实现流传输模式。这允许主设备仅在UART准备接收一个字符时写数据,且仅在UART有效数据时读数据,当选项Include end-of-packet register是on状态时,UART核可以结束一个与主设备之间的流模式数据传输。它能自动将接收的字符写到存储器中,直到RxD端接收到一个指定的字符为止。结束字符由endofpacket寄存器决定。

2 软件编程

建立硬件IP核完成硬件设计以后,在NIOS II集成开发环境里,通过软件编程及设置实现UART的控制。对于NIOS处理器用户来说,我们总结了有下列三种控制UART的编程方法。

2.1 采用HAL系统库驱动

用户可以使用ANSI C标准库函数访问UART核,例如printf()和getchar()等。ioctl()请求允许HAL用户直接控制UART核与硬件相关的功能。

HAL系统库API支持对UART核功能部件的完全访问。NIOS II程序把UART核看成是一个字符模式设备,使用ANSIC标准库函数发送和接收数据。

下面的代码是一个最简单的串口通信程序,具体功能是使用printf函数将一个字符显示到stdout设备上。

需要注意的是,这个例子中的SOPC Builder系统包含了一个名为uart0的UART核,采用这种方法的UART编程,要在NIOS II IDE的工程配置选项中将所使用的串口设备uart_0配置为stout。这种方法最简单,代码最少。但是缺点:1.效率较低;2.由于占用了stout等通道,调试时,无法用jtag_uart通过NIOS II内部控制台打印信息。

2.2 采用C标准库函数调用

通过使用C标准库函数对UART设备完成特定字符操作,这是对串口UART核的标准使用方法。如下面实例:

在本例中,SOPC Builder系统包含了一个名为uart1的UART核,该核不需要配置为stdout设备,程序中把UART设备作为HAL系统支持的文件类型打开并使用标准的文件操作函数对UART核进行读写。[2]

这种方法将串口作为一个设备调用,代码相对简单,但运行效率较低,适用实时性要求不高的场合。

2.3 通过UART寄存器操作。

NIOS II软核的串口直接读写寄存器方式的编程方法,与C语言的标准输入/输出语句相比,可极大地缩短程序执行时间,并使得CPU能同时处理其他事务。

头文件“altera_avalon_uart_regs.h”中定义了UART寄存器映射。[3]如下为根据寄存器实现UART功能的驱动程序uart.h文件的节选:

这段程序采用寄存器控制的方法实现了单个字节的发送。

这种方法采用寄存器直接控制串口,程序较为复杂,但执行效率最高,时间最短。

在Nios IDE集成开发环境中将程序进行编译和仿真后,可直接通过JTAG下载线进行在线Debug调试,也可利用Flash烧写工具Flash programer,通过JTAG下载接口,将*.pof文件和*.jdi文件烧写到片外Flash中后,实现脱机工作。最后将系统与计算机RS232串口相连通过串口调试助手进行通讯实验。

3 串口通信调试

在NIOS II中调试“Hello world!”的范例的时候,经常会出现这样的错误:nios2 terminal:can't open uart:Permission denied。这是因为在调试程序时,打开了另外的串口调试工具,或者认为是串口侦听器。实际上NIOS II中已经集成了串口调试工具(串口侦听器)。

在任务管理器中nios2 terminal.exe就是这个侦听串口的进程。所以,如果用NIOS II来观察发送的数据,就不要用其他的串口调试工具。如果在编译之前就打开了其他的串口侦听器,编译链接的时候就会出现上述的错误。而在程序编译链接后再去打开其他的串口侦听器,串口就会因为nios2 terminal.exe占用而无法打开。

解决的方法,如果想用NIOS IDE观察的话就不要事先打开其他的串口调试工具。而如果想用其他的串口调试工具来观察数据,通过下载器将FPGA配置文件下载到板子后,删除任务管理器中的nios2 terminal.exe,然后打开串口调试工具。如果程序没有问题,运行后就可以看到数据。[4]

[1]黄佳玮,陈福深.基于NIOS II的SOPC嵌入式系统设计[J].电子元器件应用,2009,(7):48-51.

[2]王刚,张潋.基于FPGA的SOPC嵌入式系统设计与典型实例[M].北京:电子工业出版社,2009:255-265.

[3]唐佳,杨路明.FPGA通用数字信号处理实验板的设计与实现[J].科技创新导报,2010,(18):29-30.

[4]李锐.基于嵌入式NIOS II软核的串口直接读写寄存器方式编程[J].西安:现代电子技术,2010,(14):37-39.

[5]杨英强.一种基于FPGA的UART电路实现[J].现代电子技术,2005,(12):82-84.

猜你喜欢

波特率寄存器字符
UART 波特率检测电路的FPGA 设计算法与实现
STM32和51单片机寄存器映射原理异同分析
CAN 总线波特率自适应程序设计
Lite寄存器模型的设计与实现
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
HBM电子称与西门子S7-200系列PLC自由口通讯
可以同时应用于不同终端设备的波特率发生器
移位寄存器及算术运算应用