GPS解析程序

来源:互联网 发布:java中框架的作用 编辑:程序博客网 时间:2024/06/07 09:46

绪   论

全球卫星定位系统简称GPS系统,是美国国防部历时二十年,耗资200多亿美元建立起来的可以全天候高精度的定位系统,通过定位卫星网络向全球各地全天候地提供三维位置、三维速度等信息的一种无线电导航定位系统。接收机通过对接收到的每颗卫星的定位信息的解算,便可确定该接收机的位置,从而提供高精度的三维(经度、纬度、高度)定位导航及授时系统。由于刚开始GPS只限于军事用途,民用受到人为精度的限制(SA)。直到2000年5月1日起美国政府取消SA限制后,大大地促进了民用普遍化,现已逐步演变为一种世界性高技术产业,成为目前世界上发展最快的三大信息产业之一。

GPS用户接收系统主要由以无线电传感和计算机技术支撑的GPS卫星接收机和GPS数据处理软件构成。GPS卫星接收机的基本结构是天线单元和接收单元两部分。天线单元的主要作用是:当GPS卫星从地平线上升起时,能捕获、跟踪卫星,接收放大GPS信号。接收单元的主要作用是:记录GPS信号并对信号进行解调和滤波处理,还原出GPS卫星发送的导航电文,解求信号在站星间的传播时间和载波相位差,实时地获得导航定位数据或采用测后处理的方式,获得定位、测速、定时等数据。微处理器是GPS接收机的核心,承担整个系统的管理、控制和实时数据处理。目前,国际上已推出几十种测量用GPS接收机,各厂商的产品朝着实用、轻便、易于操作、美观价廉的方向发展。GPS数据处理软件是GPS用户系统的重要部分,其主要功能是对GPS接收机获取的卫星测量记录数据进行“粗加工”、“预处理”,并对处理结果进行平差计算、坐标转换及分析综合处理。解得测站的三维坐标,测体的坐标、运动速度、方向及精确时刻。GPS定位技术是正在发展中的高新技术,数据处理技术也处在不断更新之中,各系列GPS接收机制造厂家研制的处理软件也各具特色。GPS 接收机是被动式全天候系统,只收不发信号,故不受卫星系统和地面控制系统的控制。用户数量也不受限制。GPS接收机的性能因机种不同而有差异。 接收机根据用户不同的使用需要又可分为大地型GPS接收机和导航型GPS接收机两类。

1 GPS系统基本原理

1.1 GPS系统介绍

GPS卫星定位系统由三部分构成,一是地面控制部分,由主控站、地面天线、滥测站及通讯辅助系统组成。二是空间部分,由24颗卫星组成,分布在6个轨道平面。三是用户装置部分,由GPS接收机和卫星天线组成。地面主控站实施对GPS卫星的轨道控制及参数修正。GPS卫星网向地面发射两个频率的定位导航信息,其中包括两个定位码信号:即C/A码(供世界范围内的民用)及P码( 只供美国军方使用)。GPS接收机接收GPS卫星信号进行解算,即可确定GPS接收机的位置。

                               图 1

1.2 NMEA-0183数据格式

1.2.1  GPRMC(建议使用最小GPS数据格式)

GPS定位的数据格式为NMEA-0183数据格式。NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式。它是在过去海用电子设备的标准格式0180和0182的基础上,增加了GPS接收机输出的内容而完成的。目前广泛采用的是Ver 2.00版本。现在除少数GPS接收机外,几乎所有的接收机均采用了这一格式。为了有效地开发GPS-OEM芯片,必须熟练掌握这一格式。因此,下面介绍两种最常用的GN-77N输出语句格式。

a.GPS固定数据输出语句($GPGGA)这是一帧GPS定位的主要数据,也是使用最广的数据。

b. GPS推荐定位信息输出语句($GPRMC)。本实验是对此信号进行提取定位信息的,故对其格式列出如下:

Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息。

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

<1>  UTC 时间,hhmmss(时分秒)格式

<2>  定位状态,A=有效定位,V=无效定位

<3>  纬度ddmm.mmmm(度分)格式(前面的0 也将被传输)

<4>  纬度半球N(北半球)或S(南半球)

<5>  经度dddmm.mmmm(度分)格式(前面的0 也将被传输)

<6>  经度半球E(东经)或W(西经)

<7>  地面速率(000.0-999.9 节,前面的0 也将被传输)

<8>  地面航向(000.0-359.9 度,以真北为参考基准,前面的0 也将被传输)

<9>  UTC 日期,ddmmyy(日月年)格式

<10> 磁偏角(000.0-180.0 度,前面的0 也将被传输)

<11> 磁偏角方向,E(东)或W(西)

