你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2064|回复: 4

【HAL库每天一例】第089例:GPS模块NEO-7M_GPS-SDCard

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-8-10 09:07:13 | 显示全部楼层 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

例程下载:
资料包括程序、相关说明资料以及软件使用截图

百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1
360云盘:http://yunpan.cn/OcPiRp3wEcA92u密码 cfb6
(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-122. GPS模块NEO-7M
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: 1. GPS-SDCard
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  UBLOX NEO-7M模块是一款高性能的GPS定位模块,是NEO-6M升级版GPS模块,该模块能满足专业定
位的严格要求, 模块带陶瓷有缘天线,信号超强。EEPROM掉电保存配置参数数据。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  
【3】操作及现象
  将一张小于32G大小的Micro SD卡插入到开发板上的SD卡槽内,使用开发板配套的MINI USB线连
接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱动),在电脑端打开串口调试助手
工具,设置参数为115200 8-N-1。将工程文件中的相关文件拉到SD卡。下载完程序之后,在串口调
试助手窗口可接收到信息。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
CubeMX_1.jpg
CubeMX_2.jpg
CubeMX_3.jpg
CubeMX_4.jpg
CubeMX_5.jpg
CubeMX_6.jpg
CubeMX_7.jpg
CubeMX_8.jpg
CubeMX_9.jpg
CubeMX_10.jpg



