找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21031|回复: 21
收起左侧

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, 下载次数: 260)

评分

参与人数 1黑币 +1 收起 理由
jakcypater + 1 赞一个!

查看全部评分

回复

使用道具 举报

ID:259048 发表于 2017-12-8 13:36 | 显示全部楼层
谢谢分享 收藏了
回复

使用道具 举报

ID:284564 发表于 2018-2-21 10:03 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:285281 发表于 2018-2-24 20:54 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:284545 发表于 2018-2-25 15:01 | 显示全部楼层
用DMA接收,赞!谢谢分享!
回复

使用道具 举报

ID:325793 发表于 2018-5-9 11:14 | 显示全部楼层
非常感谢!!
回复

使用道具 举报

ID:326405 发表于 2018-5-10 20:03 | 显示全部楼层
谢谢分享,如果能做成小车拿来自动导航定位应该不错
回复

使用道具 举报

ID:328437 发表于 2018-5-12 19:24 | 显示全部楼层
楼主 没积分分享一下呗
回复

使用道具 举报

ID:328729 发表于 2018-5-13 11:15 | 显示全部楼层
非常感谢楼主
回复

使用道具 举报

ID:26748 发表于 2018-11-6 16:50 | 显示全部楼层

楼主 没积分分享一下呗
回复

使用道具 举报

ID:364557 发表于 2018-11-6 18:36 | 显示全部楼层
谢谢分享可惜黑币不够呀
回复

使用道具 举报

ID:368791 发表于 2018-11-7 22:19 来自手机 | 显示全部楼层
有用stm32f系列的芯片编的实现GPS功能的源代码?
回复

使用道具 举报

ID:422675 发表于 2018-11-7 23:03 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:219315 发表于 2019-8-27 17:11 | 显示全部楼层
非常感谢楼主
回复

使用道具 举报

ID:719586 发表于 2020-3-31 15:52 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:414023 发表于 2020-4-10 10:20 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:601433 发表于 2020-4-12 13:33 | 显示全部楼层
优秀!!!!
回复

使用道具 举报

ID:727275 发表于 2020-4-13 12:00 | 显示全部楼层
感谢楼主,stm32f系列的芯片编的实现GPS功能
回复

使用道具 举报

ID:504404 发表于 2020-5-6 00:04 | 显示全部楼层
请问在上位机显示是用啥写的鸭
回复

使用道具 举报

ID:832970 发表于 2020-10-22 02:13 | 显示全部楼层
请问下载后如何使用
回复

使用道具 举报

ID:328014 发表于 2020-10-22 02:47 | 显示全部楼层
烤羊腿 发表于 2020-10-22 02:13
请问下载后如何使用

看程序这个是在野火的板子上跑的
回复

使用道具 举报

ID:284050 发表于 2021-7-7 22:04 | 显示全部楼层
你这个涉及地球坐标转火星坐标吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表