基于STM32的GPS北斗定位系统

1. 系统功能介绍

本系统是一种基于STM32微控制器平台的GPS北斗双模定位系统,结合GPS模块与OLED显示模块,实现对时间信息(年、月、日、时、分、秒)及空间信息(经度、纬度)的实时获取与显示,并将数据通过串口通信方式发送到上位机,实现多终端信息同步查看。

该系统功能主要包括:

  1. 时间与位置信息获取:通过GPS模块(兼容北斗)实时接收卫星信号,解析NMEA标准语句,提取当前的年月日时分秒及经纬度数据;
  2. OLED屏幕显示:使用OLED屏幕进行信息的本地可视化展示,包括时间和位置,便于设备独立运行;
  3. 串口数据上送:将解析后的数据通过STM32的串口接口发送至上位机,便于调试、监控及数据采集存储;
  4. 模块化结构设计:系统采用模块化设计思想,便于扩展其他功能,如SD卡存储、地图定位、蓝牙传输等。

2. 系统电路设计

本系统的硬件设计围绕STM32微控制器进行展开,外设模块包括GPS模块、OLED显示模块、电源管理模块及串口通信模块。下面详细介绍每一个模块。

2.1 主控模块(STM32F103C8T6)

STM32F103C8T6是一款基于ARM Cortex-M3内核的高性能32位MCU,具有如下特点:

  • 主频72MHz,处理能力强,满足GPS数据解析需求;
  • 内置USART模块,可直接与GPS模块通信;
  • 丰富的GPIO接口,适配OLED模块及其他扩展;
  • 低功耗特性,适用于便携式定位设备。

主控芯片是系统核心,负责接收、解析GPS数据,控制OLED显示,并将处理后的数据经串口输出。


2.2 GPS定位模块(NEO-6M)

该模块支持GPS与北斗双模定位,输出标准NMEA格式的定位语句。

  • 通信方式:串口(TTL电平);

  • 波特率:默认9600bps;

  • 输出格式:标准NMEA语句(如GPRMC、GPGGA);

  • 天线类型:陶瓷有源天线,增强信号接收;

  • 精度:水平精度2.5米,速度精度0.1m/s;

  • 数据内容

    • $GPRMC:包含时间、定位状态、纬度、经度、速度、日期等;
    • $GPGGA:包含位置精度、卫星数量、HDOP等。

STM32接收该模块输出的串口数据后进行解析,并提取需要的定位信息。


2.3 显示模块(OLED 0.96寸)

OLED采用I2C通信接口,与STM32连接展示当前定位时间及坐标信息。

  • 分辨率:128x64;
  • 通信方式:I2C(SCL、SDA);
  • 工作电压:3.3V;
  • 显示内容:年月日、时分秒、经度、纬度。

优点在于功耗低、对比度高、视角广,是嵌入式可视化界面的首选。


2.4 串口通信模块

用于与电脑上位机通信(如串口调试助手):

  • 通信方式:USART1(TX/RX);
  • 连接方式:TTL转USB模块(如CH340、PL2303);
  • 功能:将解析后的定位信息发送给电脑,便于远程监控或调试;
  • 波特率:9600bps或115200bps。

2.5 电源管理模块

系统使用5V供电,可通过USB口供电,然后通过AMS1117稳压芯片降压至3.3V供STM32与OLED模块使用。GPS模块本身可接受3.3V至5V范围电压。


3. 程序设计

整个系统程序由以下几个部分组成:

  • GPS串口初始化与数据接收;
  • NMEA语句解析模块;
  • OLED显示模块;
  • 串口发送模块;
  • 主控制逻辑流程。

程序使用HAL库或标准外设库进行编写。


3.1 串口初始化及接收

void USART1_Init(uint32_t baudrate) {
    RCC_APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
    // 配置PA9为复用推挽输出(TX),PA10为浮空输入(RX)

    GPIOA->CRH &= ~((0xF << 4) | (0xF << 8));
    GPIOA->CRH |=  (0xB << 4) | (0x4 << 8); // PA9: AF_PP, PA10: IN_FLOATING

    USART1->BRR = SystemCoreClock / baudrate;
    USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_UE;
    NVIC_EnableIRQ(USART1_IRQn);
}

