在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
阅读全文
0 0
- 在STM32上实现使用DMA+USART3传输数据
- STM32硬件IIC之DMA传输数据
- STM32上SPI+DMA实现大批量读取flash数据
- STM32上SPI+DMA实现大批量读取flash数据
- 针对stm32 DMA传输AD数据,在完成中断后如何复位的问题的思考
- 针对stm32 DMA传输AD数据,在完成中断后如何复位的问题的思考
- STM32 DMA传输
- STM32 ADC—DMA传输
- 在Nucleo STM32F401RE上使用SPI DMA方式提高W5500传输速率
- DMA+LeUart传输数据
- STM32通过TIM,ADC,DMA的配合使用实现双通道数据采样
- STM32—无需中断来实现使用DMA接收串口数据(原创)
- STM32—无需中断来实现使用DMA接收串口数据(原创)
- STM32 DMA使用浅谈
- STM32 DMA使用详解
- STM32 DMA使用详解
- STM32 DMA使用
- STM32 DMA使用详解
- 为何你跟着滴滴D8级前端大神撸代码,技术却依旧原地踏步?
- 阶乘之和 水
- Python3爬虫 处理分页
- HDU 1061 Rightmost Digit
- HTML5本地存储之Web Storage篇
- 在STM32上实现使用DMA+USART3传输数据
- ssh无密码登录故障解决
- 城市三级列表
- Pandas 排序之后索引问题
- apr-util make报错
- poj2549 Sumsets(中途相遇法)
- 人性
- 深度优先搜索和回溯(实例LeetCode 39 Combination Sum)
- Java中的伪共享以及应对方案