<12> 模式指示(仅NMEA0183 3.00 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

1.2.2  GPGGA

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

<1>  UTC 时间,hhmmss(时分秒)格式

<2>  纬度ddmm.mmmm(度分)格式(前面的0 也将被传输)

<3>  纬度半球N(北半球)或S(南半球)

<4>  经度dddmm.mmmm(度分)格式(前面的0 也将被传输)

<5>  经度半球E(东经)或W(西经)

<6>  GPS 状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算

<7>  正在使用解算位置的卫星数量(00-12)(前面的0 也将被传输)

<8>  HDOP水平精度因子(0.5-99.9)

<9>  海拔高度(-9999.9-99999.9)

<10> 地球椭球面相对大地水准面的高度

<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)

<12> 差分站ID 号0000-1023(前面的0 也将被传输,如果不是差分定位将为空)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2系统总体设计

2.1 DSP介绍

数字信号处理(Digital Signal Processing, DSP), 就是对信号的数字处理。它是利用数字计算机或专用数字硬件,对数字信号进行的一切变换或按预定规则进行的一切加工处理的运算就称为数字信号处理。DSP狭义理解为Digital Signal Processor数字信号处理器,广义理解可为数字信号处理技术。

2.2异步通信接口芯片TL16CTL16C550C

UART只是一个串行的异步接口它负责对要发送的数据进行格式化和对收到的数据进行译码。它对数据是打包发送和接收的,每一包数据前有一个起始位,末有一个或多个停止位。数据包里的数据是从低位到高位逐位进行发送的。为了对数据进行校验,有时还可以在数据里加上校验位。在没有数据发送或接收时,该数据线总是处于高电平。它有如下的一些特点:

(1)数据的长度可变,可以是 5位,6位,7位或 8位;

(2)波特率可变,位传输的速率可以通过编程来实现,在UART中有一个寄存器可以对主频时钟进行分频来产生相应的波特率;

(3)校验位的产生和检测,在发送一个字符的时候,UART在发送时在数据位的末尾上附加一个校验位,当接收这个字符的时候,就可以利用这个校验位来来检查在接收过程中有没有发生错误;

(4)可以设置中断,通过软件可以模拟当异步串口发送0的个数超过数据包的长度的时候(表明发送异常),可通过设置中断处理事件。

串行通信的流程图如图2所示。

图 2

    下面对TMS32F240和PC机通信有关的寄存器做一些简单介绍。

表1  TL16CTL16C550C的寄存器

寄存器

DLAB

A2

A1

A0

地址

操作

接收缓冲器RBR

0

0

0

0

00H

只读

发送缓冲器THR

0

0

0

0

00H

只写

中断使能寄存器IER

0

0

0

1

01H

读/写

中断标志寄存器IIR

X

0

1

0

02H

只读

FIFO控制寄存器FCR

X

0

1

0

02H

只读

线路控制寄存器LCR

X

0

1

1

03H

读/写

MODEM控制寄存器MCR

X

1

0

0

04H

读/写

线路状态寄存器LSR

X

1

0

1

05H

读/写

MODEM状态寄存器MSR

X

1

1

0

06H

读/写

暂存寄存器SCR

1

0

0

0

07H

读/写

低位除数寄存器DLL

1

0

0

1

00H

读/写

高位除数寄存器DLM

1

0

0

1

01H

读/写

线路控制寄存器(LCR)用来存放串行通信的二进制数据格式,LCR是一个8位寄存器,各位的定义如下:

D1D0:字长选择位,D1D0=00、01、10、11字长分别为5位、6位、7位、8位;

D2:停止位,D2=0停止位为1位,D2=1时,停止位数由D1D0决定,数据位为5、6、7、8位时,停止位分别为:1.5、2、2、2位;

D4D3:确定要不要奇偶校验以及奇偶校验的性质,D3=0不进行奇偶校验D3=l进行奇偶校验,D4=0进行奇校验,D4=1进行偶校验;

D5:奇偶校验附加位;D5D4D3=111,传送奇偶位后该位清零,D5D4D3=101,传送奇偶位后该位置1,D5=0时附加位无效;

D6:中断控制位,D6=1,强制SOUT引脚为空闲状态;

D7:波特率因子寄存器访问位(DLAB),D7=l访问波特率因子寄存器,D7=0访问其他寄存器。

两个8位波特率因子寄存器可构成一个16位波特率因子寄存器。TL16C55OC的内部波特率发生器可产生发送数据的时钟信号。

波特率因子可以通过下面的式子计算:

波特率因子=基准时钟频率/(16x波特率)

可以任意选择写入波特率因子的高字节和低字节的顺序,但写入前必须置线路控制寄存器(LCR)的D7(DLAB)位为1。写入波特率因子后应将线路控制寄存器的D7清零,以便访问其他寄存器。在外接晶振为3.6864MHZ时,几种常用的波特率所对应的波特率因子寄存器的值如表2:

表2  波特率设置

波特率(bps)

高位除数寄存器DLM

低位除数寄存器DLL

