历史上的今天
返回首页

历史上的今天

今天是:2025年02月02日(星期日)

2020年02月02日 | 基于STM32的GPS模块驱动(AIR530)

2020-02-02 来源:eefocus

一、概述

由于做项目要用到GPS定位,于是在某宝购买了这款GPS模块。项目采用的MCU是STM32。废话少说,进入正题。


二、GPS模块简介

Air530 模块是一款高性能、高集成度的多模卫星定位导航模块。体积小、功耗低,可用于车载导 航、智能穿戴、无人机等 GNSS 定位的应用中。而且提供了和其他模块厂商兼容的软、硬件接口,大幅 减少了用户的开发周期。 模块支持GPS/Beidou/GLONASS/Galileo/QZSS/SBAS。采用了射频基带一体化设计,集成了 DC/DC、 LDO、 LNA、射频前端、基带处理、32 位 RISC CPU、RAM、FLASH 存储、RTC 和电源管理等功能。提供 超高的性能,即使在弱信号的地方,也能快速、准确的定位。

这个模块有五个引脚。如果只是简单的定位玩一下的话,那个1pps引脚不用也可以。


VDD       供电电源,电压输入 范围 3.3V-5.5V


TXD       GPS 串口数据输出, 2.8V--5V 自适应


RXD       GPS 串口数据输入, 2.8V--5V 自适应


1PPS      One plus per second(2.8V)


GND      接地


三、STM32驱动程序编写

1.NMEA协议

在编写驱动程序前一定要知道NMEA协议。NMEA是(National Marine Electronics Association )为海用电子设备制定的标准格式。NMEA缩写,同时也是数据传输标准工业协会,在这里,实际上应为NMEA 0183。它是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等,其他的有速度,跟踪,日期等。NMEA实际上已成为所有的GPS接收机和最通用的数据输出格式,同时它也被用于与GPS接收机接口的大多数的软件包里。NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。


AIR530 模块支持 NMEA 0183 V4.1 协议并兼容以前版本,关于 NMEA 0183 V4.1 的详细信息请参照 NMEA 0183 V4.1 官方文档。


        GGA:时间、位置、卫星数量


        GLL:经度、纬度、 UTC 时间


        GSA:GPS 接收机操作模式,定位使用的卫星,DOP 值,定位状态


        GSV:可见 GPS 卫星信息、仰角、方位角、信噪比


        RMC:时间、日期、位置、速度 VTG:地面速度信息


2.驱动开发

gps头文件


/*****************************************************

消息 :$GPRMC,100646.000,A,3109.9704,N,12123.4219,E,0.257,335.62,291216,,,A*59

ID :            $GPRMC RMC                  协议头

UTC时间:         100646.000                  hhmmss.sss

状态:            A                           A=数据有效;V=数据无效

纬度 :           2109.9704                   ddmm.mmmm

N/S:              N                          N=北,S=南

经度:           11123.4219                   dddmm.mmmm

E/W :             E                          W=西,E=东

地面速度:        0.257                        Knot(节)

方位:           335.62                        度

日期            291216                        ddmmyy

磁变量           无

校验和           *59

                                     消息结束

******************************************************/

#ifndef __GPS__H

#define __GPS__H

#include "sys.h"

#include "usart.h"

#include "stdint.h"

#include "string.h"

#include "stdlib.h"

//启动命令

 

#define  HotStart     "$PGKC030,1,1*2Crn"      //Gps系统热启动

#define  WarmStart    "$PGKC030,2,1*2Frn"      //Gps系统温启动

#define  ColdStart    "$PGKC030,3,1*2Ern"      //Gps系统冷启动

#define  ReColdStart  "$PGKC030,4,1*29rn"      //Gps系统重置冷启动

 

// 卫星定位模式设置

#define  SingleGps    "$PGKC115,1,0,0,0*2Brn"      //单 GPS

#define  GPSandBEIDOU   "$PGKC115,1,0,1,0*2Arn"      //GPS+BEIDOU

#define  GPSandGLONASS  "$PGKC115,1,1,0,0*2Arn"      //GPS+GLONASS

 

