基于STM32和GPS-NEO-6M模块实现GPS导航定位的
0. 前言
1. NMEA-0183协议
1、“$”——帧命令起始位
2、aaccc——地址域,前两位为识别符,后三位为语句名
3、ddd…ddd——数据
4、“*”——校验和前缀
5、hh——校验和(check sum),$与*之间所有字符ASCII码的校验和(各字节做异或运算,得到校验和后,再转换16进制格式的ASCII字符。)
6、<CR><LF>——CR(Carriage Return) + LF(Line Feed)帧结束,回车和换行。
2. UBX协议
用于配置
UBX码是u-blox公司UBX就是用串口来控制模块的一种协议,钟对于u-blox的系列产品进行的控制精简代码,输出的代码主要是对模块进行软硬件及功能方面的控制,如模块的冷启动,热启动,温启动,启动模式选择,刷新速率,波特率,定位精度,天线检测等等,均可以通过UBX代码来通过MCU使用COM口来对模块来进行控制。
3. 程序设计
3.1 usart3.c
详细代码如下:
#include "delay.h"
#include "usart3.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "timer.h"//串口接收缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN字节.
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节//通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
vu16 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&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据{ if(USART3_RX_STA<USART3_MAX_RECV_LEN) //还可以接收数据{TIM_SetCounter(TIM7,0);//计数器清空 //计数器清空if(USART3_RX_STA==0) //使能定时器7的中断 {TIM_Cmd(TIM7,ENABLE);//使能定时器7}USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值 }else {USART3_RX_STA|=1<<15; //强制标记接收完成} }}
} //初始化IO 串口3
//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_GPIOB, ENABLE); // GPIOB时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能USART_DeInit(USART3); //复位串口3//USART3_TX PB10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10//USART3_RX PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11USART_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); //初始化串口 3USART_Cmd(USART3, ENABLE); //使能串口 //使能接收中断USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断 //设置中断优先级NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器TIM7_Int_Init(99,7199); //10ms中断USART3_RX_STA=0; //清零TIM_Cmd(TIM7,DISABLE); //关闭定时器7}//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap; va_start(ap,fmt);vsprintf((char*)USART3_TX_BUF,fmt,ap); //vsprintf,把数据按照fmt格式存入USART3_TX_BUF中,ap为数据头的指针va_end(ap);i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度for(j=0;j<i;j++) //循环发送数据{while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //检测这一字节信息是否发送完成,发送完成则进行下一字节的发送USART_SendData(USART3,USART3_TX_BUF[j]); }
}
分为3个函数: 1. USART3_IRQHandler串口3的中断处理函数 2. usart3_init 初始化函数 3. u3_printf把要发送的数据存入缓冲区,进行发送
3.2 gps.c
主要负责数据解析
子函数分为NMEA信息解析和UBLOX配置发送。
基于STM32和GPS-NEO-6M模块实现GPS导航定位的相关推荐
- K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示
K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 UART对应程序: IIC对应程序: 四.部分 ...
- 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)
本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...
- K_A14_001 基于STM32等单片机驱动MPU6050模块 串口与OLED0.96双显示
K_A14_001 基于STM32等单片机驱动MPU6050模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接线引 ...
- 基于STM32单片机智能手表GSM短信GPS定位设计(毕业设计资料)
本设计由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成. 1.液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换 ...
- 基于stm32的正点原子Lora模块教程
基于stm32的LoRa模块调试教程 初识LoRa 上手LoRa 程序编写 结果演示 再见LoRa 初识LoRa 简单来讲,LoRa就是一种低功耗远程无线通信技术.它是基于Semtech公司SX127 ...
- 基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)
一.环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP: 采用QT ...
- 基于stm32和ESP8266实现wifi模块smartlink功能以及TCP连接
一直想把wifi模块和stm32连接起来,但是网上找了很久,并没有C语言相关的库,只有基于arduino的ESP8266 C++库,这个库是没办法直接给stm32使用的,所以自己动手丰衣足食,自己手动 ...
- 基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)
1. 前言 随着人们生活节奏的加快,促使物流行业突飞猛进的快速的发展,物流行业的快速发展也导致物流过程出现了一系列的问题.近年来贵重物品在物流中的比例越来越多,同时贵重物流在物流过程中的丢失也越来越多 ...
- 基于STM32的正点原子LORA模块通信网络
LoRa是semtech公司开发的一种低功耗局域网无线标准,其名称"LoRa"是远距离无线电(Long Range Radio),它最大特点就是在同样的功耗条件下比其他无线方式传播 ...
- K_A08_004 基于 STM32等单片机驱动MX1919模块按键控制直流电机正反转加减速启停
目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 1.MX1919模块驱动时序 2.对应程序: 3.PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+MX1919 ...
最新文章
- [Springboot实战] 集成 Caffeine
- S/4HANA中的销售计划管理
- 携程二季度净利润降55% 促销被指“玩烟幕弹”
- C++网络编程(一)
- 在html中不是链接目标属性,在HTML中,()不是链接的目标属性。
- healthd: battery l=1 v=0 t=27.0 h=2 st=1 chg=a 注释方法
- 手机版腐蚀rust_手机进水后黑屏,该怎么办?切忌做这几件事
- mysql中主从复制配置文件_MySQL主从复制 配置文件实例
- QTP中VBS脚本下FSO、WSH的应用(二)
- 分块 数据不相同_ArcGIS四分法分幅栅格数据(超强版)
- javascript表格可以输入数据_最火8套测量自动计算表格,输入数据直接得结果,效率提升80%...
- javascript--函数(一)
- Nginx根据url参数匹配跳转
- Java面向对象day03
- 计算机上怎样保护c盘,6个方法教你释放你的C盘空间
- ​stp文件转gltf
- 选择二极管要考虑哪些点?
- FTP服务器,部署YUM仓库,NFS共享服务
- 【Python学习教程】P1-安装python 3.10.0
- 微信小程序更改头像昵称