1200

00H

C0H

2400

00H

60H

4800

00H

30H

9600

00H

18H

19200

00H

0CH

38400

00H

06H

 

2.3 LCD显示

    (1) 12864液晶显示器硬件电路连接图如图3所示。硬件连接图主要由8位双向数据口,命令数据选择端以及读写选择端和使能端,还有2个左右半屏的片选脚,其中滑动变阻器是调节背光大小的,VCC和地之间接了个104的电容是是直流稳定输入。

                                                        图 3

(2) 12864液晶显示器的读操作时序图如图4所示。

       当读写选择脚为高电平时则为读操作有效,并且使能脚也要为高电平,在这2个脚同时为高电平的时候数据口上的数据才有效的从12864读出。

                              图 4 12864液晶读操作时序

(3) 12864液晶显示器的写操作时序图如图5所示。

       读写选择脚为低电平并且使能脚为高电平时数据才有效的写入12864液晶的控制器中。

                              图5 12864液晶写操作时序

(4) 12864液晶显示器的内部结构图如图6所示。

       12864大液晶的结构主要是128列64行矩阵式点阵构成。

                                                 图 6 内部结构图

2.4系统设计分析

2.4.1系统设计过程

    数据采集系统主要由串口、液晶显示器、键盘组成,分别完成接收GPS数据、显示信息、以及按键控制。所以必须掌握DSP的串口通信、液晶显示原理、按键扫描原理。

    串口接收数据主要是在实验8的基础上进行改进将接收到的数据进行存储,然后就是将接收下来的数据进行处理识别,先判断帧头部分再是各部分的参数信息。分别将他们提取出来然后放到液晶上显示。再这整个过程中按键就是控制接收哪部分信息以及液晶翻页功能。本系统中还加入中断按键响应。即实现数据的动态显示实时接收GPS的数据。

    TMS320VC5416与PC机通过TL16C550扩展RS232串口实现串行通讯,其原理图如图7所示。

                                                    图 7

2.4.2 系统设计原理图

首先要实现数据的传出过程,了解串口通信,因为平时实验有这个实验所以上手就比较快了。接收模块主要由GPS接收机、数据处理软件以及相应的用户设备所组成。其主要完成接收卫星信号,从而获得导航或定位信息,经数据处理,完成导航和定位工作。整个系统框架图如下图8所示。

图 8接收模块整体结构图

对本次课程设计来讲,DSP模块是最重要的部分,就是通过DSP模块来对从串口接收到的定位信息来进行处理,提取其中的参数,这些处理都是通过编写程序然后下载到DSP实验箱来实现的。DSP系统的架构图如下图9所示。

                  图 9 DSP接收显示系统框图

因为DSP实验箱上有键盘,可以通过对键盘的操作来实现数据的显示,所以必须要设计键盘操作程序来定义键盘上某些键的功能,从而更方便的来控制数据的显示。因为经过DSP模块处理后的参数需要在实验箱上的LCD上显示,显示时需要对显示的内容在LCD屏上进行行和列的排列,设置不好的话可能会出现有些参数无法显示的情况,所以LCD显示模块的设置是必须的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 系统硬件的具体设计方案

DSP系统的硬件设计又称为目标板设计,是在考虑算法需求、成本、体积和功耗核算的基础上完成的。一个基本的DSP硬件系统应包括DSP的基本工作电路及各种外围接口电路设计。由于本次课程设目计的题是基于DSP数据提取,所以只涉及到DSP的串口接口电路以及12864液晶显示电路。

3.1 电源、复位、时钟电路

3.1.1 电源电路的设计

为了降低芯片的功耗,TMS320C54x系列芯片大部分都采用低电压设计,并且采用双电源供电,即内核电源CVDD和I/O电源DVDD。通常I/O都采用3.3V电压供电,而内核为1.8V供电。

目前,生产电源的芯片比较多,如Maxim公司的MAX604、MAX748,TI公司的TPS71xx系列、TPS72xx系列和TPS73xx系列等。这些芯片可分为线性芯片和开关芯片两种,在设计中要根据实际的需要来选择。如果系统对功耗要求不高时,可使用线性稳压芯片,其特点是使用方法简单,电源纹波电压较低,对系统的干扰较小。若系统对功耗要求较苛刻时,应使用开关电源芯片。通常情况下开关电源芯片的效率较高,可以达到90%以上,但开关电源所产生的纹波电压较高,且开关振荡频率在几千赫兹到几十万赫兹以上,易对系统产生干扰。

本次设计采用的电源芯片是TI公司提供的TPS73HD318两路电源输出芯片,其两路输出分别为3.3V和1.8V,每路电源的最大输出电流为750mA。电路如图10所示。

图10 电源电路设计

图中C7、C8、C9、C10分别为各旁路上的退偶电容,用于滤除直流电源中的杂波信号,使电源更稳定。

