久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23143|回復: 23
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:196137 發表于 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傳輸結束標志 */
  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中斷服務函數
  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;                //設置半傳輸完成標志位
  35.     DMA_ClearFlag(GPS_DMA_FLAG_HT);
  36.   }
  37.   else if(DMA_GetITStatus(GPS_DMA_IT_TC))     /* DMA 傳輸完成 */
  38.   {
  39.     GPS_TransferEnd = 1;                    //設置傳輸完成標志位
  40.     DMA_ClearFlag(GPS_DMA_FLAG_TC);

  41.    }
  42. }


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

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

  56.                 /*內存地址(要傳輸的變量的指針)*/
  57.                 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gps_rbuff;

  58.                 /*方向:從內存到外設*/               
  59.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;        

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

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

  64.                 /*內存地址自增*/
  65.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;        

  66.                 /*外設數據單位*/        
  67.                 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  68.                 /*內存數據單位 8bit*/
  69.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         

  70.                 /*DMA模式:不斷循環*/
  71.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         

  72.                 /*優先級:中*/        
  73.                 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  

  74.                 /*禁止內存到內存的傳輸        */
  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發送完成后產生中斷

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

  87.    
  88. }

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



  100. /**
  101.   * @brief  trace 在解碼時輸出捕獲的GPS語句
  102.   * @param  str: 要輸出的字符串,str_size:數據長度
  103.   * @retval 無
  104.   */
  105. void trace(const char *str, int str_size)
  106. {
  107.   #ifdef __GPS_DEBUG    //在gps_config.h文件配置這個宏,是否輸出調試信息
  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 在解碼出錯時輸出提示消息
  118.   * @param  str: 要輸出的字符串,str_size:數據長度
  119.   * @retval 無
  120.   */
  121. void error(const char *str, int str_size)
  122. {
  123.     #ifdef __GPS_DEBUG   //在gps_config.h文件配置這個宏,是否輸出調試信息

  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. **     函數名稱:            bit        IsLeapYear(uint8_t    iYear)
  133. **    功能描述:            判斷閏年(僅針對于2000以后的年份)
  134. **    入口參數:            iYear    兩位年數
  135. **    出口參數:            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. **     函數名稱:            void    GMTconvert(uint8_t *DT,uint8_t GMT,uint8_t AREA)
  149. **    功能描述:            格林尼治時間換算世界各時區時間
  150. **    入口參數:            *DT:    表示日期時間的數組 格式 YY,MM,DD,HH,MM,SS
  151. **                        GMT:    時區數
  152. **                        AREA:    1(+)東區 W0(-)西區
  153. ********************************************************************************************************/
  154. void    GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA)
  155. {
  156.     uint32_t    YY,MM,DD,hh,mm,ss;        //年月日時分秒暫存變量
  157.      
  158.     if(GMT==0)    return;                //如果處于0時區直接返回
  159.     if(GMT>12)    return;                //時區最大為12 超過則返回         

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

  166.     if(AREA)                        //東(+)時區處理
  167.     {
  168.         if(hh+GMT<24)    hh    +=    GMT;//如果與格林尼治時間處于同一天則僅加小時即可
  169.         else                        //如果已經晚于格林尼治時間1天則進行日期處理
  170.         {
  171.             hh    =    hh+GMT-24;        //先得出時間
  172.             if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)    //大月份(12月單獨處理)
  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月單獨處理)
  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))        //本來是閏年且是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;    //如果與格林尼治時間處于同一天則僅減小時即可
  214.         else                        //如果已經早于格林尼治時間1天則進行日期處理
  215.         {
  216.             hh    =    hh+24-GMT;        //先得出時間
  217.             if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)    //上月是大月份(1月單獨處理)
  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月單獨處理)
  227.             {
  228.                 if(DD>1)    DD--;
  229.                 else
  230.                 {
  231.                     DD    =    30;
  232.                     MM    --;
  233.                 }
  234.             }
  235.             else if(MM==3)    //處理上個月是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;                //更新時
  260.     ConvertTime->min    =    mm;                //更新分
  261.     ConvertTime->sec    =    ss;                //更新秒
  262. }  
復制代碼

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

評分

參與人數 1黑幣 +1 收起 理由
jakcypater + 1 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏21 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:259048 發表于 2017-12-8 13:36 | 只看該作者
謝謝分享 收藏了
回復

使用道具 舉報