1. GPS-SDCard
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: nema_decode_test.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: GPS模块解码
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "stm32f1xx_hal.h"
  19. #include "usart/bsp_debug_usart.h"
  20. #include "ff.h"
  21. #include "nmea/nmea.h"

  22. /* 私有类型定义 --------------------------------------------------------------*/
  23. /* 私有宏定义 ----------------------------------------------------------------*/
  24. #define __GPS_DEBUG   1
  25. /* 私有变量 ------------------------------------------------------------------*/
  26. FIL file;                                                                                                        /* 文件对象 */
  27. UINT fnum;                                                      /* 文件成功读写数量 */
  28. char buff[2048];
  29.   
  30. /* 扩展变量 ------------------------------------------------------------------*/
  31. extern FRESULT f_res;                    /* 文件操作结果 */
  32. /* 私有函数原形 --------------------------------------------------------------*/
  33. /* 函数体 --------------------------------------------------------------------*/
  34. /**
  35.   * 函数功能: trace 在解码时输出捕获的GPS语句
  36.   * 输入参数: 无
  37.   * 返 回 值: 无
  38.   * 说    明:str: 要输出的字符串,str_size:数据长度
  39.   */
  40. void trace(const char *str, int str_size)
  41. {
  42. #ifdef __GPS_DEBUG    //配置这个宏,是否输出调试信息
  43.     uint16_t i;
  44.     printf("\r\nTrace: ");
  45.     for(i=0;i<str_size;i++)
  46.       printf("%c",*(str+i));
  47.   
  48.     printf("\n");
  49. #endif
  50. }

  51. /**
  52.   * 函数功能: error 在解码出错时输出提示消息
  53.   * 输入参数: 无
  54.   * 返 回 值: 无
  55.   * 说    明:str: 要输出的字符串,str_size:数据长度
  56.   */
  57. void error(const char *str, int str_size)
  58. {
  59. #ifdef __GPS_DEBUG   //配置这个宏,是否输出调试信息

  60.     uint16_t i;
  61.     printf("\r\nError: ");
  62.     for(i=0;i<str_size;i++)
  63.       printf("%c",*(str+i));
  64.     printf("\n");
  65. #endif
  66. }

  67. /**
  68.   * 函数功能: 判断闰年(仅针对于2000以后的年份)
  69.   * 输入参数: iYear    两位年数
  70.   * 返 回 值: uint8_t        1:为闰年    0:为平年
  71.   * 说    明:无
  72.   */
  73. static uint8_t IsLeapYear(uint8_t iYear)
  74. {
  75.     uint16_t    Year;
  76.     Year    =    2000+iYear;
  77.     if((Year&3)==0)
  78.     {
  79.         return ((Year%400==0) || (Year%100!=0));
  80.     }
  81.      return 0;
  82. }

  83. /**
  84.   * 函数功能: 格林尼治时间换算世界各时区时间
  85.   * 输入参数: *DT:表示日期时间的数组 格式 YY,MM,DD,HH,MM,SS
  86.   * 返 回 值: 无
  87.   * 说    明:AREA:1(+)东区 W0(-)西区   GMT:时区数
  88.   */
  89. void    GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA)
  90. {
  91.     uint32_t    YY,MM,DD,hh,mm,ss;        //年月日时分秒暂存变量
  92.      
  93.     if(GMT==0)    return;                //如果处于0时区直接返回
  94.     if(GMT>12)    return;                //时区最大为12 超过则返回         

  95.     YY    =    SourceTime->year;                //获取年
  96.     MM    =    SourceTime->mon;                 //获取月
  97.     DD    =    SourceTime->day;                 //获取日
  98.     hh    =    SourceTime->hour;                //获取时
  99.     mm    =    SourceTime->min;                 //获取分
  100.     ss    =    SourceTime->sec;                 //获取秒

  101.     if(AREA)                        //东(+)时区处理
  102.     {
  103.         if(hh+GMT<24)    hh    +=    GMT;//如果与格林尼治时间处于同一天则仅加小时即可
  104.         else                        //如果已经晚于格林尼治时间1天则进行日期处理
  105.         {
  106.             hh    =    hh+GMT-24;        //先得出时间
  107.             if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)    //大月份(12月单独处理)
  108.             {
  109.                 if(DD<31)    DD++;
  110.                 else
  111.                 {
  112.                     DD    =    1;
  113.                     MM    ++;
  114.                 }
  115.             }
  116.             else if(MM==4 || MM==6 || MM==9 || MM==11)                //小月份2月单独处理)
  117.             {
  118.                 if(DD<30)    DD++;
  119.                 else
  120.                 {
  121.                     DD    =    1;
  122.                     MM    ++;
  123.                 }
  124.             }
  125.             else if(MM==2)    //处理2月份
  126.             {
  127.                 if((DD==29) || (DD==28 && IsLeapYear(YY)==0))        //本来是闰年且是2月29日 或者不是闰年且是2月28日
  128.                 {
  129.                     DD    =    1;
  130.                     MM    ++;
  131.                 }
  132.                 else    DD++;
  133.             }
  134.             else if(MM==12)    //处理12月份
  135.             {
  136.                 if(DD<31)    DD++;
  137.                 else        //跨年最后一天
  138.                 {               
  139.                     DD    =    1;
  140.                     MM    =    1;
  141.                     YY    ++;
  142.                 }
  143.             }
  144.         }
  145.     }
  146.     else
  147.     {     
  148.         if(hh>=GMT)    hh    -=    GMT;    //如果与格林尼治时间处于同一天则仅减小时即可
  149.         else                        //如果已经早于格林尼治时间1天则进行日期处理
  150.         {
  151.             hh    =    hh+24-GMT;        //先得出时间
  152.             if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)    //上月是大月份(1月单独处理)
  153.             {
  154.                 if(DD>1)    DD--;
  155.                 else
  156.                 {
  157.                     DD    =    31;
  158.                     MM    --;
  159.                 }
  160.             }
  161.             else if(MM==5 || MM==7 || MM==10 || MM==12)                //上月是小月份2月单独处理)
  162.             {
  163.                 if(DD>1)    DD--;
  164.                 else
  165.                 {
  166.                     DD    =    30;
  167.                     MM    --;
  168.                 }
  169.             }
  170.             else if(MM==3)    //处理上个月是2月份
  171.             {
  172.                 if((DD==1) && IsLeapYear(YY)==0)                    //不是闰年
  173.                 {
  174.                     DD    =    28;
  175.                     MM    --;
  176.                 }
  177.                 else    DD--;
  178.             }
  179.             else if(MM==1)    //处理1月份
  180.             {
  181.                 if(DD>1)    DD--;
  182.                 else        //新年第一天
  183.                 {               
  184.                     DD    =    31;
  185.                     MM    =    12;
  186.                     YY    --;
  187.                 }
  188.             }
  189.         }
  190.     }         

  191.     ConvertTime->year   =    YY;                //更新年
  192.     ConvertTime->mon    =    MM;                //更新月
  193.     ConvertTime->day    =    DD;                //更新日
  194.     ConvertTime->hour   =    hh;                //更新时
  195.     ConvertTime->min    =    mm;                //更新分
  196.     ConvertTime->sec    =    ss;                //更新秒
  197. }  

  198. /**
  199.   * 函数功能: 对SD卡内的文件解码GPS文件信息
  200.   * 输入参数: 无
  201.   * 返 回 值: 无
  202.   * 说    明:无
  203.   */
  204. void nmea_decode_test(void)
  205. {
  206.   nmeaINFO info;          //GPS解码后得到的信息
  207.   nmeaPARSER parser;      //码时使用的数据结构  
  208.   
  209.   nmeaTIME beiJingTime;    //北京时间

  210.   /* 打开记录有GPS信息的文件 */
  211.   f_res = f_open(&file,"gpslog.txt", FA_OPEN_EXISTING|FA_READ);
  212.   printf("f_res=%d",f_res);
  213.   if(!(f_res == FR_OK))
  214.   {     
  215.     printf("\r\n打开gpslog.txt文件失败,请检查SD卡的根目录是否存放了gpslog.txt文件!\r\n");
  216.     return ;      
  217.   }
  218.   /* 设置用于输出调试信息的函数 */
  219.   nmea_property()->trace_func = &trace;
  220.   nmea_property()->error_func = &error;

  221.   /* 初始化GPS数据结构 */
  222.   nmea_zero_INFO(&info);
  223.   nmea_parser_init(&parser);

  224.   while(!f_eof(&file))
  225.   {
  226.    
  227.     f_read(&file, &buff[0], 100, &fnum);

  228.     /* 进行nmea格式解码 */
  229.     nmea_parse(&parser, &buff[0], fnum, &info);
  230.   
  231.     /* 对解码后的时间进行转换,转换成北京时间 */
  232.     GMTconvert(&info.utc,&beiJingTime,8,1);
  233.    
  234.     /* 输出解码得到的信息 */
  235.     printf("\r\n时间%d,%d,%d,%d,%d,%d", beiJingTime.year+1900, beiJingTime.mon+1,beiJingTime.day,beiJingTime.hour,beiJingTime.min,beiJingTime.sec);
  236.     printf("\r\n纬度:%f,经度%f\r\n",info.lat/100,info.lon/100);
  237.     printf("\r\n正在使用的卫星:%d,可见卫星:%d",info.satinfo.inuse,info.satinfo.inview);
  238.     printf("\r\n海拔高度:%f 米 ", info.elv);
  239.     printf("\r\n速度:%f km/h ", info.speed);
  240.     printf("\r\n航向:%f 度", info.direction);
  241.         }
  242.   f_lseek(&file, f_size(&file));

  243.   /* 释放GPS数据结构 */
  244.   nmea_parser_destroy(&parser);  
  245.   /* 关闭文件 */
  246.   f_close(&file);
  247. }

  248. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
