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

来源:互联网 发布:法律咨询软件哪个好 编辑:程序博客网 时间:2024/05/23 21:21

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