在STM32上实现使用DMA+USART3传输数据

串口的配置的文档如下所示
出口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  





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achou.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值