找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 23350|回復(fù): 23
收起左側(cè)

GPS定位模塊代碼終于調(diào)好了,可在地圖上顯示

  [復(fù)制鏈接]
ID:196137 發(fā)表于 2017-5-3 17:46 | 顯示全部樓層 |閱讀模式
  1. #include "gps_config.h"
  2. #include "bsp_usart2.h"
  3. #include "nmea/nmea.h"


  4. /* DMA接收緩沖  */
  5. uint8_t gps_rbuff[GPS_RBUFF_SIZE];

  6. /* DMA傳輸結(jié)束標(biāo)志 */
  7. __IO uint8_t GPS_TransferEnd = 0, GPS_HalfTransferEnd = 0;



  8. /**
  9.   * @brief  GPS_Interrupt_Config 配置GPS使用的DMA中斷
  10.   * @param  None.
  11.   * @retval None.
  12.   */
  13. static void GPS_Interrupt_Config(void)
  14. {
  15.         NVIC_InitTypeDef NVIC_InitStructure;

  16.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  17.         // DMA2 Channel Interrupt ENABLE
  18.         NVIC_InitStructure.NVIC_IRQChannel = GPS_DMA_IRQn;
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  20.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22.         NVIC_Init(&NVIC_InitStructure);

  23. }


  24. /**
  25.   * @brief  GPS_ProcessDMAIRQ GPS DMA中斷服務(wù)函數(shù)
  26.   * @param  None.
  27.   * @retval None.
  28.   */
  29. void GPS_ProcessDMAIRQ(void)
  30. {
  31.   
  32.   if(DMA_GetITStatus(GPS_DMA_IT_HT) )         /* DMA 半傳輸完成 */
  33.   {
  34.     GPS_HalfTransferEnd = 1;                //設(shè)置半傳輸完成標(biāo)志位
  35.     DMA_ClearFlag(GPS_DMA_FLAG_HT);
  36.   }
  37.   else if(DMA_GetITStatus(GPS_DMA_IT_TC))     /* DMA 傳輸完成 */
  38.   {
  39.     GPS_TransferEnd = 1;                    //設(shè)置傳輸完成標(biāo)志位
  40.     DMA_ClearFlag(GPS_DMA_FLAG_TC);

  41.    }
  42. }


  43. /**
  44.   * @brief  GPS_DMA_Config gps dma接收配置
  45.   * @param  無(wú)
  46.   * @retval 無(wú)
  47.   */
  48. static void GPS_DMA_Config(void)
  49. {
  50.                 DMA_InitTypeDef DMA_InitStructure;
  51.         
  52.                 /*開(kāi)啟DMA時(shí)鐘*/
  53.                 RCC_AHBPeriphClockCmd(GPS_DMA_CLK, ENABLE);

  54.                 /*設(shè)置DMA源:串口數(shù)據(jù)寄存器地址*/
  55.                 DMA_InitStructure.DMA_PeripheralBaseAddr = GPS_DATA_ADDR;           

  56.                 /*內(nèi)存地址(要傳輸?shù)淖兞康闹羔?*/
  57.                 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gps_rbuff;

  58.                 /*方向:從內(nèi)存到外設(shè)*/               
  59.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;        

  60.                 /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/        
  61.                 DMA_InitStructure.DMA_BufferSize = GPS_RBUFF_SIZE;

  62.                 /*外設(shè)地址不增*/            
  63.                 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  64.                 /*內(nèi)存地址自增*/
  65.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;        

  66.                 /*外設(shè)數(shù)據(jù)單位*/        
  67.                 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  68.                 /*內(nèi)存數(shù)據(jù)單位 8bit*/
  69.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         

  70.                 /*DMA模式:不斷循環(huán)*/
  71.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         

  72.                 /*優(yōu)先級(jí):中*/        
  73.                 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  

  74.                 /*禁止內(nèi)存到內(nèi)存的傳輸        */
  75.                 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  76.                 /*配置DMA的通道*/                  
  77.                 DMA_Init(GPS_DMA_CHANNEL, &DMA_InitStructure);            
  78.    
  79.     GPS_Interrupt_Config();
  80.                
  81.     DMA_ITConfig(GPS_DMA_CHANNEL,DMA_IT_HT|DMA_IT_TC,ENABLE);  //配置DMA發(fā)送完成后產(chǎn)生中斷

  82.                 /*使能DMA*/
  83.                 DMA_Cmd (GPS_DMA_CHANNEL,ENABLE);               
  84.    
  85.     /* 配置串口 向 DMA發(fā)出TX請(qǐng)求 */
  86.                 USART_DMACmd(GPS_USART, USART_DMAReq_Rx, ENABLE);

  87.    
  88. }

  89. /**
  90.   * @brief  GPS_Config gps 初始化
  91.   * @param  無(wú)
  92.   * @retval 無(wú)
  93.   */
  94. void GPS_Config(void)
  95. {
  96.   GPS_USART_INIT();
  97.   GPS_DMA_Config();  
  98.   
  99. }



  100. /**
  101.   * @brief  trace 在解碼時(shí)輸出捕獲的GPS語(yǔ)句
  102.   * @param  str: 要輸出的字符串,str_size:數(shù)據(jù)長(zhǎng)度
  103.   * @retval 無(wú)
  104.   */
  105. void trace(const char *str, int str_size)
  106. {
  107.   #ifdef __GPS_DEBUG    //在gps_config.h文件配置這個(gè)宏,是否輸出調(diào)試信息
  108.     uint16_t i;
  109.     printf("\r\nTrace: ");
  110.     for(i=0;i<str_size;i++)
  111.       printf("%c",*(str+i));
  112.   
  113.     printf("\n");
  114.   #endif
  115. }

  116. /**
  117.   * @brief  error 在解碼出錯(cuò)時(shí)輸出提示消息
  118.   * @param  str: 要輸出的字符串,str_size:數(shù)據(jù)長(zhǎng)度
  119.   * @retval 無(wú)
  120.   */
  121. void error(const char *str, int str_size)
  122. {
  123.     #ifdef __GPS_DEBUG   //在gps_config.h文件配置這個(gè)宏,是否輸出調(diào)試信息

  124.     uint16_t i;
  125.     printf("\r\nError: ");
  126.     for(i=0;i<str_size;i++)
  127.       printf("%c",*(str+i));
  128.     printf("\n");
  129.     #endif
  130. }



  131. /********************************************************************************************************
  132. **     函數(shù)名稱:            bit        IsLeapYear(uint8_t    iYear)
  133. **    功能描述:            判斷閏年(僅針對(duì)于2000以后的年份)
  134. **    入口參數(shù):            iYear    兩位年數(shù)
  135. **    出口參數(shù):            uint8_t        1:為閏年    0:為平年
  136. ********************************************************************************************************/
  137. static uint8_t IsLeapYear(uint8_t iYear)
  138. {
  139.     uint16_t    Year;
  140.     Year    =    2000+iYear;
  141.     if((Year&3)==0)
  142.     {
  143.         return ((Year%400==0) || (Year%100!=0));
  144.     }
  145.      return 0;
  146. }

  147. /********************************************************************************************************
  148. **     函數(shù)名稱:            void    GMTconvert(uint8_t *DT,uint8_t GMT,uint8_t AREA)
  149. **    功能描述:            格林尼治時(shí)間換算世界各時(shí)區(qū)時(shí)間
  150. **    入口參數(shù):            *DT:    表示日期時(shí)間的數(shù)組 格式 YY,MM,DD,HH,MM,SS
  151. **                        GMT:    時(shí)區(qū)數(shù)
  152. **                        AREA:    1(+)東區(qū) W0(-)西區(qū)
  153. ********************************************************************************************************/
  154. void    GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA)
  155. {
  156.     uint32_t    YY,MM,DD,hh,mm,ss;        //年月日時(shí)分秒暫存變量
  157.      
  158.     if(GMT==0)    return;                //如果處于0時(shí)區(qū)直接返回
  159.     if(GMT>12)    return;                //時(shí)區(qū)最大為12 超過(guò)則返回         

  160.     YY    =    SourceTime->year;                //獲取年
  161.     MM    =    SourceTime->mon;                 //獲取月
  162.     DD    =    SourceTime->day;                 //獲取日
  163.     hh    =    SourceTime->hour;                //獲取時(shí)
  164.     mm    =    SourceTime->min;                 //獲取分
  165.     ss    =    SourceTime->sec;                 //獲取秒

  166.     if(AREA)                        //東(+)時(shí)區(qū)處理
  167.     {
  168.         if(hh+GMT<24)    hh    +=    GMT;//如果與格林尼治時(shí)間處于同一天則僅加小時(shí)即可
  169.         else                        //如果已經(jīng)晚于格林尼治時(shí)間1天則進(jìn)行日期處理
  170.         {
  171.             hh    =    hh+GMT-24;        //先得出時(shí)間
  172.             if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)    //大月份(12月單獨(dú)處理)
  173.             {
  174.                 if(DD<31)    DD++;
  175.                 else
  176.                 {
  177.                     DD    =    1;
  178.                     MM    ++;
  179.                 }
  180.             }
  181.             else if(MM==4 || MM==6 || MM==9 || MM==11)                //小月份2月單獨(dú)處理)
  182.             {
  183.                 if(DD<30)    DD++;
  184.                 else
  185.                 {
  186.                     DD    =    1;
  187.                     MM    ++;
  188.                 }
  189.             }
  190.             else if(MM==2)    //處理2月份
  191.             {
  192.                 if((DD==29) || (DD==28 && IsLeapYear(YY)==0))        //本來(lái)是閏年且是2月29日 或者不是閏年且是2月28日
  193.                 {
  194.                     DD    =    1;
  195.                     MM    ++;
  196.                 }
  197.                 else    DD++;
  198.             }
  199.             else if(MM==12)    //處理12月份
  200.             {
  201.                 if(DD<31)    DD++;
  202.                 else        //跨年最后一天
  203.                 {               
  204.                     DD    =    1;
  205.                     MM    =    1;
  206.                     YY    ++;
  207.                 }
  208.             }
  209.         }
  210.     }
  211.     else
  212.     {     
  213.         if(hh>=GMT)    hh    -=    GMT;    //如果與格林尼治時(shí)間處于同一天則僅減小時(shí)即可
  214.         else                        //如果已經(jīng)早于格林尼治時(shí)間1天則進(jìn)行日期處理
  215.         {
  216.             hh    =    hh+24-GMT;        //先得出時(shí)間
  217.             if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)    //上月是大月份(1月單獨(dú)處理)
  218.             {
  219.                 if(DD>1)    DD--;
  220.                 else
  221.                 {
  222.                     DD    =    31;
  223.                     MM    --;
  224.                 }
  225.             }
  226.             else if(MM==5 || MM==7 || MM==10 || MM==12)                //上月是小月份2月單獨(dú)處理)
  227.             {
  228.                 if(DD>1)    DD--;
  229.                 else
  230.                 {
  231.                     DD    =    30;
  232.                     MM    --;
  233.                 }
  234.             }
  235.             else if(MM==3)    //處理上個(gè)月是2月份
  236.             {
  237.                 if((DD==1) && IsLeapYear(YY)==0)                    //不是閏年
  238.                 {
  239.                     DD    =    28;
  240.                     MM    --;
  241.                 }
  242.                 else    DD--;
  243.             }
  244.             else if(MM==1)    //處理1月份
  245.             {
  246.                 if(DD>1)    DD--;
  247.                 else        //新年第一天
  248.                 {               
  249.                     DD    =    31;
  250.                     MM    =    12;
  251.                     YY    --;
  252.                 }
  253.             }
  254.         }
  255.     }         

  256.     ConvertTime->year   =    YY;                //更新年
  257.     ConvertTime->mon    =    MM;                //更新月
  258.     ConvertTime->day    =    DD;                //更新日
  259.     ConvertTime->hour   =    hh;                //更新時(shí)
  260.     ConvertTime->min    =    mm;                //更新分
  261.     ConvertTime->sec    =    ss;                //更新秒
  262. }  