3.1.2 复位电路设计

C54x的复位输入引脚RS为处理器提供了硬件初始化的方法,它是一种不可屏蔽的外部中断,可在任何时候对'C54x进行复位。当系统上电后RS应至少保持5个时钟周期的低电平,以确保数据、地址和控制线的正确配置。复位后,CPU从程序存储器的FF80H单元取址,并开始执行程序。

TMS320C54x的复位可以分为软件复位和硬件复位两种。软件复位是通过指令方式实现芯片的复位,而硬件复位是通过硬件电路实现复位。此次设计所使用的复位电路如图11所示。

图11 复位电路

在初始状态,RS端为高电平,当按下复位按钮S1并持续一段时间(100~200ms)后,电容C1通过按键进行放电,使电容上的电压降为0,RS就可以持续一段时间的低电平,实现DSP芯片的手动复位。

3.2 异步通信接口电路设计

由于大多数型号的DSP芯片没有异步接收发送设备(UART)接口,如本次设计所用的TMS320VC5416,因此,我们采用了串并转换芯片TL16C550C以实现DSP与PC及之间的串口通信。

TL16C550C是TI公司生产的性价比很高的异步通信芯片,对从外围器件接收的数据进行串行至并行的转换,对从接收的数据进行并行至串行的转换。在异步通信单元ACE(asynchronous communications element)工作的任何时候CPU均可读和报告ACE的状态.这些状态信息包括正在进行的传输工作类型、工作状态以及遇到的任何错误条件。

TMA320C54x通过TL16C550C与PC机连接的电路图如图12所示。A0~A2为片内寄存器的地址选择端口,对其写入不同的电平可以实现对tl16c550c芯片的不同寄存器进行操作;D0~D8为双向8位数据线,用于与DSP进行数据通信;CS0、CS1、CS2用于输入片选信号,当CSO、CS1为高电平且CS2为低电平时,tl16C550被选中;R/W、RD1为读写控制信号输入端,其中RD1的信号由R/W经过一非门后输入;XIN、XOUT外接晶振,此处使用3.6864Mz的晶振,这样可以设置精确的波特率;INT0 用于提供中断服务;SIN、SOUT与MAX232进行通信;CTS、RTS分别为允许发送和请求发送控制端。

                                          图12 异步通信接口电路

TL16C550C的SOUT、CTS、SIN、RTS分别通过MAX232与串口的2、7、3、8引脚连接,在连接的过程中要注意区分MA X232的输人、输出引脚方向。

3.3 电平转换电路设计

为了实现TMS320C54x与PC机之间的电平转换,采用MAX232电平转换芯片设计了该电平转换电路,如图13所示。

MAX232是一种双组驱动器/接收器,片内含有一个电容性电压发生器以便在单5V电源供电时提供EIA/TIA-232-E电平。每个接收器将EIA/TIA-232-E电平输入转换为5V TTL/CMOS电平。这些接收器具有1.3V的典型门限值及0.5V的典型迟滞,而且可以接收±30V的输入。每个驱动器将TTL/CMOS输入电平转换为EIA/TIA-232-E电平。图中H5为串口接口。

MAX232的特点:MAX232的工作温度范围为0℃至70℃,MAX232I的工作温度范围为-40℃至85℃;单5V电源工作;LinBiCMOSTM工艺技术;两个驱动器及两个接收器;±30V输入电平;低电源电流:典型值是8mA;符合甚至优于ANSI标准EIA/TIA-232-E及ITU推荐标准V.28;可与Maxim公司的MAX232互换;ESD保护大于MIL-STD-883(方法3015)标准的2000V。

图13 电平转换电路

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4系统程序设计

4.1 CCS简介

CCS(Code Composer Studio)代码调试器是一种合成开发环境。它是一种针对标准TMS320调试器接口的交互式方法。CCS目前有CCS1.1, CCS1.2 和CCS2.0等三个不同时期的版本,又有CC2000 ( 针对C2XX ),CCS5000 ( 针对C54XX )和CCS6000 (针对C6X )三个不同的型号。CCS提供了非常丰富的调试手段。从数据流角度上,用户可以对内存单元和寄存器进行查看和编辑,载入/输出外部数据。一般的调试步骤为:调入构建好的可执行程序,先在感兴趣的程序段设置断点,然后执行程序停留在断点处,查看寄存器的值或内存单元的值,对中间数据进行在线分析。

载入可执行程序,命令“File/Load Program”载入编译链接好的可执行程序。使用反汇编工具,在某些时候(例如调试C语言关键代码),用户可能需要深入到汇编指令一级。可以利用CCS的反汇编工具。用户的执行程序(C程序或是汇编程序)载入到目标板时,CCS自动打开一个反汇编窗口。除在反汇编窗口可以显示反汇编代码外,CCS允许用户在调试窗口中混合实现C和汇编语句。可以选择“View/Mixed Source/Asm”。程序的执行控制,在调试程序时,用户会经常用到复位、执行、单步执行等命令,统称为程序执行控制。