char GPS_Buffer[100];
uint8_t GPS_Index = 0;

void USART1_IRQHandler(void) {
    if (USART1->SR & USART_SR_RXNE) {
        char ch = USART1->DR;
        if (ch == '\n') {
            GPS_Buffer[GPS_Index] = '\0';
            GPS_Index = 0;
            Parse_GPS(GPS_Buffer);
        } else {
            GPS_Buffer[GPS_Index++] = ch;
            if (GPS_Index >= 100) GPS_Index = 0;
        }
    }
}

3.2 GPS数据解析模块

void Parse_GPS(char* str) {
    if (strncmp(str, "$GPRMC", 6) == 0) {
        char* token;
        char* fields[12];
        uint8_t i = 0;

        token = strtok(str, ",");
        while (token && i < 12) {
            fields[i++] = token;
            token = strtok(NULL, ",");
        }

        if (i >= 10 && strcmp(fields[2], "A") == 0) {
            Display_Time(fields[1], fields[9]);
            Display_Position(fields[3], fields[4], fields[5], fields[6]);
            Send_To_PC(fields[1], fields[3], fields[5]);
        }
    }
}

3.3 OLED显示模块

void Display_Time(char* time, char* date) {
    char buf[20];
    sprintf(buf, "Time: %.2s:%.2s:%.2s", time, time+2, time+4);
    OLED_ShowString(0, 0, buf);

    sprintf(buf, "Date: 20%.2s-%.2s-%.2s", date+4, date+2, date);
    OLED_ShowString(0, 2, buf);
}

void Display_Position(char* lat, char* NS, char* lon, char* EW) {
    char buf[20];
    sprintf(buf, "Lat: %s %s", lat, NS);
    OLED_ShowString(0, 4, buf);

    sprintf(buf, "Lon: %s %s", lon, EW);
    OLED_ShowString(0, 6, buf);
}

3.4 串口数据上送模块

void Send_To_PC(char* time, char* lat, char* lon) {
    char msg[100];
    sprintf(msg, "Time: %.2s:%.2s:%.2s, Lat: %s, Lon: %s\r\n",
            time, time+2, time+4, lat, lon);

    for (uint8_t i = 0; i < strlen(msg); i++) {
        while (!(USART1->SR & USART_SR_TXE));
        USART1->DR = msg[i];
    }
}

3.5 主函数结构

int main(void) {
    HAL_Init();
    SystemClock_Config();
    OLED_Init();
    USART1_Init(9600);

    OLED_ShowString(0, 0, "Waiting for GPS...");

    while (1) {
        // 所有数据在中断中接收处理
    }
}

4. 系统特点与扩展

4.1 系统优势

  • 定位精准:采用北斗+GPS双模定位模块,数据稳定;
  • 显示直观:OLED显示模块清晰显示时间与位置;
  • 调试方便:通过串口发送到上位机,便于数据分析与记录;
  • 模块化设计:便于后期扩展其他传感器或功能;
  • 低功耗运行:适合便携式设备长期运行。

4.2 可扩展功能

  • SD卡存储定位轨迹
  • 蓝牙或WiFi模块无线发送定位信息
  • 结合地图平台进行实时显示
  • 加入按键控制菜单、刷新频率等参数设置
  • 支持断电数据保持与回显

5. 总结

本设计是一款基于STM32微控制器的GPS/北斗双模定位系统,实现了从卫星信号接收、数据解析、信息显示、到数据发送的完整闭环流程。系统响应快、精度高、界面直观,适合应用于小型定位系统开发、移动终端导航原型、嵌入式通信教学等领域。在保持核心功能稳定的基础上,该系统也预留了丰富的接口与扩展能力,为后期功能拓展提供良好的平台。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