// 低功耗模式设置       

#define  LPsleep  "$PGKC051,1*36rn"    //  sleep 模式     

#define  LPstop   "$PGKC051,0*37rn"    //  stop 模式 

 

/******************************************

//配置输出 NMEA 消息的间隔(ms 单位)  

Arg1: 200-10000

******************************************/

#define  delay1sNMEA  "$PGKC101,1000*02rn" // 间隔1ms

 

 

/******************************************

//开启或关闭 QZSS NMEA格式输出  

Arg1: “0”,关闭

      “1”,开启

******************************************/

#define  OpenNMEA    "$PGKC113,1*31rn"

#define  CloseNMEA   "$PGKC113,0*30rn"

 

 

//设置 NMEA 输出波特率

#define  SetBps115200   "$PGKC147,115200*06rn"

//加速定位信息

#define  MoreFast   "$PGKC639,34.093145,108.542323,0,2019,05,04,02,43,54*05rn"

 

/*******************************************

设置 NMEA 语句输出使能

Arg1: GLL “0”,关闭; “1”,打开

Arg2: RMC “0”,关闭; “1”,打开

Arg3: VTG “0”,关闭; “1”,打开

Arg4: GGA “0”,关闭; “1”,打开

Arg5: GSA “0”,关闭; “1”,打开

Arg6: GSV “0”,关闭; “1”,打开

Arg7: GRS “0”,关闭; “1”,打开

Arg8: GST “0”,关闭; “1”,打开

Arg9~ Arg19: 保留

*******************************************/

#define  EnableRMC   "$PGKC242,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*36rn"

 

 

//擦除 flash 中的辅助定位数据

#define  DeleteFlash   "$PGKC040*2Brn"

 

 

//开启或关闭 SBAS 功能

#define  CloseSBAS   "$PGKC239,1*3Arn"//关闭SBAS 功能

#define  OpenSBAS   "$PGKC239,0*3Brn"//开启SBAS 功能

 

//RMC_DATA结构体

typedef struct RMC_DATA{

char    time[12];  //UTC时间

char    state[12]; //状态 

  char   lat[12];  //纬度

char    NS[2];    //N/S指示

char    WE[2];     //W/E指示

char   lng[12];  //经度

char    date[12];  //日期

}rmc_data;

//错误信息上传数据帧

typedef struct WARNING{

char start;//帧头

u8 WarningFlag;//从最低位到最高为分别表示:电池电量警告,GPS定位失败警告,电子围栏越界警告,跌倒警告,其他暂时预留。

char end;//结束标志

}Warning;

//定位信息上传数据帧

typedef struct OPSITIONDATA{

  char    start;

char    time[12];  //UTC时间

char    state[12]; //状态 

  char   lat[12];  //纬度

char    NS[2];    //N/S指示

char   lng[12];  //经度

char    WE[2];     //W/E指示

char    date[12];  //日期

  char     end;

}OpsitionData;

//心率信息上传数据帧

typedef struct HEARTRATEDATA{

char start;

  u8   HeartRate;//心率次数

char end;

}HeartRateData;

 

extern rmc_data  RecRMC; 

extern rmc_data * const pRecRMC; //RMC解析输出缓存区,该指针指向固定的地址

void SendAtToGps(u8 *cmd);

u8   GpsAckChack(u8 *str);

void Gps_Init(void);

void AnalysisRMC(rmc_data *pRecRMC);

void GpsRMCdataShow(void);

u8 OverStepArea(rmc_data *pRecRMC);

void mixGpsdate(char * ULdate,rmc_data *pRecRMC);

#endif

GPS驱动函数


#include "gps.h"

/*************************************

功能:发送数据到Gps模块

作者:贺远

日期:2019.03.05

参数:cmd  AT命令

返回值:无

**************************************/

void SendAtToGps(u8 *cmd)

{

while(*cmd!='')

{

USART_SendData(USART1,*cmd++);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==Bit_RESET); //发送数据结束

}

}