1、CCS提供的复位目标板

(1)“Debug-Reset DSP”命令初始化所有的寄存器内容并暂停运行中的程序。

(2)“Debug-ReTLart”命令将PC恢复到当前载入程序的入口地址,此命令不执行当前程序。

(3)“Debug-GoMain”命令在主程序入口处设置一临时断点,然后开始执行。当程序被暂停或遇到一个断点时,临是时断点被删除。此命令提供了一种快速方法来运行用户应用程序。

2、CCS提供的程序执行控制

(1)“Debug-Run”命令,程序运行到遇见断点为止。

(2)“Debug-Halt”命令,程序暂停执行。

(3)“Debug-Animate”命令,用户可以反复运行执行程序,直到遇到断点为止。

(4)“Debug-Run Free”命令,此命令禁止所有断点,然后运行程序。在自由运行中对目标处理器的任何访问都将恢复断点。

3、CCS提供的单步执行操作

(1)“Debug-TLep Into”,当调试语句不是最基本的汇编指令时,此操作将进入语句内部(子程序或软件中断)调试。

(2)“Debug-TLep Over”,此命令将函数或子程序当作一条语句执行,不进入其内部调试。

(3)“Debug-TLep Out”,此命令将从子程序中跳出。

(4)“Debug-Runto Cursor”,此命令使程序运行到光标所在的语句。

 4、断点设置

断点的作用在于暂停程序的运行,以便观察/修改中间变量或寄存器数值。CCS提供了两类断点。设置断点应当避免以下两种情形:

(1)将断点设置在属于分支或调用的语句上。

(2)将断点设置在块重复操作的倒数第一或第二条语句上。

5、内存操作

在调试过程中,用户可能需要不断观察和修改寄存器、内存单元、数据变量。下面,我们依次介绍如何修改内存块,如何查看和编辑内存单元、寄存器、数据变量。

1)内存块操作

(1)拷贝数据块,拷贝某段内存到一新位置。

(2)填充数据块,用特定数据填充某段内存。

2)查看、编辑内存

CCS允许显示特定区域的内存单元数据。选择“View-Memory”,在弹出的对话框中输入内存变量名(或对应地址)、显示方式即可显示指定地址的内存单元,在内存显示窗口中单击右键,从关联菜单中选择“Properties”,设定内存显示属性。

6、CPU寄存器操作

(1)显示寄存器。

(2)编辑寄存器。

观察变量:在程序运行中,用户可能需要不间断地观察某个变量的变化情况,CCS提供了观察窗口(“Watch Window”),用于在调试过程中实时查看修改变量值。

7、加入观察变量

(1)选择“View-Watch Window”命令,则观察窗口出现在CCS的下部。CCS最多提供4个观察窗口,每个观察窗口用户都可以定义若干个观察变量,有两种方法可以定义观察变量:一是将光标移到观察窗口中按Insert键,弹出表达式加入对话框,在对话框中填入要观察的变量符号即可;二是在源文件窗口或反汇编窗口双击变量,则该变量反白显示,右键单击选择“Add to Watch Window”则该变量直接进入当前观察窗口中。

(2)表达式中的变量符号当作地址还是变量处理取决于目标文件是否包含有符号调试信息。若在编译链接时有-g选项K(包含符号调试信息),则变量符号当作真实变量值处理,否则作为地址。

8、删除某观察变量

有两种方法可以从观察窗口中删去某变量:

(1)双击观察窗口某变量,选中后变为彩色亮条显示。按Delete键,则从列表中删除此变量。

(2)选中某变量,单击右键,选择“Remove Current Expression”。

9、观察数组或结构变量

某些变量可能包含多个单元,如数组、结构或指针等C变量,这些变量加入到观察窗口时,会有“+”,可以点击“+”展开观察。

评估代码性能:用户完成一个算法设计和编程后,一般需要测试程序效率以便进一步优化代码,CCS用“代码性能评估”工具来帮助用户评估代码性能。其基本方法为:在适当的语句位置设置断点(软件断点或性能断点)。当程序执行通过断点时,有关代码执行的信息被收集并统计。用户通过统计信息评估代码性能,更详细的内容请参考相关资料。

10、在CCS里建立一个项目的步骤:

(1)创建新的工程文件: 选择菜单“ Project” 的 “New…” 项;在“Project Creation”对话框中,在“Project”硬件设项输入“volume” ; 单击“ Location ” 项末尾的浏览按钮, 改变目录到“C:\5416EDULab\Lab1-UseCC”,单击“OK”;单击“完成”;这时建立的是一个空的工程文件;展开主窗口左侧工程管理窗口中“Projects”下新建“volume.pjt”,其中各项均为空。