復(fù)制代碼

GPS_Decode_USART.rar (852.54 KB, 下載次數(shù): 262)

評(píng)分

參與人數(shù) 1黑幣 +1 收起 理由
jakcypater + 1 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:259048 發(fā)表于 2017-12-8 13:36 | 顯示全部樓層
謝謝分享 收藏了
回復(fù)

使用道具 舉報(bào)

ID:284564 發(fā)表于 2018-2-21 10:03 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:285281 發(fā)表于 2018-2-24 20:54 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:284545 發(fā)表于 2018-2-25 15:01 | 顯示全部樓層
用DMA接收,贊!謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:325793 發(fā)表于 2018-5-9 11:14 | 顯示全部樓層
非常感謝��!
回復(fù)

使用道具 舉報(bào)

ID:326405 發(fā)表于 2018-5-10 20:03 | 顯示全部樓層
謝謝分享,如果能做成小車拿來(lái)自動(dòng)導(dǎo)航定位應(yīng)該不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:328437 發(fā)表于 2018-5-12 19:24 | 顯示全部樓層
樓主 沒(méi)積分分享一下唄
回復(fù)

使用道具 舉報(bào)

ID:328729 發(fā)表于 2018-5-13 11:15 | 顯示全部樓層
非常感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:26748 發(fā)表于 2018-11-6 16:50 | 顯示全部樓層

