基于STM32的GPS模块驱动(AIR530)

2023-11-01 16浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

一、概述

由于做项目要用到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]==',')

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台