板凳
ID:284564 發表于 2018-2-21 10:03 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:285281 發表于 2018-2-24 20:54 | 只看該作者
謝謝分享!
回復

使用道具 舉報

5#
ID:284545 發表于 2018-2-25 15:01 | 只看該作者
用DMA接收,贊!謝謝分享!
回復

使用道具 舉報

6#
ID:325793 發表于 2018-5-9 11:14 | 只看該作者
非常感謝!!
回復

使用道具 舉報

7#
ID:326405 發表于 2018-5-10 20:03 | 只看該作者
謝謝分享,如果能做成小車拿來自動導航定位應該不錯
回復

使用道具 舉報

8#
ID:328437 發表于 2018-5-12 19:24 | 只看該作者
樓主 沒積分分享一下唄
回復

使用道具 舉報

9#
ID:328729 發表于 2018-5-13 11:15 | 只看該作者
非常感謝樓主
回復

使用道具 舉報

10#
ID:26748 發表于 2018-11-6 16:50 | 只看該作者

樓主 沒積分分享一下唄
回復

使用道具 舉報

11#
ID:364557 發表于 2018-11-6 18:36 | 只看該作者
謝謝分享可惜黑幣不夠呀
回復

使用道具 舉報

12#
ID:368791 發表于 2018-11-7 22:19 來自手機 | 只看該作者
有用stm32f系列的芯片編的實現GPS功能的源代碼?
回復

使用道具 舉報

13#
ID:422675 發表于 2018-11-7 23:03 | 只看該作者
謝謝分享!
回復

使用道具 舉報

14#
ID:219315 發表于 2019-8-27 17:11 | 只看該作者
非常感謝樓主
回復

使用道具 舉報

15#
ID:719586 發表于 2020-3-31 15:52 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

16#
ID:414023 發表于 2020-4-10 10:20 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

17#
ID:601433 發表于 2020-4-12 13:33 | 只看該作者
優秀!!!!
回復

使用道具 舉報

18#
ID:727275 發表于 2020-4-13 12:00 | 只看該作者
感謝樓主,stm32f系列的芯片編的實現GPS功能
回復

使用道具 舉報

19#
ID:504404 發表于 2020-5-6 00:04 | 只看該作者
請問在上位機顯示是用啥寫的鴨
回復

使用道具 舉報

20#
ID:832970 發表于 2020-10-22 02:13 | 只看該作者
請問下載后如何使用
回復

使用道具 舉報

21#
ID:328014 發表于 2020-10-22 02:47 | 只看該作者
烤羊腿 發表于 2020-10-22 02:13
請問下載后如何使用

看程序這個是在野火的板子上跑的
回復

使用道具 舉報

22#
ID:284050 發表于 2021-7-7 22:04 | 只看該作者
你這個涉及地球坐標轉火星坐標嗎
回復

使用道具 舉報

23#
ID:867981 發表于 2025-3-31 14:57 | 只看該作者
謝謝分享,收藏了
回復

使用道具 舉報

24#
ID:66862 發表于 2025-4-8 23:10 | 只看該作者
如何將個人搭建的GPS模塊,接入地圖顯示?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久国产一区二区三区四区小说 | 成人av一区二区三区 | 欧美中文字幕一区二区 | 欧美高清免费 | 伊人在线| 超碰导航| 欧美精品一区在线 | av一区二区三区四区 | 免费人成在线观看网站 | 日韩一级欧美一级 | 亚洲精品国产综合区久久久久久久 | 超碰97免费在线 | 国产中文 | 亚洲三区视频 | 成人在线播放 | 久久99精品久久久久久国产越南 | 国产乱码精品一品二品 | 久久国产激情视频 | 91成人精品 | 天堂视频免费 | 久久精品天堂 | 精品国产伦一区二区三区观看体验 | 欧美日韩三区 | 7777在线| 国产一级在线 | 欧美一级二级在线观看 | 日韩在线小视频 | 国产精品不卡视频 | 成人不卡一区二区 | 91久久精品一区二区二区 | 欧美综合久久久 | 久久免费精彩视频 | 天堂网中文字幕在线观看 | 亚洲精品9999 | 日韩综合在线 | 四虎永久免费黄色影片 | 中文字幕精品一区二区三区在线 | 欧美日韩精品久久久免费观看 | 狼人伊人影院 | 91在线网站 | 国产黄色大片 |