/*************************************

功能://检查GPS模块应答是否符合预期

作者:贺远

日期:2019.03.05

参数:str  正确的应答

返回值:无

**************************************/

u8 GpsAckChack(u8 *str)

{

//u8 str[225];

  delay_ms(500);

if(USART1_RX_STA!=0)

{

USART1_RX_STA=0;

   

if(strstr((const char*)USART1_RX_BUF,(const char*)str)) { memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);        return 0;}//符合预期

else                                                    { memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);     return 1;}//不符合预期      

                                //清空数组 

else { memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);   return  1;}

}

/*************************************

功能:Gps模块初始化

作者:贺远

日期:2019.03.05

参数:无

返回值:无

**************************************/

void Gps_Init()

{

cmd1:SendAtToGps(ColdStart);   //GPS冷启动

       delay_ms(50);

     if (!GpsAckChack("$PGKC001,30,3*1E"))  ; 

     else goto  cmd1;

cmd2:SendAtToGps(GPSandBEIDOU);//GPS+BEIDOU

       delay_ms(50);

     if (!GpsAckChack("$PGKC001,115,3,1,0,0,0,1,49*15"))  ; 

     else goto  cmd2;

 

cmd3:SendAtToGps(OpenSBAS);    //开启SBAS 功能

     delay_ms(50);

if (!GpsAckChack("$PGKC001,239,3*25"))  ; 

     else goto  cmd3;

cmd4:SendAtToGps(delay1sNMEA); //配置输出 NMEA 消息的间隔 1s

       delay_ms(50);

     if (!GpsAckChack("$PGKC001,101,3*2D"))  ; 

     else goto  cmd4;

cmd5:SendAtToGps(EnableRMC);   //设置 NMEA 语句输出使能  使能RMC

       delay_ms(50);

     if (!GpsAckChack("$PGKC001,242,3*29"))  ; 

     else goto  cmd5;

       

SendAtToGps(MoreFast);//加速定位信息

 

 

}

rmc_data  RecRMC; 

rmc_data * const pRecRMC=&RecRMC; //RMC解析输出缓存区,该指针指向固定的地址

/*************************************

功能:GPSRMC数据解析

作者:贺远

日期:2019.03.09

参数:无

返回值:无

**************************************/

void AnalysisRMC(rmc_data *pRecRMC)//GPSRMC数据解析