樓主 沒(méi)積分分享一下唄
回復(fù)

使用道具 舉報(bào)

ID:364557 發(fā)表于 2018-11-6 18:36 | 顯示全部樓層
謝謝分享可惜黑幣不夠呀
回復(fù)

使用道具 舉報(bào)

ID:368791 發(fā)表于 2018-11-7 22:19 來(lái)自觸屏版 | 顯示全部樓層
有用stm32f系列的芯片編的實(shí)現(xiàn)GPS功能的源代碼?
回復(fù)

使用道具 舉報(bào)

ID:422675 發(fā)表于 2018-11-7 23:03 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:219315 發(fā)表于 2019-8-27 17:11 | 顯示全部樓層
非常感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:719586 發(fā)表于 2020-3-31 15:52 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:414023 發(fā)表于 2020-4-10 10:20 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:601433 發(fā)表于 2020-4-12 13:33 | 顯示全部樓層
優(yōu)秀�。。�!
回復(fù)

使用道具 舉報(bào)

ID:727275 發(fā)表于 2020-4-13 12:00 | 顯示全部樓層
感謝樓主,stm32f系列的芯片編的實(shí)現(xiàn)GPS功能
回復(fù)

使用道具 舉報(bào)

ID:504404 發(fā)表于 2020-5-6 00:04 | 顯示全部樓層
請(qǐng)問(wèn)在上位機(jī)顯示是用啥寫(xiě)的鴨
回復(fù)

使用道具 舉報(bào)

ID:832970 發(fā)表于 2020-10-22 02:13 | 顯示全部樓層
請(qǐng)問(wèn)下載后如何使用
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2020-10-22 02:47 | 顯示全部樓層
烤羊腿 發(fā)表于 2020-10-22 02:13
請(qǐng)問(wèn)下載后如何使用

看程序這個(gè)是在野火的板子上跑的
回復(fù)

使用道具 舉報(bào)

ID:284050 發(fā)表于 2021-7-7 22:04 | 顯示全部樓層
你這個(gè)涉及地球坐標(biāo)轉(zhuǎn)火星坐標(biāo)嗎
回復(fù)

使用道具 舉報(bào)

ID:867981 發(fā)表于 2025-3-31 14:57 | 顯示全部樓層
謝謝分享,收藏了
回復(fù)

使用道具 舉報(bào)

ID:66862 發(fā)表于 2025-4-8 23:10 | 顯示全部樓層
如何將個(gè)人搭建的GPS模塊,接入地圖顯示?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表