您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术嵌入式系统中实时时间的获取 正文
嵌入式系统中实时时间的获取

嵌入式系统中实时时间的获取

点击数:7457 次   录入时间:03-04 11:35:11   整理:http://www.55dianzi.com   嵌入式系统-技术

  O 引言

  许多长时间无人值守的监控系统中,数据到来的时刻是不可预知的,数据及其出现时的时间信息要一并记录下来,以便后期的处理和查阅。在智能交通系统中,以交叉路口的闯红灯自动抓拍系统为例,系统抓拍的闯红灯车辆的图片中就要包含抓拍的时间信息,以作为日后交警进行违规处罚的有力证据。以往的自动抓拍系统都是用工控机搭建的,在其工控主板上有 时钟芯片 和板载电池,即使断电也不会丢失 实时时间 信息。但是,作为硬件资源丰富的通用型工业控制计算机,在具体的控制系统中,往往会有许多硬件资源被闲置,使得成本偏高。随着 嵌入式 技术的发展和逐步成熟,为了节约成本和提高系统的可靠性,大有用嵌入式取代通用型工控机的趋势。这就提出了一个问题:在嵌入式系统中,实时时间从何获得。

  本文将给出两种在嵌入式系统中获取实时时间的设计方法:使用时钟芯片方法和使用 GPS 接收机方法。

  1 使用时钟芯片获取实时时间

  在这种方案中,实时时钟芯片以美国DALLAS公司推出的 DSl302 芯片为例,嵌入式平台选用ATMEL的基于ARM920T内核的AT9lRM9200微处理器配以Linux一2.6.13嵌入式操作系统。

  1.1 时钟芯片概述

  DIP封装的DSl302共有8个引脚,VCCl和Vcc2分别是主电源引脚和备用电源引脚,当Vcc2>Vccl+0.2V时,由备用电源向时钟芯片供电。X1、X2是晶振连接引脚。GND接地。剩下的三个引脚用于与微控制器通信,它们是RST、SCLK、I/O。

  DSl302内部有31字节的静态RAM可用于记录重要数据、共有12个寄存器其中有7个用于存储时间和日期。更为详细的资料,可以参考DSl302的芯片手册。下面就DSl302读写操作中应注意的几点列举如下:

  1、所有的数据传送均是以发送8位的指令字节开始。指令字节的最高有效位(位7)必须是逻辑l,如果它为O,则不能把数据写入到DSl302中。

  2、RST输入引脚的两种功能:(1)接通控制逻辑,允许地址/命令序列送入移位寄存器:(2)提供了终止单字节或多字节数据传送的手段。当RST为高电平时,所有的数据传送使能,允许对DSl302进行操作。如果在传送过程中RST被置为低电平,则会立即终止此次数据传送,并且I/0引脚变为高组态。

  3、当把RST驱动至逻辑l时,SCLK必须为逻辑0。

  1.2 硬件电路设计

  DSl302采用双电源方式,系统正常工作时由板载电源统一供电,当系统断电或复位时由板载电池供电,以保证时钟芯片始终处于运行状态。

  微控制器AT9lRM9200的PBO、PBl0、PBll三个引脚用于与时钟芯片进行同步串行通信,因为这三个引脚在AT9lRM9200内部都是多功能复用的,所以在DSl302设备驱动程序的初始化代码中首先要把它们配置成通用I/O口。关于晶体振荡器,DS1302的芯片资料指出:32.768KHz的晶振可以直接连接到X1、X2引脚,同时外接晶振电路要有6PF的负载电容与内部震荡器配合运行。所以,在电路设计时X1、X2两引脚分别连接一个15pF的电容至地。硬件连接,如图1所示:

DSl302与处理器的连接

  1.3 Linux 下OSl302驱动程序设计

  Linux系统中有三种类型的设备:字符设备、块设备和网络设备。字符设备是指发送和接收数据以字符的形式进行,无需缓冲直接存取,在对字符设备发出读写请求后,实际的硬件I/0随即发生;而块设备则是对数据缓冲区进行读写并可以随机访问,操作是以块为单位。而网络设备与字符设备、块设备有很大的不同,用于对网络设备的控制和管理。DSl302显然属于字符设备。

  2.6版本的Linux内核和2.4版本存在很大的不同,在模块的开发和设计上也是如此。在这里使用的内核版本是Linux一2.6.13。首先,驱动程序作为一个模块可以动态加载进内核也可以动态的从内核中卸载掉,在加载和卸载的过程中实际伴随的是驱动程序向内核的注册与注销。在驱动程序的代码中会有两个函数分别在模块加载和卸载过程中调用DSl302_init()、DSl302_exit(),在其中再调用register_chrdev()、unregister_chrdev()用以向内核注册和注销一个设备驱动程序。在2.6内核版本中,用如下方法声明这两个函数给内核:

  Module_init(DS1302_init):

  Module_exit(DSl302_exit):

  在DSl302_init()函数中除调用字符设备的注册函数外,还有一个重要任务,就是配置需要用到的三条I/0口线:PBO、PBl0、PBll。配置过程包括:B端口控制器时钟使能、通用I/O口使能、输出使能、上拉电阻使能、三个口线上的同步数据输出使能,另外通过置PIOB_CODR寄存器使三个引脚输出低电平。代码如下:

程序



www.55dianzi.com

  其中va_sys是一个结构体,包含了AT9lRM9200处理器内的全部寄存器,通过一条语句:AT91PS_SYS va_sys=(AT91PS SYS)AT91C_VA_BASE_SYS,把所有寄存器的最低地址赋给va_sys,这样结构体中的寄存器名称就和实际的地址对应起来了。注意:这里用到的地址都是经过映射过的虚拟地址,在实际运行中会通过处理器内部的MMU单元转换为实际的物理地址发往地址总线。上述代码中的AT91C_PI0_PBO等等是一些常数的宏定义用于寄存器赋值,比如:#define AT9lC_PIO_PBO(1<<0),它们定义在AT91RM9200.h头文件中。

  在驱动程序中,file_operations是一个重要的结构体,通过它把针对设备的具体操作注册给内核的统一接口。结构体中全是函数指针, DSl302 驱动程序中用到的函数有:open、release、ioctl,用于设备的打开与释放、设备的读写以及设备的控制。对DSl302的读写都是在dsl302_ioctl()中调用相应的读写函数实现的。

  下面具体分析一下驱动程序中向DSl302发送单个字

程序

  代码中用到的at91_set_gpi0_value()函数定义在内核的Gpio.c文件中,最终是对10控制器的PIO_SODR(置位输出数据寄存器)或PIO_CODR(清零输出数据寄存器)赋值以使相应引脚输出需要的电平。

  经过测试,短时间内误差不明显,但 时钟芯片 存在积累误差并且易受环境影响,连续几天运行下来,误差有数秒之多。所以, 嵌入式 系统需要通过某种方法定期使用标准时间向时钟芯片对时,以消除误差。下面要介绍的 GPS 接收机方案就可以做到这点。

  2 从GPS接收机获取 实时时间

  GPS是美国开发研制的最初主要作为军用的一种全球定位系统,有三个部分组成:空间部分、地面监控部分和用户部分。一般来说,在地面上的GPS接收机能接收5~12个卫星信号,而为了获得地面上的定位坐标,至少需要4颗卫星的信号,三个用来确定GPS接收机的纬度、经度和海拔高度,第四个则提供同步校正时间。

  GPS接收机只要处于工作状态就会源源不断地把计算出的GPS导航定位信息通过串口传送到计算机中。GPS接收机送出的数据都是格式化的,NMEA一0183协议是GPS接收机应当遵循的标准协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。下面介绍下如何从符合NMEA—0183协议的接收机接收数据中提取时间信息。

  接收机通过串口发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有“$GPGGA”、“$GPGSA”、“$GPGSV”以及“$GPRMC”等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从“$GPRMC”帧中获取得到,该帧的结构及各字段释义如下:

  $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh<CR><LF>

  <1>当前位置的格林尼治时间,格式为hhmmss

  <2>状态,A为有效,V为接收警告,即当前天线视野上方的卫星个数少于3颗。

  <3>纬度,格式为ddmm.mmmm

  <4>标明南北半球,N为北半球、S为南半球

  <5>径度,格式为dddmm.mmmm

  <6>标明东西半球,E为东半球、W为西半球

  <7>地面上的速度,范围为0.ON999.9

  <8>方位角,范围为000.O到359.9度

  <9>日期,格式为ddmmyy

  <lO>地磁变化,从000.0到180.O度

  <ll>地磁变化方向,为E或W

  在Linux操作系统中,从$GPRMC数据帧中提取时间信息的代码如下:

程序

[1] [2]  下一页


本文关键字:嵌入式  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术