目录
目的
想利用gps模块给stm32进行授时,同时利用秒脉冲来进行时间校正
1、GPS模块相关介绍
—简介
使用的GPS模块VG7669T160N0MA,购于沃进科技,该定位模块是基于中科微基第四代低功耗 GNSS SOC 单芯片 AT6558R。
—引脚位置图
—引脚说明
—数据帧介绍
模块通过 UART 作为主要输出通道,按照 NMEA0183 的协议格式输出,具体信息请参照《CASIC 多模卫星导航接收机协议规范》。
下面是通过串口打印的信息:
$GNGGA,021345.000,3958.53189,N,11625.31442,E,6,08,6.8,108.0,M,-9.8,M,,*57
$GNGLL,3958.53189,N,11625.31442,E,021345.000,A,E*42
$GNGSA,A,3,10,28,32,,,,,,,,,,10.0,6.8,7.3,1*00
$GNGSA,A,3,06,09,16,39,42,,,,,,,,10.0,6.8,7.3,4*0B
$GPGSV,2,1,05,10,77,278,43,15,,,32,23,,,28,28,29,233,37,0*61
$GPGSV,2,2,05,32,50,304,16,0*54
$BDGSV,2,1,06,06,63,241,36,09,51,235,34,13,,,29,16,71,246,36,0*43
$BDGSV,2,2,06,39,75,262,37,42,67,327,38,0*72
$GNRMC,021345.000,A,3958.53189,N,11625.31442,E,0.26,0.00,221124,,,E,V*0D
我们只需要关注RMC这条消息就行,具体参数说明如下:
2、程序设计
gps.h
#ifndef __GPS_H
#define __GPS_H
#include "sys.h"
#define BOOL int
#define TRUE 1
#define FALSE 0
typedef struct Data
{
char GPS_Buffer[200];//数据接收
BOOL isGetData;//接收数据是否完成
char *UTCTime;//时间戳
char *latitude;//纬度
char *N_S;//南北
char *longitude;//经度
char *E_W;//东西
BOOL isParseData;//是否解析完成
BOOL isUsefull;//是否为有效数据位
}Data;
void gps_init(void);
void parseGpsBuffer(void);
void printfGpsBuffer(void);
#endif
gps.c
#include "gps.h"
#include "usart.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/*
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<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>模式指示(仅NMEA01833.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
*/
const short int USART1_MAX_RECV_LEN = 200;
char USAR1_RX_BUF[USART1_MAX_RECV_LEN];
const short int GPS_Buffer_Length = 200;
struct Data Save_Data;
volatile unsigned long long stm32UTCTime;//ms级utc时间
void parseGpsBuffer(void){
char *subString;
char *subStringNext;
int i = 0;
char *dot;
char *milliseconds;
long seconds;
int milliseconds_val;
if(Save_Data.isGetData)
{
Save_Data.isGetData = FALSE;
printf("*****************\r\n");
printf("%s"