基于ARM+Linux的异步串行通信设计

2010年04月09日 20:58    发布者:我芯依旧
1 引言

嵌入式系统是继IT网络技术之后。又一个新的技术发展方向。随着嵌入式技术及网络技术的发展,工业控制设备的网络功能要求越来越高,系统要求工业控制设备能够支持TCP/IP,以及其他Intenet协议,用户能方便的查看设备状态、设置设备参数、设备采集到的数据通过网络能及时的传送到windows或Unix/Linux服务器的数据库中。随着集成电路的发展.32位RISC处理器更是受到青睐,ARM是业界领先的16/32位嵌入式RISC处理器技术提供商,占领了全球75%的市场。它可为一个完整系统的开发提供全面的技术支持,其技术具有性能高、成本低和能耗省的特点。

本系统采用的是韩国三星公司生产的一款基于ARM920T内核的S3C2410x处理器,它采用五级流水线和哈佛结构,提供1.1MIPS/MHz的性能,内部有3个独立的UART控制器,每个控制器都可以工作在Interrupt(中断)模式或DMA(直接内存访问)模式,从而实现CPU和UART之间传送数据,并且每个UART均具有16字节的FIFO(先入先出寄存器),支持的最高波特率可达230.4Kbps。

2 系统的软硬件设计

在串行通信中,要保证数据传输的可靠性和稳定性,硬件设计是必不可少的,本系统选用S3C2410X作为核心器件,要完成最基本的串行通信功能,只需要RXD、TXD和GND即可,但由于RS232C标准所定义的高低电平信号与S3C2410X系统的LVTTL电路所定义的高低电平信号完全不同,LVTTL的标准逻辑“1”对应2-2.3v电平,标准逻辑'0’对应0-0.4V电平,而RS232C标准采用负逻辑方式,标准逻辑“1”对应-5~-15V电平,标准逻辑"0"对应+5~+15V,两者间通信必须经过信号电平的转换,目前常使用的电平转换电路为MAX232。该系统只设计了一路与URAT0相连的RS232C接口电路,通过9芯的D型插头,与外设可方便的连接,同时设计了数据发送与接收的状态指示灯LED,当有数据通过串口传输时,LED闪烁,便于用户掌握其工作状态,以进行软硬件调试。宿主机即计算机系统,在Linux操作系统下编写好串口通信程序,通过JTAG接口模块下载到目标机中,在相应的软件命令的控制下,通过串行接口线即可实现宿主机与目标机间数据的发送和接收。目标机中的电源模块提供了开发板所需的正常电压,各种数据信息可以通过液晶显示器显示出来,还可以通过键盘模块来实现对目标机的操作,外扩存储器模块可以由FLASH或SDRAM构成,其与S3C2410X的连接如图1所示


图1串口电路原理图

在软件系统方面,嵌入式Linux操作系统是整个嵌入式系统的核心,由于嵌入式系统存在内存容量和存储容量不足等问题,必须对Linux进行移植裁剪设计,主要涉及以下几个方面:

(1)建立开发环境,操作系统一般使用Redhat Linux,通过网络下载相应的GCC交叉编译器进行安装,或用厂家提供的相关交叉编译器。

(2)配置开发主机,配置MINICOM,一般的参数为波特率115200Baud/s,数据位8位,停止位1位,尤奇偶效验,软件硬件流控设为无。

(3)建立引导装载程序BOOTLOADER,该系统使用的是韩国Mizi公司开发的vivi,该引导程序目前只支持串口传输,将编译好的vivi通过Jflash软件烧录到开发板的FLASH中。

(4)内核的裁剪与移植。由于标准的Linux是面向PC的,它集成了许多PC所需要而嵌入式系统并不需要的,因此,在编译内核时可以卸载不必要的模块,这样可以使内核显著减少, 从而尽可能小的占用内存及存储宅间,使软硬件系统得到精简。

(5)虚拟内存机制的屏蔽,虚拟内存是导致现有Linux实时性不强的原因,可以通过屏蔽内核的虚拟内存管理机制米增强Linux实时性,更好的满足工业控制的要求,更改的途径有两种:一是通过POSIX,二是通过底层编程。

(6)设备驱动的编写。

(7)开发基于闪存的文件系统,应用程序和重要数据通常都是以文件的形式存放在闪存文件系统中。

(8)上层应用程序的编写。针对特定的系统应用环境,实现上层应用程序的功能并编写。基于篇幅的限制,这里只介绍驱动和应用程序的开发。