串口调试助手截图.jpg


回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-8-10 09:36:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

60

回帖

0

蝴蝶豆

初级会员

最后登录
2017-12-7
发表于 2016-8-10 11:52:06 | 显示全部楼层
學習了,感謝你的分享
回复 支持 反对

使用道具 举报

9

主题

436

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-9-20
发表于 2016-8-10 20:41:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

初级会员

最后登录
2017-11-19
发表于 2017-9-8 20:13:47 | 显示全部楼层
想问一个关于GPS的问题,通过串口收到GPS发回的消息如下,总是无效信息,重启没有效果,去了空旷的地方没效果,请教一下还有什么办法吗?
$GNRMC,,V,,,,,,,,,,N*4D
$GNVTG,,,,,,,,,N*2E
$GNGGA,,,,,,0,00,99.99,,,,,,*56
$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GNGLL,,,,,,V,N*7A
V,1,1,00*65
$GNGLL,,,,,,V,N*7A
2,MOD=NEO-M8N-0*67
$GNTXT,01,01,02,FIS=0xEF4015 (100111)*58
$GNTXT,01,01,02,GPS;GLO;GAL;BDS*77
$GNTXT,01,01,02,SBAS;IMES;QZSS*49
$GNTXT,01,01,02,GNSS OTP=GPS;GLO*37
$GNTXT,01,01,02,LLC=FFFFFFFF-FFFFFFED-FFFFFFFF-FFFFFFFF-FFFFFF69*23
$GNTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*3E
$GNTXT,01,01,02,ANTSTATUS=DONTKNOW*2D
$GNTXT,01,01,02,PF=3FF*4B
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版