基于STM32的GPS北斗定位系统
基于STM32的GPS北斗定位系统
1 功能介绍
本设计基于STM32单片机,实现了一个小型的GPS/北斗定位系统。系统通过GPS模块获取当前的时间信息(年月日时分秒)以及地理位置信息(经度、纬度),并在OLED液晶屏上进行实时显示。同时,系统还通过串口通信将数据传输至电脑上位机,用户可以通过串口调试助手实时查看定位结果。
该系统具有以下主要功能:
- 利用GPS模块获取时间与位置参数,包括经度、纬度、日期与时间。
- 将接收到的数据经过STM32单片机处理后,实时显示在OLED液晶屏上。
- 通过STM32串口功能,将解析后的数据发送到电脑上位机,便于调试和保存。
- 系统体积小巧、功耗低,适合移动定位与实验教学使用。
该系统不仅可以作为基础的定位应用实验平台,还可以扩展至智能交通、车辆定位、户外导航等实际应用中。
2 系统电路设计
系统电路主要由三大部分组成:STM32最小系统电路、GPS定位模块电路、OLED液晶显示电路,同时还包括电源电路和串口通信电路。下面分别介绍各个模块的设计。
2.1 STM32最小系统电路
STM32F103C8T6单片机作为主控芯片,负责数据的采集、处理与显示。最小系统电路主要包括:
- 时钟电路:采用外部8MHz晶振,通过PLL倍频得到72MHz主频,保证系统运算能力。
- 复位电路:由电容、电阻和复位按键构成,保证系统在上电和故障时能够正常复位。
- 电源电路:STM32工作电压为3.3V,因此需要稳压芯片(如AMS1117-3.3)将5V电压转换为3.3V。
2.2 GPS定位模块电路
GPS模块(如NEO-6M、ATGM336H等)通过串口与STM32相连,负责接收卫星信号并输出NMEA标准格式的定位数据。
- GPS模块一般通过UART接口输出数据,波特率常用9600bps。
- TXD引脚连接STM32的USART1_RX引脚,用于数据接收。
- 模块工作电压为3.3V,部分模块自带稳压芯片,可兼容5V输入。
2.3 OLED显示电路
OLED液晶屏采用0.96英寸128×64点阵的I2C接口OLED模块,具有体积小、功耗低、对比度高的特点。
- 通过I2C总线与STM32相连,SCL和SDA分别接单片机的I2C引脚。
- 显示内容包括时间信息(年月日时分秒)和经纬度信息。
- 显示采用字符模式和适当的分行布局,保证清晰易读。
2.4 串口通信电路
STM32通过USART1接口与电脑通信。
- STM32的TXD和RXD分别通过USB转TTL模块(如CH340/CP2102)与电脑USB口相连。
- 在上位机串口调试助手中,可以实时查看STM32输出的定位数据。
2.5 电源电路
系统供电为5V,来自USB接口或外部电源。通过AMS1117-3.3稳压芯片,分别为STM32和GPS模块提供3.3V电压。
3 程序设计
程序设计分为以下几个主要部分:串口初始化、GPS数据接收与解析、OLED显示以及上位机数据发送。
3.1 串口初始化模块
串口用于与GPS模块和上位机通信,需要初始化波特率、数据位、校验位等参数。
void USART1_Init(u32 bound)
{// GPIO端口配置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// TX PA9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// RX PA10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 串口参数配置USART_InitStructure.USART_BaudRate = bound;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE);
}
3.2 GPS数据接收与解析模块
GPS模块输出的是标准的NMEA格式字符串,例如:
$GPRMC,092751.000,A,5321.6802,N,00630.3372,W,0.06,31.66,280511,,,A*45
其中包含时间、经纬度等信息。STM32通过串口接收后,需要对其进行解析。
char rxBuffer[100];
u8 rxIndex = 0;void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){char res = USART_ReceiveData(USART1);if(res == '\n'){rxBuffer[rxIndex] = '\0';ParseGPS(rxBuffer);rxIndex = 0;}else{rxBuffer[rxIndex++] = res;}}
}// GPS数据解析函数
void ParseGPS(char *buf)
{if(strstr(buf,"GPRMC")){char *p = strtok(buf, ",");int index = 0;while(p){if(index == 1) printf("UTC时间: %s\n", p);if(index == 3) printf("纬度: %s\n", p);if(index == 5) printf("经度: %s\n", p);p = strtok(NULL, ",");index++;}}
}
3.3 OLED显示模块
OLED用于显示日期时间和经纬度信息,便于用户直观查看。
void OLED_ShowGPSInfo(char* time, char* lat, char* lon)
{OLED_Clear();OLED_ShowString(0,0,"GPS Info:");OLED_ShowString(0,2,"Time:");OLED_ShowString(40,2,time);OLED_ShowString(0,4,"Lat:");OLED_ShowString(40,4,lat);OLED_ShowString(0,6,"Lon:");OLED_ShowString(40,6,lon);
}
3.4 上位机串口输出模块
STM32将解析后的GPS数据通过串口发送至电脑,可以在串口调试助手中查看。
void USART1_SendString(char *str)
{while(*str){USART_SendData(USART1, *str++);while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);}
}
在主程序中调用:
int main(void)
{USART1_Init(9600);OLED_Init();while(1){if(gpsDataReady){OLED_ShowGPSInfo(gpsTime, gpsLat, gpsLon);USART1_SendString("Time: ");USART1_SendString(gpsTime);USART1_SendString("\r\nLat: ");USART1_SendString(gpsLat);USART1_SendString("\r\nLon: ");USART1_SendString(gpsLon);USART1_SendString("\r\n");gpsDataReady = 0;}}
}
4 总结
基于STM32的GPS北斗定位系统通过STM32单片机、GPS模块和OLED显示模块的协同工作,实现了从数据采集、解析到显示与上传的完整功能链。系统能够实时获取年月日时分秒及经纬度信息,并直观地显示在OLED屏幕上,同时通过串口传输至电脑,便于记录与调试。
本系统设计简洁、功能实用,既可作为教学实验平台,也可以作为嵌入式定位应用的原型机。未来还可以扩展SD卡数据存储、GSM短信发送或WiFi联网功能,从而实现更加智能化和多样化的应用场景。