在Linux中几乎所有的设备都是文件,对设备驱动的访问也是以文件操作实现的,无论是字符设备还是块设备,用户对设备的操作都是通过虚拟文件系统转换为设备驱动与硬件操作例程的交互,虚拟文件系统为用户提供了一个统一的设备访问接口,使用户可以透明的访问设备驱动程序从而简化硬件的编写。所以对设备进行操作的调用格式与对文件的操作类似,主要包括open()、read()、write()、ioctl()、close()等。

串口驱动中最主要的就是中断函数的编写,该函数最主要的就是完成接收中断,发送中断和流控中断,由于S3C2410X中集成的UART控制芯片中带有FIFO,为了保证及时接收,接收中断必须循环处理接收字符直到接收FIFO为空。同时为了防止接收方被发送方淹没,接收缓冲区剩余空间不足时应立刻启动流控,设置RTS为0,等上层提取了缓冲区的数据,腾出足够的空间后在取消硬件流控,恢复接收。对于发送。为了减少发送中断的产生次数,也采用在一次中断服务中,循环发送字符直到软件缓冲区为空的方法。但是在提取发送缓冲区的数据时需要注意判断软件信号量nSemaTxGet的值,以防止缓冲区征用。流控中断处理中,首先要判断流控类型是停止发送还是允许发送,只需简单的将软件标志nTxStop设置为1即呵;若为允许发送,除了要将nTxStop设置为0,还要主动从发送缓冲区中取出一个字符发送,以触发发送空中断,使硬件立刻恢复发送。其主要流程图如下所示:


图2串口中断服务流程图

将编写好的中断函数用request_irq()函数注册到驱动程序中,然后将驱动程序serial.c编译进内核。其方法为:

(1)改动serial.c源代码,新建函数int init_serial(void),将设备注册到此处:result=register_chrdev(92.“serial", &serial_fops);

(2)将serial.c复制到../drivers/char目录下,并且在../drivers/char下的men.c的intchr_dev_init()函数中增加如下代码:

#ifdef CONFIG_TESTDRIVE
init__serial();
#endif

(3)在~/drivers/char目录下的Makefile中增加以下代码:

ifeq($(CONFIG_TESTDRIVE).y)
L_OBJS+=serial.o
endif

(4)在../arch/m68knommu目录下config.in字符设备里增加如下代码:

Bool‘support for testdrive’CONFIG_TESTDRIVE Y

(6)在../dev/目录下创建串口设备:mknod/dev/serial1 c 92 0c表示是字符设备,92是设备号,0是次设备号。到此已将串口的驱动程序添加到Linux的内核中,将编译好的内核莺新下载到开发板上就可以使用串口驱动程序了。

3 目标板与宿主机间通信的实现

(1)打开串口

打开串口和打开普通文件一样,使用的函数同打开普通文件一样,都是open函数fd=open ("/dev/ttyS0”,O_RDWR | O_NOCTTY | O_NDELAY),接下来可恢复串口的状态为阻塞状态,用于等待串口数据的读入,可用fcntl函数实现,如下所示:

fcntl(fd,F_SETFL,0);

再接着可以测试打开文件捕述符是否引用一个终端设备,以进一步确认串口是否打开,如下所示:isatty(STDIN_FILEN0);该函数调用成功则返回0,若失败则返回-1。

(2)读写串口

读写串口操作和读写普通文件一样,使用read(),write()函数即可。其流程网如下所示:


图3串口读写流程图

将读串口程序在PC机上编译,写串口程序交叉编译,分别得到宿主机与目标机的可执行文件,将写串El程序通过Linux下的串口通信软件Minicom下载到S3C241x0开发板上或将其制作成文件系统烧写到目标板上,先运行读串口程序,再运行写串口程序。最后成功的实现了目标板与宿主机之间的通信。

4 结束语

如今,把嵌入式Linux内核嵌入到32位MCU中,通过构造TCP/IP多种网路协议和基本的通信协议,在利用嵌入式操作系统对底层硬件和网络协议的支持,以及对内核和虚拟内存机制进行改造,可以保证系统的可靠性和实时性.具有广阔的应用前景,而且具有开发周期短,系统性能稳定可靠,适应性强等特点。

本文作者创新观点:本文采用的基于ARM+Linux的系统,可以方便的移植操作系统,实现实时高速数据互访,扩展应用程序,所有数据町以便捷,可靠的传输到远端。



作者:陈佳男,李欣,张海燕      来源:《微计算机信息》(嵌入式与SOC)2009年第3-2期