(2)在工程文件中添加程序文件: 选择菜单“Project” 的“Add Files to Project… ”项;在“Add Files to Project”对话框中选择文件目录为“C:\5416EDULab\Lab1-UseCC”,改变文件类型为“C Source Files(*.c;*.ccc)”,选择显示出来的文件“volum.c”;重复上述各步骤,添加“volume.cmd” 文件到“volum” 工程中;添加“C:\ti\C5400\cgtools\lib\rts.lib”。

(3)编译连接工程: 选择菜单“Project”的“Rebuild  All”项;注意编译过程中CCS 主窗口下部的“Build”提示窗中显示编译信息,最后将给出错误和警告的统计数。

4.2 系统程序设计流程图

       (1) 图14所示的为系统初始化的程序流程图,主要是DSP的状态等待寄存器以及状态控制寄存器的初始化,还有系统中用到的DSP的硬件外部中断1所以要对其初始化,用到了12864液晶所以要对GPIO初始化操作以及12864液晶的初始化操作,然后在12864液晶上显示按键的控制信息,最后关闭实验箱上所有的LED即完成了系统的初始化过程。

                                                       图 14

图15

       (2) 图15主要是说明了按键控制GPS定位数据提取以及12864液晶显示数据信息的整个程序流程图。

4.3系统程序设计

4.3.1 初始化程序模块

DSP初始化:

1、首先要定义寄存器

    如,对软件等待状态寄存器(SWWSR)和软件等待状态控制寄存器(SWSR)进行宏定义如下:

#define SWWSR           *(volatile unsigned int *)(SWWSR_ADDR)

#define SWCR            *(volatile unsigned int *)(SWCR_ADDR)

2、对寄存器进行读写操作,io、ram和rom的等待周期进行设置。

1、对TL16C550C的寄存器进行宏定义,通过地址线定义TL16C550C的各个寄存器

2、对TL16C550C的寄存器进行初始化,整个程序时通过总线的形式进行操作的。

在对各个寄存器操作前,要先对线路状态寄存器进行操作。

采用的是3.6864Mz的晶体振荡器,得到速度为9600Baud、字长为8bit、无奇偶校验位、1为停止位的数据流。

4.3.2 串口通信接收程序模块

    系统主要是用到了串口通信的接收函数,

void Uart_Init(void)//串口初始化函数

{

    UART_LCR = 0x03; //字长为8 bit、无校验位、1 位停止位

    UART_IER =  0;//关闭所有中断允许位

    UART_LCR = 0x83;//设置DLAB=1时才可以设置DLL和DLM       

    UART_DLL = 0x18;   /*DLAB =1*/

    UART_DLM = 0x00;   /*DLAB =1*/

    UART_FCR = 0x00;/*write*/

    UART_LCR = 0x03;

}

unsigned int Uart_rx(void)//接收程序

{

    volatile unsigned long ii = 0L;     

       while(!(UART_LSR & 0x01))//查询通过判断线路状态寄存器的DR来判断接收寄存器中是否有值

    {

       if(ii++>2000000)//查询一段时间,在这段时间内接收函数一直返回0xffff

       {  

           return(0xffff);

       }

    }//当接收到数据时则返回接收缓存器中的数值

    return(UART_RBR);

}