{

int i,n=0;

if(USART1_RX_STA!=0)

{

USART1_RX_STA=0;

for(i=0;USART1_RX_BUF[i]!='';i++)

{

if(USART1_RX_BUF[i]==',')  

推荐阅读

史海拾趣

大毅科技公司的发展小趣事

大毅科技一直注重技术创新和研发投入。公司拥有一支高素质的研发团队,不断推出具有市场竞争力的新产品。其中,高压电阻和可修整电阻等产品得到了客户的广泛认可。此外,大毅科技还积极投入于新型材料的研发,以提高产品的性能和降低成本。这些技术创新的成果不仅使大毅科技在市场中保持了领先地位,还为公司的持续发展奠定了坚实基础。

EFINIX公司的发展小趣事

EFINIX公司继续深化其在FPGA领域的技术创新,成功推出了Trion FPGA产品系列。该产品具有低功耗、精细封装面积和强大的性能特点,深受市场欢迎。在Trion FPGA产品销售的头三个月里,EFINIX公司获得了多项设计认可和客户订单,并有很多客户已经开始使用Trion FPGA进行产品设计。

Habia Cable公司的发展小趣事

EFINIX公司成立于2012年,由一群来自知名FPGA企业的创始人团队创立。他们拥有丰富的FPGA设计经验,并致力于在可编程逻辑行业实现突破性的创新。公司总部位于美国加利福尼亚州圣克拉拉市,计划采用一种全新的现场可编程门阵列(FPGA)技术——量子可编程技术,来设计芯片。这种技术旨在实现芯片尺寸仅为传统芯片的四分之一,能耗减少一半,同时结构更加简化。EFINIX公司相信,这种技术将推动人工智能和深度学习的发展,使数据处理更加高效。

CONEC公司的发展小趣事

1978年,CONEC在利普施塔特创立,标志着公司电子业务的起点。创立初期,公司可能面临着资金、技术和市场等多方面的挑战。然而,凭借着对电子行业的深刻理解和坚定的创业决心,CONEC逐渐在市场中站稳脚跟。1980年,DIN EN 60603系列产品的成功上线生产,为公司赢得了初步的声誉和市场认可,为后续的发展奠定了坚实基础。

Global Power Technologies Group公司的发展小趣事
提供稳定的电源电压,避免因电源电压波动影响电路的正常工作。
Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

进入21世纪,Bals Elektrotechnik继续致力于技术创新和产品升级。1998年,公司推出了具有革命性的CEE插头和插座无螺纹连接技术。这一技术不仅提高了连接的安全性和效率,还为用户节省了大量时间。Bals因此成为第一家提供这种创新技术的公司,进一步巩固了其在电气行业的领先地位。

这些故事虽然基于假设和现有信息,但尽量保持了客观性和事实性。它们展示了Bals Elektrotechnik GmbH & Co. KG公司在电子行业发展的不同阶段和关键事件,从一个运输公司成功转型为电气行业的领军企业。这些故事不仅反映了公司的成长历程,也体现了其不断创新、追求卓越的精神。

问答坊 | AI 解惑

“我的话题”功能改进

“我的话题”中“我的回复”这一项,是保存曾经回复的帖子链接的,但是当帖子被人回复后。我无法从这些链接中找出来。而且现在的链接排序方式不知是怎样的,很乱。我现在是习惯看回复时间。可是却没有完全按时间排序。我要从头到尾找一遍。真的很麻 ...…

查看全部问答>

想买液晶 但手头米不多各位推荐一下

想买液晶 但手头米不多 请教各位朋友,品牌的液晶,那个牌子的质量比较好(故障率低是最重要的,画质也要好) 如选择其他品牌请回帖说明…

查看全部问答>

矩阵按键二极管问题

  一个矩阵按键的电路上,有的在每个按键上串了一个二极管,有的是在行扫描线上串了一个二极管   这个二极管是做什么用的?…

查看全部问答>

EVC中 为什么不能对CDialogBar中的slider控件使用SetRange()函数?

EVC中 为什么不能对CDialogBar中的slider控件使用SetRange()函数?还有SetPos()函数也不能用.…

查看全部问答>

继电器控制板问题,求解,(谢谢,已解决)

这样子的,做了个控制器,电脑控制2个继电器的闭合,这次做完后,发现1号继电器工作,2号继电器不工作,当1号继电器不工作时,2号继电器可以工作,也就是2继电器始终只有一个有动作,因为做了蛮多的了,第一次碰到这个问题,继电板也没线路图,PCI ...…

查看全部问答>

关于使用STR912的SPI访问SD卡的问题

各位大虾:    小弟近日调试SD,使用912的SPI访问,遇到了麻烦!自己修改了一个网上下的驱动(周立功的),修改了相关的接口函数.可是,SD就是没有回应.    谁有相关的经验,帮帮我!或者把你的源代码发到我邮 ...…

查看全部问答>

求助双冗余网切换组播问题!!!!!

两路82557冗余,在sysfei82557end.c的sys557Init()中将两路网卡的MAC地址设置为一样,在usrapp...c中使用任务查询进行切换,在TCP和UDP点播都能快速切换,但组播切换时正确,现象是:假定正使用A路,TCP和UDP点播和组播均正常,当拔出A路网线后快速 ...…

查看全部问答>

Cortex M3 USB 仿真器和LM3S811最小系统板介绍

Cortex M3 USB 仿真器和LM3S811最小系统板…

查看全部问答>

STM32 RTC 32.768低温测试情况

看见BBS里很多老大说6PF晶振低温也不振,有些不放心. 后面可能需要RTC,不太想用PCF8563了,于是测试了一下低温(官方的程序).参数如下:12.5pf晶振6pf NPO 0603电容2layer FR4 PCB --------------------------------25度常温2秒左右启动.-20度7~9秒左 ...…

查看全部问答>