串口的配置的文档如下所示
出口3的头文件
#ifndef __USART3_H
#define __USART3_H
#include "sys.h"
#define USART3_MAX_RECV_LEN 200 //×î´ó½ÓÊÕ»º´æ×Ö½ÚÊý
#define USART3_MAX_SEND_LEN 200 //×î´ó·¢ËÍ»º´æ×Ö½ÚÊý
#define USART3_RX_EN 1 //0,²»½ÓÊÕ;1,½ÓÊÕ.
extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //½ÓÊÕ»º³å,×î´óUSART2_MAX_RECV_LEN×Ö½Ú
extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //·¢ËÍ»º³å,×î´óUSART2_MAX_SEND_LEN×Ö½Ú
extern u16 USART3_RX_STA; //½ÓÊÕÊý¾Ý״̬
void USART3_Init(u32 bound); //´®¿Ú2³õʼ»¯
void TIM4_Set(u8 sta);
void TIM4_Init(u16 arr,u16 psc);
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar);
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len);
void u3_printf(char* fmt, ...);
#endif
串口3的c文件
#include "delay.h"
#include "usart3.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
u16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý
{
res =USART_ReceiveData(USART3);
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //»¹¿ÉÒÔ½ÓÊÕÊý¾Ý
{
TIM_SetCounter(TIM4,0);//¼ÆÊýÆ÷Çå¿Õ
if(USART3_RX_STA==0)TIM4_Set(1); //ʹÄܶ¨Ê±Æ÷4µÄÖжÏ
USART3_RX_BUF[USART3_RX_STA++]=res; //¼Ç¼½ÓÊÕµ½µÄÖµ
}else
{
USART3_RX_STA|=1<<15; //Ç¿ÖƱê¼Ç½ÓÊÕÍê³É
}
}
}
//³õʼ»¯IO ´®¿Ú2
//pclk1:PCLK1ʱÖÓƵÂÊ(Mhz)
//bound:²¨ÌØÂÊ
void USART3_Init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOAʱÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
USART_DeInit(USART3); //¸´Î»´®¿Ú2
//USART2_TX PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PA2
//USART2_RX PA.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PA3
USART_InitStructure.USART_BaudRate = bound;//Ò»°ãÉèÖÃΪ9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½
USART_Init(USART3, &USART_InitStructure); //³õʼ»¯´®¿Ú 2
//²¨ÌØÂÊÉèÖÃ
// USART2->BRR=(pclk1*1000000)/(bound);// ²¨ÌØÂÊÉèÖÃ
//USART2->CR1|=0X200C; //1λֹͣ,ÎÞУÑéλ.
USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE); //ʹÄÜ´®¿Ú2µÄDMA·¢ËÍ
UART_DMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)USART3_TX_BUF);//DMA1ͨµÀ7,ÍâÉèΪ´®¿Ú2,´æ´¢Æ÷ΪUSART2_TX_BUF
USART_Cmd(USART3, ENABLE); //ʹÄÜ´®¿Ú
#ifdef USART3_RX_EN //Èç¹ûʹÄÜÁ˽ÓÊÕ
//ʹÄܽÓÊÕÖжÏ
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
TIM4_Init(99,7199); //10msÖжÏ
USART3_RX_STA=0; //ÇåÁã
TIM4_Set(0); //¹Ø±Õ¶¨Ê±Æ÷4
#endif
}
//´®¿Ú2,printf º¯Êý
//È·±£Ò»´Î·¢ËÍÊý¾Ý²»³¬¹ýUSART2_MAX_SEND_LEN×Ö½Ú
void u3_printf(char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
sprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
while(DMA_GetCurrDataCounter(DMA1_Channel2)!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel2,strlen((const char*)USART3_TX_BUF)); //ͨ¹ýdma·¢ËͳöÈ¥
}
//¶¨Ê±Æ÷4ÖжϷþÎñ³ÌÐò
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//ÊǸüÐÂÖжÏ
{
USART3_RX_STA|=1<<15; //±ê¼Ç½ÓÊÕÍê³É
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //Çå³ýTIMx¸üÐÂÖжϱêÖ¾
TIM4_Set(0); //¹Ø±ÕTIM4
}
}
//ÉèÖÃTIM4µÄ¿ª¹Ø
//sta:0£¬¹Ø±Õ;1,¿ªÆô;
void TIM4_Set(u8 sta)
{
if(sta)
{
TIM_SetCounter(TIM4,0);//¼ÆÊýÆ÷Çå¿Õ
TIM_Cmd(TIM4, ENABLE); //ʹÄÜTIMx
}else TIM_Cmd(TIM4, DISABLE);//¹Ø±Õ¶¨Ê±Æ÷4
}
//ͨÓö¨Ê±Æ÷Öжϳõʼ»¯
//ÕâÀïʼÖÕÑ¡ÔñΪAPB1µÄ2±¶£¬¶øAPB1Ϊ36M
//arr£º×Ô¶¯ÖØ×°Öµ¡£
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
void TIM4_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //ʱÖÓʹÄÜ//TIM4ʱÖÓʹÄÜ
//¶¨Ê±Æ÷TIM3³õʼ»¯
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //ʹÄÜÖ¸¶¨µÄTIM4ÖжÏ,ÔÊÐí¸üÐÂÖжÏ
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
}
#endif
///////////////////////////////////////USART2 DMA·¢ËÍÅäÖò¿·Ö//////////////////////////////////
//DMA1µÄ¸÷ͨµÀÅäÖÃ
//ÕâÀïµÄ´«ÊäÐÎʽÊǹ̶¨µÄ,ÕâµãÒª¸ù¾Ý²»Í¬µÄÇé¿öÀ´ÐÞ¸Ä
//´Ó´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
//DMA_CHx:DMAͨµÀCHx
//cpar:ÍâÉèµØÖ·
//cmar:´æ´¢Æ÷µØÖ·
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ʹÄÜDMA´«Êä
DMA_DeInit(DMA_CHx); //½«DMAµÄͨµÀ1¼Ä´æÆ÷ÖØÉèΪȱʡֵ
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMAÍâÉèADC»ùµØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMAÄÚ´æ»ùµØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //Êý¾Ý´«Êä·½Ïò£¬´ÓÄÚ´æ¶ÁÈ¡·¢Ë͵½ÍâÉè
DMA_InitStructure.DMA_BufferSize = 0; //DMAͨµÀµÄDMA»º´æµÄ´óС
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ÍâÉèµØÖ·¼Ä´æÆ÷²»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //ÄÚ´æµØÖ·¼Ä´æÆ÷µÝÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //Êý¾Ý¿í¶ÈΪ8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //Êý¾Ý¿í¶ÈΪ8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //¹¤×÷ÔÚÕý³£»º´æģʽ
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMAͨµÀ xÓµÓÐÖÐÓÅÏȼ¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAͨµÀxûÓÐÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä
DMA_Init(DMA_CHx, &DMA_InitStructure); //¸ù¾ÝDMA_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯DMAµÄͨµÀUSART1_Tx_DMA_ChannelËù±êʶµÄ¼Ä´æÆ÷
}
//¿ªÆôÒ»´ÎDMA´«Êä
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
DMA_Cmd(DMA_CHx, DISABLE ); //¹Ø±Õ ָʾµÄͨµÀ
DMA_SetCurrDataCounter(DMA_CHx,len);//DMAͨµÀµÄDMA»º´æµÄ´óС
DMA_Cmd(DMA_CHx, ENABLE); //¿ªÆôDMA´«Êä
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
gps文件
#include "gps.h"
#include "led.h"
#include "delay.h"
#include "usart3.h"
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
#include "math.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å
//ATK-NEO-6M GPSÄ£¿éÇý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2014/3/30
//°æ±¾£ºV2.0
//°æȨËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//********************************************************************************
//V2.0 ÐÞ¸Ä˵Ã÷ 20140330
//1,Ìí¼ÓUblox_Cfg_Cfg_Saveº¯Êý
//2,Ìí¼ÓUblox_Cfg_Msgº¯Êý
//3,Ìí¼ÓUblox_Cfg_Prtº¯Êý.
//////////////////////////////////////////////////////////////////////////////////
//´ÓbufÀïÃæµÃµ½µÚcx¸ö¶ººÅËùÔÚµÄλÖÃ
//·µ»ØÖµ:0~0XFE,´ú±í¶ººÅËùÔÚλÖõÄÆ«ÒÆ.
// 0XFF,´ú±í²»´æÔÚµÚcx¸ö¶ººÅ
u8 NMEA_Comma_Pos(u8 *buf,u8 cx)
{
u8 *p=buf;
while(cx)
{
if(*buf=='*'||*buf<' '||*buf>'z')return 0XFF;//Óöµ½'*'»òÕß·Ç·¨×Ö·û,Ôò²»´æÔÚµÚcx¸ö¶ººÅ
if(*buf==',')cx--;
buf++;
}
return buf-p;
}
//m^nº¯Êý
//·µ»ØÖµ:m^n´Î·½.
u32 NMEA_Pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//strת»»ÎªÊý×Ö,ÒÔ','»òÕß'*'½áÊø
//buf:Êý×Ö´æ´¢Çø
//dx:СÊýµãλÊý,·µ»Ø¸øµ÷Óú¯Êý
//·µ»ØÖµ:ת»»ºóµÄÊýÖµ
int NMEA_Str2num(u8 *buf,u8*dx)
{
u8 *p=buf;
u32 ires=0,fres=0;
u8 ilen=0,flen=0,i;
u8 mask=0;
int res;
while(1) //µÃµ½ÕûÊýºÍСÊýµÄ³¤¶È
{
if(*p=='-'){mask|=0X02;p++;}//ÊǸºÊý
if(*p==','||(*p=='*'))break;//Óöµ½½áÊøÁË
if(*p=='.'){mask|=0X01;p++;}//Óöµ½Ð¡ÊýµãÁË
else if(*p>'9'||(*p<'0')) //ÓзǷ¨×Ö·û
{
ilen=0;
flen=0;
break;
}
if(mask&0X01)flen++;
else ilen++;
p++;
}
if(mask&0X02)buf++; //È¥µô¸ººÅ
for(i=0;i<ilen;i++) //µÃµ½ÕûÊý²¿·ÖÊý¾Ý
{
ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0');
}
if(flen>5)flen=5; //×î¶àÈ¡5λСÊý
*dx=flen; //СÊýµãλÊý
for(i=0;i<flen;i++) //µÃµ½Ð¡Êý²¿·ÖÊý¾Ý
{
fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');
}
res=ires*NMEA_Pow(10,flen)+fres;
if(mask&0X02)res=-res;
return res;
}
//·ÖÎöGPGSVÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p,*p1,dx;
u8 len,i,j,slx=0;
u8 posx;
p=buf;
p1=(u8*)strstr((const char *)p,"$GPGSV");
len=p1[7]-'0'; //µÃµ½GPGSVµÄÌõÊý
posx=NMEA_Comma_Pos(p1,3); //µÃµ½¿É¼ûÎÀÐÇ×ÜÊý
if(posx!=0XFF)gpsx->svnum=NMEA_Str2num(p1+posx,&dx);
for(i=0;i<len;i++)
{
p1=(u8*)strstr((const char *)p,"$GPGSV");
for(j=0;j<4;j++)
{
posx=NMEA_Comma_Pos(p1,4+j*4);
if(posx!=0XFF)gpsx->slmsg[slx].num=NMEA_Str2num(p1+posx,&dx); //µÃµ½ÎÀÐDZàºÅ
else break;
posx=NMEA_Comma_Pos(p1,5+j*4);
if(posx!=0XFF)gpsx->slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//µÃµ½ÎÀÐÇÑö½Ç
else break;
posx=NMEA_Comma_Pos(p1,6+j*4);
if(posx!=0XFF)gpsx->slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);//µÃµ½ÎÀÐÇ·½Î»½Ç
else break;
posx=NMEA_Comma_Pos(p1,7+j*4);
if(posx!=0XFF)gpsx->slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx); //µÃµ½ÎÀÐÇÐÅÔë±È
else break;
slx++;
}
p=p1+1;//Çл»µ½ÏÂÒ»¸öGPGSVÐÅÏ¢
}
}
//·ÖÎöGPGGAÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPGGA_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p1,dx;
u8 posx;
p1=(u8*)strstr((const char *)buf,"$GPGGA");
posx=NMEA_Comma_Pos(p1,6); //µÃµ½GPS״̬
if(posx!=0XFF)gpsx->gpssta=NMEA_Str2num(p1+posx,&dx);
posx=NMEA_Comma_Pos(p1,7); //µÃµ½ÓÃÓÚ¶¨Î»µÄÎÀÐÇÊý
if(posx!=0XFF)gpsx->posslnum=NMEA_Str2num(p1+posx,&dx);
posx=NMEA_Comma_Pos(p1,9); //µÃµ½º£°Î¸ß¶È
if(posx!=0XFF)gpsx->altitude=NMEA_Str2num(p1+posx,&dx);
}
//·ÖÎöGPGSAÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPGSA_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p1,dx;
u8 posx;
u8 i;
p1=(u8*)strstr((const char *)buf,"$GPGSA");
posx=NMEA_Comma_Pos(p1,2); //µÃµ½¶¨Î»ÀàÐÍ
if(posx!=0XFF)gpsx->fixmode=NMEA_Str2num(p1+posx,&dx);
for(i=0;i<12;i++) //µÃµ½¶¨Î»ÎÀÐDZàºÅ
{
posx=NMEA_Comma_Pos(p1,3+i);
if(posx!=0XFF)gpsx->possl[i]=NMEA_Str2num(p1+posx,&dx);
else break;
}
posx=NMEA_Comma_Pos(p1,15); //µÃµ½PDOPλÖþ«¶ÈÒò×Ó
if(posx!=0XFF)gpsx->pdop=NMEA_Str2num(p1+posx,&dx);
posx=NMEA_Comma_Pos(p1,16); //µÃµ½HDOPλÖþ«¶ÈÒò×Ó
if(posx!=0XFF)gpsx->hdop=NMEA_Str2num(p1+posx,&dx);
posx=NMEA_Comma_Pos(p1,17); //µÃµ½VDOPλÖþ«¶ÈÒò×Ó
if(posx!=0XFF)gpsx->vdop=NMEA_Str2num(p1+posx,&dx);
}
//·ÖÎöGPRMCÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPRMC_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p1,dx;
u8 posx;
u32 temp;
float rs;
p1=(u8*)strstr((const char *)buf,"GPRMC");//"$GPRMC",¾³£ÓÐ&ºÍGPRMC·Ö¿ªµÄÇé¿ö,¹ÊÖ»ÅжÏGPRMC.
posx=NMEA_Comma_Pos(p1,1); //µÃµ½UTCʱ¼ä
if(posx!=0XFF)
{
temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx); //µÃµ½UTCʱ¼ä,È¥µôms
gpsx->utc.hour=temp/10000;
gpsx->utc.min=(temp/100)%100;
gpsx->utc.sec=temp%100;
}
posx=NMEA_Comma_Pos(p1,3); //µÃµ½Î³¶È
if(posx!=0XFF)
{
temp=NMEA_Str2num(p1+posx,&dx);
gpsx->latitude=temp/NMEA_Pow(10,dx+2); //µÃµ½¡ã
rs=temp%NMEA_Pow(10,dx+2); //µÃµ½'
gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//ת»»Îª¡ã
}
posx=NMEA_Comma_Pos(p1,4); //ÄÏγ»¹ÊDZ±Î³
if(posx!=0XFF)gpsx->nshemi=*(p1+posx);
posx=NMEA_Comma_Pos(p1,5); //µÃµ½¾¶È
if(posx!=0XFF)
{
temp=NMEA_Str2num(p1+posx,&dx);
gpsx->longitude=temp/NMEA_Pow(10,dx+2); //µÃµ½¡ã
rs=temp%NMEA_Pow(10,dx+2); //µÃµ½'
gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//ת»»Îª¡ã
}
posx=NMEA_Comma_Pos(p1,6); //¶«¾»¹ÊÇÎ÷¾
if(posx!=0XFF)gpsx->ewhemi=*(p1+posx);
posx=NMEA_Comma_Pos(p1,9); //µÃµ½UTCÈÕÆÚ
if(posx!=0XFF)
{
temp=NMEA_Str2num(p1+posx,&dx); //µÃµ½UTCÈÕÆÚ
gpsx->utc.date=temp/10000;
gpsx->utc.month=(temp/100)%100;
gpsx->utc.year=2000+temp%100;
}
}
//·ÖÎöGPVTGÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPVTG_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p1,dx;
u8 posx;
p1=(u8*)strstr((const char *)buf,"$GPVTG");
posx=NMEA_Comma_Pos(p1,7); //µÃµ½µØÃæËÙÂÊ
if(posx!=0XFF)
{
gpsx->speed=NMEA_Str2num(p1+posx,&dx);
if(dx<3)gpsx->speed*=NMEA_Pow(10,3-dx); //È·±£À©´ó1000±¶
}
}
//ÌáÈ¡NMEA-0183ÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void GPS_Analysis(nmea_msg *gpsx,u8 *buf)
{
NMEA_GPGSV_Analysis(gpsx,buf); //GPGSV½âÎö
NMEA_GPGGA_Analysis(gpsx,buf); //GPGGA½âÎö
NMEA_GPGSA_Analysis(gpsx,buf); //GPGSA½âÎö
NMEA_GPRMC_Analysis(gpsx,buf); //GPRMC½âÎö
NMEA_GPVTG_Analysis(gpsx,buf); //GPVTG½âÎö
}
//GPSУÑéºÍ¼ÆËã
//buf:Êý¾Ý»º´æÇøÊ×µØÖ·
//len:Êý¾Ý³¤¶È
//cka,ckb:Á½¸öУÑé½á¹û.
void Ublox_CheckSum(u8 *buf,u16 len,u8* cka,u8*ckb)
{
u16 i;
*cka=0;*ckb=0;
for(i=0;i<len;i++)
{
*cka=*cka+buf[i];
*ckb=*ckb+*cka;
}
}
/////////////////////////////////////////UBLOX ÅäÖôúÂë/////////////////////////////////////
//¼ì²éCFGÅäÖÃÖ´ÐÐÇé¿ö
//·µ»ØÖµ:0,ACK³É¹¦
// 1,½ÓÊÕ³¬Ê±´íÎó
// 2,ûÓÐÕÒµ½Í¬²½×Ö·û
// 3,½ÓÊÕµ½NACKÓ¦´ð
u8 Ublox_Cfg_Ack_Check(void)
{
u16 len=0,i;
u8 rval=0;
while((USART3_RX_STA&0X8000)==0 && len<100)//µÈ´ý½ÓÊÕµ½Ó¦´ð
{
len++;
delay_ms(5);
}
if(len<250) //³¬Ê±´íÎó.
{
len=USART3_RX_STA&0X7FFF; //´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
for(i=0;i<len;i++)if(USART3_RX_BUF[i]==0XB5)break;//²éÕÒͬ²½×Ö·û 0XB5
if(i==len)rval=2; //ûÓÐÕÒµ½Í¬²½×Ö·û
else if(USART3_RX_BUF[i+3]==0X00)rval=3;//½ÓÊÕµ½NACKÓ¦´ð
else rval=0; //½ÓÊÕµ½ACKÓ¦´ð
}else rval=1; //½ÓÊÕ³¬Ê±´íÎó
USART3_RX_STA=0; //Çå³ý½ÓÊÕ
return rval;
}
//ÅäÖñ£´æ
//½«µ±Ç°ÅäÖñ£´æÔÚÍⲿEEPROMÀïÃæ
//·µ»ØÖµ:0,Ö´Ðгɹ¦;1,Ö´ÐÐʧ°Ü.
u8 Ublox_Cfg_Cfg_Save(void)
{
u8 i;
_ublox_cfg_cfg *cfg_cfg=(_ublox_cfg_cfg *)USART3_TX_BUF;
cfg_cfg->header=0X62B5; //cfg header
cfg_cfg->id=0X0906; //cfg cfg id
cfg_cfg->dlength=13; //Êý¾ÝÇø³¤¶ÈΪ13¸ö×Ö½Ú.
cfg_cfg->clearmask=0; //Çå³ýÑÚÂëΪ0
cfg_cfg->savemask=0XFFFF; //±£´æÑÚÂëΪ0XFFFF
cfg_cfg->loadmask=0; //¼ÓÔØÑÚÂëΪ0
cfg_cfg->devicemask=4; //±£´æÔÚEEPROMÀïÃæ
Ublox_CheckSum((u8*)(&cfg_cfg->id),sizeof(_ublox_cfg_cfg)-4,&cfg_cfg->cka,&cfg_cfg->ckb);
while(DMA1_Channel2->CNDTR!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel2,sizeof(_ublox_cfg_cfg)); //ͨ¹ýdma·¢ËͳöÈ¥
for(i=0;i<6;i++)if(Ublox_Cfg_Ack_Check()==0)break; //EEPROMдÈëÐèÒª±È½Ï¾Ãʱ¼ä,ËùÒÔÁ¬ÐøÅж϶à´Î
return i==6?1:0;
}
//ÅäÖÃNMEAÊä³öÐÅÏ¢¸ñʽ
//msgid:Òª²Ù×÷µÄNMEAÏûÏ¢ÌõÄ¿,¾ßÌå¼ûÏÂÃæµÄ²ÎÊý±í
// 00,GPGGA;01,GPGLL;02,GPGSA;
// 03,GPGSV;04,GPRMC;05,GPVTG;
// 06,GPGRS;07,GPGST;08,GPZDA;
// 09,GPGBS;0A,GPDTM;0D,GPGNS;
//uart1set:0,Êä³ö¹Ø±Õ;1,Êä³ö¿ªÆô.
//·µ»ØÖµ:0,Ö´Ðгɹ¦;ÆäËû,Ö´ÐÐʧ°Ü.
u8 Ublox_Cfg_Msg(u8 msgid,u8 uart1set)
{
_ublox_cfg_msg *cfg_msg=(_ublox_cfg_msg *)USART3_TX_BUF;
cfg_msg->header=0X62B5; //cfg header
cfg_msg->id=0X0106; //cfg msg id
cfg_msg->dlength=8; //Êý¾ÝÇø³¤¶ÈΪ8¸ö×Ö½Ú.
cfg_msg->msgclass=0XF0; //NMEAÏûÏ¢
cfg_msg->msgid=msgid; //Òª²Ù×÷µÄNMEAÏûÏ¢ÌõÄ¿
cfg_msg->iicset=1; //ĬÈÏ¿ªÆô
cfg_msg->uart1set=uart1set; //¿ª¹ØÉèÖÃ
cfg_msg->uart2set=1; //ĬÈÏ¿ªÆô
cfg_msg->usbset=1; //ĬÈÏ¿ªÆô
cfg_msg->spiset=1; //ĬÈÏ¿ªÆô
cfg_msg->ncset=1; //ĬÈÏ¿ªÆô
Ublox_CheckSum((u8*)(&cfg_msg->id),sizeof(_ublox_cfg_msg)-4,&cfg_msg->cka,&cfg_msg->ckb);
while(DMA1_Channel2->CNDTR!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel2,sizeof(_ublox_cfg_msg)); //ͨ¹ýdma·¢ËͳöÈ¥
return Ublox_Cfg_Ack_Check();
}
//ÅäÖÃNMEAÊä³öÐÅÏ¢¸ñʽ
//baudrate:²¨ÌØÂÊ,4800/9600/19200/38400/57600/115200/230400
//·µ»ØÖµ:0,Ö´Ðгɹ¦;ÆäËû,Ö´ÐÐʧ°Ü(ÕâÀï²»»á·µ»Ø0ÁË)
u8 Ublox_Cfg_Prt(u32 baudrate)
{
_ublox_cfg_prt *cfg_prt=(_ublox_cfg_prt *)USART3_TX_BUF;
cfg_prt->header=0X62B5; //cfg header
cfg_prt->id=0X0006; //cfg prt id
cfg_prt->dlength=20; //Êý¾ÝÇø³¤¶ÈΪ20¸ö×Ö½Ú.
cfg_prt->portid=1; //²Ù×÷´®¿Ú1
cfg_prt->reserved=0; //±£Áô×Ö½Ú,ÉèÖÃΪ0
cfg_prt->txready=0; //TX ReadyÉèÖÃΪ0
cfg_prt->mode=0X08D0; //8λ,1¸öֹͣλ,ÎÞУÑéλ
cfg_prt->baudrate=baudrate; //²¨ÌØÂÊÉèÖÃ
cfg_prt->inprotomask=0X0007;//0+1+2
cfg_prt->outprotomask=0X0007;//0+1+2
cfg_prt->reserved4=0; //±£Áô×Ö½Ú,ÉèÖÃΪ0
cfg_prt->reserved5=0; //±£Áô×Ö½Ú,ÉèÖÃΪ0
Ublox_CheckSum((u8*)(&cfg_prt->id),sizeof(_ublox_cfg_prt)-4,&cfg_prt->cka,&cfg_prt->ckb);
while(DMA1_Channel2->CNDTR!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel2,sizeof(_ublox_cfg_prt)); //ͨ¹ýdma·¢ËͳöÈ¥
delay_ms(200); //µÈ´ý·¢ËÍÍê³É
USART3_Init( baudrate); //ÖØгõʼ»¯´®¿Ú2
return Ublox_Cfg_Ack_Check();//ÕâÀï²»»á·´»Ø0,ÒòΪUBLOX·¢»ØÀ´µÄÓ¦´ðÔÚ´®¿ÚÖØгõʼ»¯µÄʱºòÒѾ±»¶ªÆúÁË.
}
//ÅäÖÃUBLOX NEO-6µÄʱÖÓÂö³åÊä³ö
//interval:Âö³å¼ä¸ô(us)
//length:Âö³å¿í¶È(us)
//status:Âö³åÅäÖÃ:1,¸ßµçƽÓÐЧ;0,¹Ø±Õ;-1,µÍµçƽÓÐЧ.
//·µ»ØÖµ:0,·¢Ëͳɹ¦;ÆäËû,·¢ËÍʧ°Ü.
u8 Ublox_Cfg_Tp(u32 interval,u32 length,signed char status)
{
_ublox_cfg_tp *cfg_tp=(_ublox_cfg_tp *)USART3_TX_BUF;
cfg_tp->header=0X62B5; //cfg header
cfg_tp->id=0X0706; //cfg tp id
cfg_tp->dlength=20; //Êý¾ÝÇø³¤¶ÈΪ20¸ö×Ö½Ú.
cfg_tp->interval=interval; //Âö³å¼ä¸ô,us
cfg_tp->length=length; //Âö³å¿í¶È,us
cfg_tp->status=status; //ʱÖÓÂö³åÅäÖÃ
cfg_tp->timeref=0; //²Î¿¼UTC ʱ¼ä
cfg_tp->flags=0; //flagsΪ0
cfg_tp->reserved=0; //±£ÁôλΪ0
cfg_tp->antdelay=820; //ÌìÏßÑÓʱΪ820ns
cfg_tp->rfdelay=0; //RFÑÓʱΪ0ns
cfg_tp->userdelay=0; //Óû§ÑÓʱΪ0ns
Ublox_CheckSum((u8*)(&cfg_tp->id),sizeof(_ublox_cfg_tp)-4,&cfg_tp->cka,&cfg_tp->ckb);
while(DMA1_Channel2->CNDTR!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel2,sizeof(_ublox_cfg_tp)); //ͨ¹ýdma·¢ËͳöÈ¥
return Ublox_Cfg_Ack_Check();
}
//ÅäÖÃUBLOX NEO-6µÄ¸üÐÂËÙÂÊ
//measrate:²âÁ¿Ê±¼ä¼ä¸ô£¬µ¥Î»Îªms£¬×îÉÙ²»ÄÜСÓÚ200ms£¨5Hz£©
//reftime:²Î¿¼Ê±¼ä£¬0=UTC Time£»1=GPS Time£¨Ò»°ãÉèÖÃΪ1£©
//·µ»ØÖµ:0,·¢Ëͳɹ¦;ÆäËû,·¢ËÍʧ°Ü.
u8 Ublox_Cfg_Rate(u16 measrate,u8 reftime)
{
_ublox_cfg_rate *cfg_rate=(_ublox_cfg_rate *)USART3_TX_BUF;
if(measrate<200)return 1; //СÓÚ200ms£¬Ö±½ÓÍ˳ö
cfg_rate->header=0X62B5; //cfg header
cfg_rate->id=0X0806; //cfg rate id
cfg_rate->dlength=6; //Êý¾ÝÇø³¤¶ÈΪ6¸ö×Ö½Ú.
cfg_rate->measrate=measrate;//Âö³å¼ä¸ô,us
cfg_rate->navrate=1; //µ¼º½ËÙÂÊ£¨ÖÜÆÚ£©£¬¹Ì¶¨Îª1
cfg_rate->timeref=reftime; //²Î¿¼Ê±¼äΪGPSʱ¼ä
Ublox_CheckSum((u8*)(&cfg_rate->id),sizeof(_ublox_cfg_rate)-4,&cfg_rate->cka,&cfg_rate->ckb);
while(DMA1_Channel2->CNDTR!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel2,sizeof(_ublox_cfg_rate));//ͨ¹ýdma·¢ËͳöÈ¥
return Ublox_Cfg_Ack_Check();
}
#ifndef __GPS_H
#define __GPS_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å
//ATK-NEO-6M GPSÄ£¿éÇý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2014/3/30
//°æ±¾£ºV2.0
//°æȨËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//********************************************************************************
//V2.0 ÐÞ¸Ä˵Ã÷ 20140330
//1,Ìí¼ÓUblox_Cfg_Cfg_Saveº¯Êý
//2,Ìí¼ÓUblox_Cfg_Msgº¯Êý
//3,Ìí¼ÓUblox_Cfg_Prtº¯Êý.
//////////////////////////////////////////////////////////////////////////////////
//GPS NMEA-0183ÐÒéÖØÒª²ÎÊý½á¹¹Ì嶨Òå
//ÎÀÐÇÐÅÏ¢
__packed typedef struct
{
u8 num; //ÎÀÐDZàºÅ
u8 eledeg; //ÎÀÐÇÑö½Ç
u16 azideg; //ÎÀÐÇ·½Î»½Ç
u8 sn; //ÐÅÔë±È
}nmea_slmsg;
//UTCʱ¼äÐÅÏ¢
__packed typedef struct
{
u16 year; //Äê·Ý
u8 month; //Ô·Ý
u8 date; //ÈÕÆÚ
u8 hour; //Сʱ
u8 min; //·ÖÖÓ
u8 sec; //ÃëÖÓ
}nmea_utc_time;
//NMEA 0183 ÐÒé½âÎöºóÊý¾Ý´æ·Å½á¹¹Ìå
__packed typedef struct
{
u8 svnum; //¿É¼ûÎÀÐÇÊý
nmea_slmsg slmsg[12]; //×î¶à12¿ÅÎÀÐÇ
nmea_utc_time utc; //UTCʱ¼ä
u32 latitude; //γ¶È ·ÖÀ©´ó100000±¶,ʵ¼ÊÒª³ýÒÔ100000
u8 nshemi; //±±Î³/ÄÏγ,N:±±Î³;S:ÄÏγ
u32 longitude; //¾¶È ·ÖÀ©´ó100000±¶,ʵ¼ÊÒª³ýÒÔ100000
u8 ewhemi; //¶«¾/Î÷¾,E:¶«¾;W:Î÷¾
u8 gpssta; //GPS״̬:0,δ¶¨Î»;1,·Ç²î·Ö¶¨Î»;2,²î·Ö¶¨Î»;6,ÕýÔÚ¹ÀËã.
u8 posslnum; //ÓÃÓÚ¶¨Î»µÄÎÀÐÇÊý,0~12.
u8 possl[12]; //ÓÃÓÚ¶¨Î»µÄÎÀÐDZàºÅ
u8 fixmode; //¶¨Î»ÀàÐÍ:1,ûÓж¨Î»;2,2D¶¨Î»;3,3D¶¨Î»
u16 pdop; //λÖþ«¶ÈÒò×Ó 0~500,¶ÔӦʵ¼ÊÖµ0~50.0
u16 hdop; //ˮƽ¾«¶ÈÒò×Ó 0~500,¶ÔӦʵ¼ÊÖµ0~50.0
u16 vdop; //´¹Ö±¾«¶ÈÒò×Ó 0~500,¶ÔӦʵ¼ÊÖµ0~50.0
int altitude; //º£°Î¸ß¶È,·Å´óÁË10±¶,ʵ¼Ê³ýÒÔ10.µ¥Î»:0.1m
u16 speed; //µØÃæËÙÂÊ,·Å´óÁË1000±¶,ʵ¼Ê³ýÒÔ10.µ¥Î»:0.001¹«Àï/Сʱ
}nmea_msg;
////////////////////////////////////////////////////////////////////////////////////////////////////
//UBLOX NEO-6M ÅäÖÃ(Çå³ý,±£´æ,¼ÓÔصÈ)½á¹¹Ìå
__packed typedef struct
{
u16 header; //cfg header,¹Ì¶¨Îª0X62B5(С¶Ëģʽ)
u16 id; //CFG CFG ID:0X0906 (С¶Ëģʽ)
u16 dlength; //Êý¾Ý³¤¶È 12/13
u32 clearmask; //×ÓÇøÓòÇå³ýÑÚÂë(1ÓÐЧ)
u32 savemask; //×ÓÇøÓò±£´æÑÚÂë
u32 loadmask; //×ÓÇøÓò¼ÓÔØÑÚÂë
u8 devicemask; //Ä¿±êÆ÷¼þÑ¡ÔñÑÚÂë b0:BK RAM;b1:FLASH;b2,EEPROM;b4,SPI FLASH
u8 cka; //УÑéCK_A
u8 ckb; //УÑéCK_B
}_ublox_cfg_cfg;
//UBLOX NEO-6M ÏûÏ¢ÉèÖýṹÌå
__packed typedef struct
{
u16 header; //cfg header,¹Ì¶¨Îª0X62B5(С¶Ëģʽ)
u16 id; //CFG MSG ID:0X0106 (С¶Ëģʽ)
u16 dlength; //Êý¾Ý³¤¶È 8
u8 msgclass; //ÏûÏ¢ÀàÐÍ(F0 ´ú±íNMEAÏûÏ¢¸ñʽ)
u8 msgid; //ÏûÏ¢ ID
//00,GPGGA;01,GPGLL;02,GPGSA;
//03,GPGSV;04,GPRMC;05,GPVTG;
//06,GPGRS;07,GPGST;08,GPZDA;
//09,GPGBS;0A,GPDTM;0D,GPGNS;
u8 iicset; //IICÏûÊä³öÉèÖà 0,¹Ø±Õ;1,ʹÄÜ.
u8 uart1set; //UART1Êä³öÉèÖà 0,¹Ø±Õ;1,ʹÄÜ.
u8 uart2set; //UART2Êä³öÉèÖà 0,¹Ø±Õ;1,ʹÄÜ.
u8 usbset; //USBÊä³öÉèÖà 0,¹Ø±Õ;1,ʹÄÜ.
u8 spiset; //SPIÊä³öÉèÖà 0,¹Ø±Õ;1,ʹÄÜ.
u8 ncset; //δ֪Êä³öÉèÖà ĬÈÏΪ1¼´¿É.
u8 cka; //УÑéCK_A
u8 ckb; //УÑéCK_B
}_ublox_cfg_msg;
//UBLOX NEO-6M UART¶Ë¿ÚÉèÖýṹÌå
__packed typedef struct
{
u16 header; //cfg header,¹Ì¶¨Îª0X62B5(С¶Ëģʽ)
u16 id; //CFG PRT ID:0X0006 (С¶Ëģʽ)
u16 dlength; //Êý¾Ý³¤¶È 20
u8 portid; //¶Ë¿ÚºÅ,0=IIC;1=UART1;2=UART2;3=USB;4=SPI;
u8 reserved; //±£Áô,ÉèÖÃΪ0
u16 txready; //TX ReadyÒý½ÅÉèÖÃ,ĬÈÏΪ0
u32 mode; //´®¿Ú¹¤×÷ģʽÉèÖÃ,ÆæżУÑé,ֹͣλ,×Ö½Ú³¤¶ÈµÈµÄÉèÖÃ.
u32 baudrate; //²¨ÌØÂÊÉèÖÃ
u16 inprotomask; //ÊäÈëÐÒ鼤»îÆÁ±Îλ ĬÈÏÉèÖÃΪ0X07 0X00¼´¿É.
u16 outprotomask; //Êä³öÐÒ鼤»îÆÁ±Îλ ĬÈÏÉèÖÃΪ0X07 0X00¼´¿É.
u16 reserved4; //±£Áô,ÉèÖÃΪ0
u16 reserved5; //±£Áô,ÉèÖÃΪ0
u8 cka; //УÑéCK_A
u8 ckb; //УÑéCK_B
}_ublox_cfg_prt;
//UBLOX NEO-6M ʱÖÓÂö³åÅäÖýṹÌå
__packed typedef struct
{
u16 header; //cfg header,¹Ì¶¨Îª0X62B5(С¶Ëģʽ)
u16 id; //CFG TP ID:0X0706 (С¶Ëģʽ)
u16 dlength; //Êý¾Ý³¤¶È
u32 interval; //ʱÖÓÂö³å¼ä¸ô,µ¥Î»Îªus
u32 length; //Âö³å¿í¶È,µ¥Î»Îªus
signed char status; //ʱÖÓÂö³åÅäÖÃ:1,¸ßµçƽÓÐЧ;0,¹Ø±Õ;-1,µÍµçƽÓÐЧ.
u8 timeref; //²Î¿¼Ê±¼ä:0,UTCʱ¼ä;1,GPSʱ¼ä;2,µ±µØʱ¼ä.
u8 flags; //ʱ¼äÂö³åÉèÖñêÖ¾
u8 reserved; //±£Áô
signed short antdelay; //ÌìÏßÑÓʱ
signed short rfdelay; //RFÑÓʱ
signed int userdelay; //Óû§ÑÓʱ
u8 cka; //УÑéCK_A
u8 ckb; //УÑéCK_B
}_ublox_cfg_tp;
//UBLOX NEO-6M Ë¢ÐÂËÙÂÊÅäÖýṹÌå
__packed typedef struct
{
u16 header; //cfg header,¹Ì¶¨Îª0X62B5(С¶Ëģʽ)
u16 id; //CFG RATE ID:0X0806 (С¶Ëģʽ)
u16 dlength; //Êý¾Ý³¤¶È
u16 measrate; //²âÁ¿Ê±¼ä¼ä¸ô£¬µ¥Î»Îªms£¬×îÉÙ²»ÄÜСÓÚ200ms£¨5Hz£©
u16 navrate; //µ¼º½ËÙÂÊ£¨ÖÜÆÚ£©£¬¹Ì¶¨Îª1
u16 timeref; //²Î¿¼Ê±¼ä£º0=UTC Time£»1=GPS Time£»
u8 cka; //УÑéCK_A
u8 ckb; //УÑéCK_B
}_ublox_cfg_rate;
int NMEA_Str2num(u8 *buf,u8*dx);
void GPS_Analysis(nmea_msg *gpsx,u8 *buf);
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,u8 *buf);
void NMEA_GPGGA_Analysis(nmea_msg *gpsx,u8 *buf);
void NMEA_GPGSA_Analysis(nmea_msg *gpsx,u8 *buf);
void NMEA_GPGSA_Analysis(nmea_msg *gpsx,u8 *buf);
void NMEA_GPRMC_Analysis(nmea_msg *gpsx,u8 *buf);
void NMEA_GPVTG_Analysis(nmea_msg *gpsx,u8 *buf);
u8 Ublox_Cfg_Cfg_Save(void);
u8 Ublox_Cfg_Msg(u8 msgid,u8 uart1set);
u8 Ublox_Cfg_Prt(u32 baudrate);
u8 Ublox_Cfg_Tp(u32 interval,u32 length,signed char status);
u8 Ublox_Cfg_Rate(u16 measrate,u8 reftime);
#endif