4.3.3 按键扫描程序模块

       i=Get_Key();//获取当前键值存入变量i中

        waitloop( 0x040000L );//延时按键消抖

       j=Get_Key();//延时一段时间后再次取得键值

        if(i==j)//判断后面取得的键值是否等于前面的键值

         { //前后2次的键值相等的话就进入if语句执行键值判断

           key_val=j; //将键值存入变量key_val中

           while(Get_Key())//这个就是松手检测了,就是直到检测到键值为0X0000即Get_Key()函数返回0时马上退出while循环然后再次判断键值

            {

              asm("\tnop"); //wait blank_key

            }   

            switch(key_val)//判断键值进入不同的函数实现功能

   {

               default:

               break;

               case 1:

                  //init_lcd();

                  LCD_clear(0);

                  while(flag)

                  {

                     uart_rece_gprmc_0();

                  };

                  break;

在这只是讲了其中的一个case语句,其他的都是一样的就不细说了。

下面图即是上述程序的流程图。

                                             图16

4.3.4 中断程序模块

       首先设置中断标志寄存器(Interrupt Flag Register)和中断屏蔽寄存器(Interrupt Mask Register,IMR),程序如下:

       IFR =0xffff;

      IMR =0x0002; //TINT=IMR.3       EXINT1=IMR.1

在这里只使能外部中断1有效,对应的在Lsvects.s54里设置中断入口地址以及跳转函数

int1:      B       _EXINT1_isr

        NOP

        NOP

        NOP

       上述过程主要是设置中断入口地址,下面主要是main函数里面的中断服务子函数

interrupt void EXINT1_isr()//中断服务子程序

{

       flag=0;//当中断产生时则立马将标志flag清零从而退出数据接收循环

       cur_row=5;       

       cur_col=15;      

       LCD_clear(0);//清液晶显示屏

     display();//显示主菜单

}

       在程序中,主要是利用中断来改变标志位flag,从而有效的控制接收数据函数从大循环中退出来。使液晶显示数据可以动态显示。

4.3.5数据提取与LCD显示模块

(1) 数据提取关键代码分析:

先讲下串口接收函数

       while(!(UART_LSR & 0x01))//这个就是判断LSR的第0位当接收到数据时该位则置高,否则一直是0那么一直执行return(0xffff),

       {

              if(ii++>2000000)

              {  

                     return(0xffff);

              }

       }

//当接收到数据时则不执行while循环立马返回接收到的数据

       return(UART_RBR);

       Uart_Init(); //串口初始化

       for(ii=0;ii<shuzunum;ii++)//先将上次存储的数据全部清空

    {   

          data[ii] =0;

    }

       while(1)

       {

              do

              {

                     jj = Uart_rx();//变量jj存下串口接收过来的数据

              }while(jj==0xFFFF);//在程序中使用的是查询法,就是一直查询串口是否接收到数据,如果接收到数据则跳出do..while();语句。否则一直等待

           if(locate<shuzunum)//这部分主要实现的是将接收下来的数据一帧一帧的存入data[]数组中以便后面识别显示

              {

                     data[locate] =jj;

                     locate++;

              }

              Else//当data数组存满以后则进行识别操作,也就是识别各个字母对应的ASCII值从而提取出我们需要的参数

              {    

                     ii=0;

                     while(ii<shuzunum)

               {

                   if(data[ii]==36)//首先识别帧头$

                   { 

                       if((ii+1)<shuzunum&&data[ii+1]==71)//G

                         if((ii+2)<shuzunum&&data[ii+2]==80)//P

                           if((ii+3)<shuzunum&&data[ii+3]==82)//R

                             if((ii+4)<shuzunum&&data[ii+4]==77)//M

                               if((ii+5)<shuzunum&&data[ii+5]==67)//C

                                  break;//直到全部条件满足的情况下退出while循环

                   }

                   ii++;//当有一个不满足时则立马在数组的位置中继续查找

               }

               ii+=6;//当识别到$GPRMC时则将数组指向的位置往前挪6位即跳过$GPRMC进而继续判断后面的内容

               for(;ii<shuzunum;ii++)

               { 

                  if(data[ii]==36)//如果在$GPRMC后面紧跟着的内容是$的话则立马退出for循环继续等待$GPRMC的出现

                               break;

                  if(ji_dou==1)//如果逗号的个数为1的话则该段数据为时间信息,则将它一一存入定义的time数组中直到下个逗号出现时存储停止

                  {

                               time[data_num]=data[ii];

                               data_num++;

                  }

                  else if(ji_dou==2)//逗号个数为2后面则为定位状态信息

                  {

                               locate_state[data_num]=data[ii];

                               data_num++;

                  }

                        else if(ji_dou==3)//逗号个数为3时则为纬度信息

                        {

                                weidu[data_num]=data[ii];

                                   data_num++;

                        }

                  else if(ji_dou==4)//逗号为4时则为纬度的方向信息,是北纬还是南纬

                  {

                               N[data_num]=data[ii];

                               data_num++;

                  }

                  else if(ji_dou==5)//逗号为5时则是经度信息

                  {

                               jingdu[data_num]=data[ii];

                               data_num++;

                  }

                  else if(ji_dou==6)//逗号为6则是东经还是西经信息

                  {

                               E[data_num]=data[ii];

                               data_num++;

                  }

                  else if(ji_dou==7)//逗号个数为7时则为速度信息

                  {

                               speed[data_num]=data[ii];

                               data_num++;

                  }

                  if(data[ii]==44)//这个则是遇到’,’的时候则将计算逗号个数的变量ji_dou加1从而有效的提取出两个’,’之间的信息

                  {

                               ji_dou++;

                               data_num=0;//当遇到下一个’,’时则将数组计数变量清零

                  }

               }

(2)  LCD显示模块关键代码分析:

                     cur_col=50;//12864液晶显示的列值

                     cur_row=0;//12864液晶的行值

                     LCD_pr_chars("GPRMC",5);//调用显示字符串函数显示

                     cur_col=0;//12864液晶行列值

                     cur_row=1;

                     LCD_pr_chars("***********************",23);

                     cur_col = 1;

               cur_row = 2; 

               LCD_pr_chars("Locate_State:",13);//显示定位状态

            for(ii=0;ii<4;ii++)

            {

                if(locate_state[ii]==65)

                   LCD_pr_chars("Locate:",6);//当收到’A’时则显示定位

                else if(locate_state[ii]==86)  //如果收到的是’V’

                   LCD_pr_chars("Unlocate:",8);//则显示不定位状态

            }

            cur_col = 1;//12864液晶行列值

            cur_row =3;

            LCD_pr_chars("Time:",5);//显示时间

            LCD_nextchar(chartable[time[0]-48]);

            LCD_nextchar(chartable[time[1]-48]);

            LCD_nextchar(':');

            LCD_nextchar(chartable[time[2]-48]);

            LCD_nextchar(chartable[time[3]-48]);

            LCD_nextchar(':');

            LCD_nextchar(chartable[time[4]-48]);

            LCD_nextchar(chartable[time[5]-48]);

            cur_col = 1;

            cur_row = 4;

            LCD_pr_chars("Latitude:",9);//显示纬度

            for(ii=0;ii<9;ii++)

            {

                if(weidu[ii]==46)//当遇到’.’的ASCII值时则显示’.’

                                   LCD_nextchar('.');//

                else  

                                   LCD_nextchar(chartable[weidu[ii]-48]);否则正常显示

            }

            if(N[0]==78)//如果收到的为’N’则显示N

                            LCD_nextchar('N');//北纬

            else //否则则显示S

                            LCD_nextchar('S');//南纬

            cur_col = 1;

            cur_row = 5;

            LCD_pr_chars("Longitude:",10);

             for(ii=0;ii<9;ii++)

            {

                if(jingdu[ii]==46)LCD_nextchar('.');

                else   LCD_nextchar(chartable[jingdu[ii]-48]);

            }

            if(E[0]==69)

                            LCD_nextchar('E');//东经

            else

                            LCD_nextchar('W');//西经

            cur_col = 1;

            cur_row = 6;

            LCD_pr_chars("Speed:",6);//速度

            for(ii=0;ii<5;ii++)

            {

                if(speed[ii]==46)

                                   LCD_nextchar('.');

                else  

                                   LCD_nextchar(chartable[speed[ii]-48]);

            }

                     cur_row=7;           

                     cur_col=0;

                     LCD_pr_chars("Press <INT> to Exit",19);//当按下急救车的按键的时候则立马退出显示数据的循环显示主菜单

 

 

 

 

5系统调试

5.1串口调试器介绍

串口调试器是一种人机交互的软件,从串行口获取串口通信数据,支持常用的300-115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。本次系统调试我使用的是“串口调试助手V2.1.exe”。打开后界面如图17示:

                                                      图 17

5.2系统调试过程

1. 用RS232串口线将DSP实验箱与PC机连接好,将硬件仿真器TH-TDS520-USB2的USB口接入PC机,Jtag口接DSP实验箱,DSP实验箱上电。

2. 双击运行Setup CCS2.0,配置好CPU后保存关闭,接着会打开CCS2.0界面,同时硬件仿真器指示灯亮。

3. 打开串口通信的project,编译链接,把.out文件加载完后运行程序;

4. 打开串口调试助手,选择串口端口号,设置好波特率(根据DSP实验箱所选的晶振设置为9600)及数据位、校验位位数,并且打开串口,在串口调试小助手的发送区写入要发送的数据,然后选择自动发送(可以设置自动发送的发送周期,一般选择1000ms左右),在CCS的数据空间观察在串口调试助手上发送的数据。同时在接收区的窗口观察DSP发送过来的数据(数据是由DSP程序所决定的,具体发送的内容可以根据通信程序进行修改)。

5.3调试结果与分析

结果分析:

 

图18主界面

       上图18即为系统显示的主界面,主要是显示按键控制显示相应信息。

K1:提取GPGGA的海拔高度,时间,纬度,经度。K2:提取GPGGA定位状态,卫星数目,HDOP水平精度因子(0.5 - 99.9)。K3提取GPRMC的时间,定位状态,经度,速度,纬度。K4提取GPRMC的方位角,年月日,磁偏角和磁偏角的方向。

图 19 GPGGA数据1

       图19提取显示GPGGA的海拔高度为58.0,时间为06:18:21,纬度为北纬28.3546度,经度为东经115.51884度,最后一行显示的是按下中断按键则退出提取界面返回主界面。

图20 GPGGA数据2

       图 20 提取显示GPGGA的定位状态信息为未定位,卫星数目为10个,HDOP水平精度因子为0.8,最后一行提示按下中断键则退出数据提取界面返回主界面。

图21 GPRMC数据1

       图 21 提取显示GPRMC的定位状态信息为已定位,时间为06:18:20,纬度为北纬28.443546度,经度为东经115.51884度,速度为000.0节,最后一行提示按下中断按键则退出数据提取界面返回主界面。

图22 GPRMC数据2

    图 22 提取显示GPRMC的日期年月日为07年4月25日,方位角为000.0度,磁偏角为003.3度,磁偏角的方向为西(W)。

0 0
原创粉丝点击