高级
30 分钟

使用UM980和STM32F031K6实现高精度导航和定位

多频GNSS RTK定位解决方案

GNSS RTK 5 Click with Nucleo 32 with STM32F031K6 MCU

已发布 1月 29, 2025

点击板

GNSS RTK 5 Click

开发板

Nucleo 32 with STM32F031K6 MCU

编译器

NECTO Studio

微控制器单元

STM32F031K6

具有多频 GNSS 和抗干扰技术的导航与定位解决方案,非常适合测绘、农业、无人机(UAV)和机器人应用

A

A

硬件概览

它是如何工作的?

GNSS RTK 5 Click 基于 Unicore 的 UM980,这是一款支持全星座多频 RTK 定位的模块。UM980 采用了 Unicore 的 NebulasIV SoC,这是一种集成 RF 基带和高级高精度算法的 GNSS 系统级芯片(SoC)。该 SoC 还包含双核 CPU、高速浮点处理器,以及一个专用的 RTK 协处理器,支持多达 1408 个通道,提供无与伦比的信号处理能力。UM980 支持多种卫星星座,包括 GPS、北斗(BDS)、GLONASS、Galileo、QZSS、NavIC、SBAS 和 L-Band,适用于全球高精度应用。其集成的 JamShield 自适应抗干扰技术进一步增强了信号可靠性,即使在密集城市环境和浓密遮挡区域等复杂环境中,也能实现快速初始化、卓越的测量精度和无与伦比的可靠性。凭借这些先进特性,GNSS RTK 5 Click 在测绘与制图、精准农业、无人机(UAV)和自主机器人等高精度导航与定位场景中表现卓越。UM980 与主机 MCU 通过 UART 接口通信,使用标准的 UART RX 和 TX 引脚

进行高效数据传输。模块默认通信速度为 115200bps,可通过 AT 命令实现无缝数据交换。尽管模块包括用于 I2C 接口的引脚,但现有固件版本暂不支持该功能。此外,板上还配备复位(RST)引脚和复位按钮,以便在必要时对模块进行硬复位。此板还包括 USB Type-C 接口,支持 USB 2.0 全速 12Mbps 硬件功能,可通过 PC 提供电源和配置。此功能由 CP2102N 高度集成的 USB 转 UART 桥接芯片实现,同时配备 MCP1826 LDO 稳压器,将 USB 电源转换为模块所需的 3.3V,使其支持独立配置。板载专用测试点是一个显著特点,其中测试点 3 和 4 对应模块的 CAN TX 和 RX 信号,工作在 LVTTL 电平,可为特定用户需求提供附加功能。此外,板载多个引脚增强了功能性并提供实时状态反馈。例如,PVT 引脚作为位置、速度和时间计算的指示器,在定位活动时保持高电平;ERR 引脚作为错误状态指示器,当模块自检失败时为高电平,自检通过时为低电

平;EVT 引脚用于事件标记输入,支持记录精确的 GNSS 时间标签。视觉指示器进一步提高了用户体验:绿色 LED 链接至 PVT 引脚,红色 LED 链接至 ERR 引脚,为状态提供即时视觉反馈;蓝色 LED 表示 RTK 功能,当 RTK 固定解决方案有效时点亮,当无定位或其他状态时熄灭;黄色 LED 显示时间脉冲信号(PPS),提供精确时间同步功能。此外,该 Click 板™ 配备 50Ω 阻抗的 SMA 天线接口,可兼容 MIKROE 提供的多种天线,如 GNSS L1/L5 双频段有源天线(高精度和标准精度型号)等,进一步增强连接性能。此 Click 板™ 可通过 VCC SEL 跳线选择在 3.3V 或 5V 逻辑电压下工作。由于 UM980 模块运行在 3.3V 电压下,因此还使用了 TXS0108E 逻辑电平转换器,以确保正确操作和准确信号电平转换。这种设计允许 3.3V 和 5V MCU 均可正常使用通信线。此外,该 Click 板™ 附带一个库,包含易于使用的功能和示例代码,可作为进一步开发的参考。

GNSS RTK 5 Click hardware overview image

功能概述

开发板

Nucleo 32开发板搭载STM32F031K6 MCU,提供了一种经济且灵活的平台,适用于使用32引脚封装的STM32微控制器进行实验。该开发板具有Arduino™ Nano连接性,便于通过专用扩展板进行功能扩展,并且支持mbed,使其能够无缝集成在线资源。板载集成

ST-LINK/V2-1调试器/编程器,支持通过USB重新枚举,提供三种接口:虚拟串口(Virtual Com port)、大容量存储和调试端口。该开发板的电源供应灵活,可通过USB VBUS或外部电源供电。此外,还配备了三个LED指示灯(LD1用于USB通信,LD2用于电源

指示,LD3为用户可控LED)和一个复位按钮。STM32 Nucleo-32开发板支持多种集成开发环境(IDEs),如IAR™、Keil®和基于GCC的IDE(如AC6 SW4STM32),使其成为开发人员的多功能工具。

Nucleo 32 with STM32F031K6 MCU double side image

微控制器概述 

MCU卡片 / MCU

default

建筑

ARM Cortex-M0

MCU 内存 (KB)

32

硅供应商

STMicroelectronics

引脚数

32

RAM (字节)

4096

你完善了我!

配件

Click Shield for Nucleo-32是扩展您的开发板功能的理想选择,专为STM32 Nucleo-32引脚布局设计。Click Shield for Nucleo-32提供了两个mikroBUS™插座,可以添加来自我们不断增长的Click板™系列中的任何功能。从传感器和WiFi收发器到电机控制和音频放大器,我们应有尽有。Click Shield for Nucleo-32与STM32 Nucleo-32开发板兼容,为用户提供了一种经济且灵活的方式,使用任何STM32微控制器快速创建原型,并尝试各种性能、功耗和功能的组合。STM32 Nucleo-32开发板无需任何独立的探针,因为它集成了ST-LINK/V2-1调试器/编程器,并随附STM32全面的软件HAL库和各种打包的软件示例。这个开发平台为用户提供了一种简便且通用的方式,将STM32 Nucleo-32兼容开发板与他们喜欢的Click板™结合,应用于即将开展的项目中。

Click Shield for Nucleo-32 accessories 1 image

GNSS L1/L5 双频段有源天线 - 高精度型号 (ANN-MB1) 是一款多频段有源天线,支持 GPS、GLONASS、Galileo 和北斗系统,为高精度 GNSS 应用提供全面的解决方案。这款多频段天线经过优化,能够覆盖 L1、L5、E5a、B2a 和 NavIC 频段,确保在各种 GNSS 系统中的可靠性能。ANN-MB1 以其紧凑的设计和卓越的性价比脱颖而出,是寻求快速高效上市路径用户的理想选择。该天线与 u-blox F9 平台(如 NEO-F9P-15B、ZED-F9P-15B 和 ZED-F9T-10B)高度兼容,支持 L1 和 L5 双频段,有助于简化集成过程,降低评估和设计复杂性。ANN-MB1 的稳健设计支持出色的多频段操作,尤其适用于对高定位精度要求苛刻的应用,如测绘、精准农业和自主导航系统。这款天线的核心是高性能右旋圆极化(RHCP)双谐振双馈贴片天线单元,其复杂设计搭配内置高增益低噪声放大器(LNA)和表面声波(SAW)预滤波器,通过降低噪声和干扰来确保最佳信号质量。集成的 LNA 显著增强了天线捕获微弱 GNSS 信号的能力,即使在复杂环境中也能提供可靠性能。ANN-MB1 天线配备 5 米长电缆,并以 SMA 接头封装,提供了灵活的安装选项和便利的部署方式。其精心设计保证了在各种应用中的一致性能,使其成为新一代 GNSS 系统的重要工具。凭借用户友好的设置和稳健的性能,ANN-MB1 专为需要高精度和可靠 GNSS 解决方案的行业需求而量身打造。

GNSS RTK 5 Click accessories 1 image

GNSS L1/L5 双频段有源天线 - 标准精度型号 (ANN-MB5) 是由 u-blox 开发的高性能多频段有源 GNSS 天线,支持 GPS、Galileo 和北斗系统。专为标准精度应用设计,该天线以实惠的价格提供卓越性能,是下一代多频 GNSS 技术的理想选择。ANN-MB5 支持多个频段,包括 L1、L5、E5a、B2a 和 NavIC,即使在复杂或遮挡环境中也能实现精确可靠的定位。ANN-MB5 专为易于集成而设计,具有紧凑的外形、简单的安装选项,并为大规模部署提供经济高效的解决方案。该天线与 u-blox 的多频 GNSS 接收器(如 F10 标准精度平台)完美适配,确保无缝兼容。通过减少额外评估和设计需求,ANN-MB5 加速了开发周期并缩短了上市时间。ANN-MB5 配备先进的多频段 RHCP(右旋圆极化)单馈堆叠贴片天线元件,能够在多个 GNSS 频段提供稳健的信号接收。它还内置低噪声放大器(LNA)和表面声波(SAW)预滤波器,增强信号质量并减少干扰。天线配备 3 米长电缆和 SMA 接头,为多样化应用需求提供了灵活的安装选项。该天线满足现代 GNSS 应用的需求,具有高可靠性、精准定位和简化部署的特点,适用于各种环境。

GNSS RTK 5 Click accessories 2 image

使用的MCU引脚

mikroBUS™映射器

Positioning Status
PA0
AN
Reset
PA11
RST
ID COMM
PA4
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
Event Mark
PA8
PWM
Error Status
PA12
INT
UART TX
PA10
TX
UART RX
PA9
RX
I2C Clock
PB6
SCL
I2C Data
PB7
SDA
Power Supply
5V
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

GNSS RTK 5 Click Schematic schematic

一步一步来

项目组装

Click Shield for Nucleo-144 front image hardware assembly

从选择您的开发板和Click板™开始。以Nucleo 32 with STM32F031K6 MCU作为您的开发板开始。

Click Shield for Nucleo-144 front image hardware assembly
Nucleo 144 with STM32L4A6ZG MCU front image hardware assembly
Stepper 22 Click front image hardware assembly
Prog-cut hardware assembly
Stepper 22 Click complete accessories setup image hardware assembly
Nucleo-32 with STM32 MCU Access MB 1 - upright/background hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
Necto image step 5 hardware assembly
Necto image step 6 hardware assembly
STM32 M4 Clicker HA MCU/Select Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Debug Image Necto Step hardware assembly

实时跟踪您的结果

应用程序输出

1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持

库描述

GNSS RTK 5 Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。

示例描述
本示例演示了如何使用 GNSS RTK 5 Click 读取并显示 GNSS 坐标。

关键功能:

  • gnssrtk5_cfg_setup - 配置对象初始化函数。

  • gnssrtk5_init - 初始化函数。

  • gnssrtk5_cmd_run - 从读取的响应缓冲区中解析 GGA 数据。

  • gnssrtk5_parse_gga - 从读取的响应缓冲区中解析 GGA 数据。

  • gnssrtk5_generic_read - 通过 UART 串行接口读取指定数量的数据字节。

应用初始化
初始化驱动程序,复位 Click 板,读取模块版本和配置,并启用 NMEA GNGGA 消息输出。

应用任务
读取接收到的数据,从中解析 NMEA GGA 信息。一旦获得位置修复数据,开始在 USB UART 上显示坐标。

开源

代码示例

完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio 应用程序代码也可以在MIKROE的GitHub账户中找到。

/*!
 * @file main.c
 * @brief GNSS RTK 5 Click Example.
 *
 * # Description
 * This example demonstrates the use of GNSS RTK 5 Click by reading and displaying
 * the GNSS coordinates.
 *
 * The demo application is composed of two sections :
 *
 * ## Application Init
 * Initializes the driver, resets the Click board, reads the module version and config,
 * and enables the NMEA GNGGA message output.
 *
 * ## Application Task
 * Reads the received data, parses the NMEA GGA info from it, and once it receives 
 * the position fix it will start displaying the coordinates on the USB UART.
 *
 * ## Additional Function
 * - static void gnssrtk5_clear_app_buf ( void )
 * - static void gnssrtk5_log_app_buf ( void )
 * - static err_t gnssrtk5_process ( gnssrtk5_t *ctx )
 * - static err_t gnssrtk5_read_response ( gnssrtk5_t *ctx, uint8_t *rsp )
 * - static void gnssrtk5_parser_application ( uint8_t *rsp )
 *
 * @author Stefan Filipovic
 *
 */

#include "board.h"
#include "log.h"
#include "gnssrtk5.h"

// Application buffer size
#define APP_BUFFER_SIZE             800
#define PROCESS_BUFFER_SIZE         100

static gnssrtk5_t gnssrtk5;
static log_t logger;

static uint8_t app_buf[ APP_BUFFER_SIZE ] = { 0 };
static int32_t app_buf_len = 0;

/**
 * @brief GNSS RTK 5 clearing application buffer.
 * @details This function clears memory of application buffer and reset its length.
 * @note None.
 */
static void gnssrtk5_clear_app_buf ( void );

/**
 * @brief GNSS RTK 5 log application buffer.
 * @details This function logs data from application buffer to USB UART.
 * @note None.
 */
static void gnssrtk5_log_app_buf ( void );

/**
 * @brief GNSS RTK 5 data reading function.
 * @details This function reads data from device and concatenates data to application buffer. 
 * @param[in] ctx : Click context object.
 * See #gnssrtk5_t object definition for detailed explanation.
 * @return @li @c  0 - Read some data.
 *         @li @c -1 - Nothing is read.
 * See #err_t definition for detailed explanation.
 * @note None.
 */
static err_t gnssrtk5_process ( gnssrtk5_t *ctx );

/**
 * @brief GNSS RTK 5 read response function.
 * @details This function waits for a response message, reads and displays it on the USB UART.
 * @param[in] ctx : Click context object.
 * See #gnssrtk5_t object definition for detailed explanation.
 * @param[in] rsp  Expected response.
 * @return @li @c  0 - OK response.
 *         @li @c -2 - Timeout error.
 * See #err_t definition for detailed explanation.
 * @note None.
 */
static err_t gnssrtk5_read_response ( gnssrtk5_t *ctx, uint8_t *rsp );

/**
 * @brief GNSS RTK 5 parser application.
 * @param[in] rsp Response buffer.
 * @details This function logs GNSS data on the USB UART.
 * @return None.
 * @note None.
 */
static void gnssrtk5_parser_application ( uint8_t *rsp );

void application_init ( void ) 
{
    log_cfg_t log_cfg;  /**< Logger config object. */
    gnssrtk5_cfg_t gnssrtk5_cfg;  /**< Click config object. */

    /** 
     * Logger initialization.
     * Default baud rate: 115200
     * Default log level: LOG_LEVEL_DEBUG
     * @note If USB_UART_RX and USB_UART_TX 
     * are defined as HAL_PIN_NC, you will 
     * need to define them manually for log to work. 
     * See @b LOG_MAP_USB_UART macro definition for detailed explanation.
     */
    LOG_MAP_USB_UART( log_cfg );
    log_init( &logger, &log_cfg );
    log_info( &logger, " Application Init " );

    // Click initialization.
    gnssrtk5_cfg_setup( &gnssrtk5_cfg );
    GNSSRTK5_MAP_MIKROBUS( gnssrtk5_cfg, MIKROBUS_1 );
    if ( UART_ERROR == gnssrtk5_init( &gnssrtk5, &gnssrtk5_cfg ) ) 
    {
        log_error( &logger, " Communication init." );
        for ( ; ; );
    }

    log_printf( &logger, ">>> Reset device.\r\n" );
    gnssrtk5_reset_device ( &gnssrtk5 );
    gnssrtk5_read_response ( &gnssrtk5, GNSSRTK5_RSP_RESET );
    
    log_printf( &logger, ">>> Get module version.\r\n" );
    gnssrtk5_cmd_run ( &gnssrtk5, GNSSRTK5_CMD_GET_VERSION );
    gnssrtk5_read_response ( &gnssrtk5, GNSSRTK5_RSP_COMMAND );

    log_printf( &logger, ">>> Get module config.\r\n" );
    gnssrtk5_cmd_run ( &gnssrtk5, GNSSRTK5_CMD_GET_CONFIG );
    gnssrtk5_read_response ( &gnssrtk5, GNSSRTK5_RSP_COMMAND );

    log_printf( &logger, ">>> Enable GNGGA output.\r\n" );
    gnssrtk5_cmd_run ( &gnssrtk5, GNSSRTK5_CMD_ENABLE_GGA );
    gnssrtk5_read_response ( &gnssrtk5, GNSSRTK5_RSP_COMMAND );
    gnssrtk5_clear_app_buf( );

    log_info( &logger, " Application Task " );
}

void application_task ( void ) 
{
    if ( GNSSRTK5_OK == gnssrtk5_process( &gnssrtk5 ) ) 
    {
        if ( app_buf_len > ( sizeof ( GNSSRTK5_RSP_GGA ) + GNSSRTK5_GGA_ELEMENT_SIZE ) ) 
        {
            gnssrtk5_parser_application( app_buf );
        }
    }
}

int main ( void ) 
{
    /* Do not remove this line or clock might not be set correctly. */
    #ifdef PREINIT_SUPPORTED
    preinit();
    #endif
    
    application_init( );
    
    for ( ; ; ) 
    {
        application_task( );
    }

    return 0;
}

static void gnssrtk5_clear_app_buf ( void ) 
{
    memset( app_buf, 0, app_buf_len );
    app_buf_len = 0;
}

static void gnssrtk5_log_app_buf ( void )
{
    for ( int32_t buf_cnt = 0; buf_cnt < app_buf_len; buf_cnt++ )
    {
        log_printf( &logger, "%c", app_buf[ buf_cnt ] );
    }
}

static err_t gnssrtk5_process ( gnssrtk5_t *ctx ) 
{
    uint8_t rx_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
    int32_t overflow_bytes = 0;
    int32_t rx_cnt = 0;
    int32_t rx_size = gnssrtk5_generic_read( ctx, rx_buf, PROCESS_BUFFER_SIZE );
    if ( ( rx_size > 0 ) && ( rx_size <= APP_BUFFER_SIZE ) ) 
    {
        if ( ( app_buf_len + rx_size ) > APP_BUFFER_SIZE ) 
        {
            overflow_bytes = ( app_buf_len + rx_size ) - APP_BUFFER_SIZE;
            app_buf_len = APP_BUFFER_SIZE - rx_size;
            memmove ( app_buf, &app_buf[ overflow_bytes ], app_buf_len );
            memset ( &app_buf[ app_buf_len ], 0, overflow_bytes );
        }
        for ( rx_cnt = 0; rx_cnt < rx_size; rx_cnt++ ) 
        {
            if ( rx_buf[ rx_cnt ] ) 
            {
                app_buf[ app_buf_len++ ] = rx_buf[ rx_cnt ];
            }
        }
        return GNSSRTK5_OK;
    }
    return GNSSRTK5_ERROR;
}

static err_t gnssrtk5_read_response ( gnssrtk5_t *ctx, uint8_t *rsp )
{
    #define READ_RESPONSE_TIMEOUT_MS 5000
    uint32_t timeout_cnt = 0;
    gnssrtk5_clear_app_buf ( );
    while ( ( GNSSRTK5_OK == gnssrtk5_process( ctx ) ) || ( 0 == strstr( app_buf, rsp ) ) )
    {
        if ( timeout_cnt > READ_RESPONSE_TIMEOUT_MS )
        {
            gnssrtk5_log_app_buf( );
            gnssrtk5_clear_app_buf( );
            log_error( &logger, " Timeout!" );
            return GNSSRTK5_ERROR_TIMEOUT;
        }
        timeout_cnt += 10;
        Delay_ms( 10 );
    }
    gnssrtk5_log_app_buf( );
    log_printf( &logger, "--------------------------------\r\n" );
    return GNSSRTK5_OK;
}

static void gnssrtk5_parser_application ( uint8_t *rsp )
{
    uint8_t element_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
    if ( GNSSRTK5_OK == gnssrtk5_parse_gga( rsp, GNSSRTK5_GGA_LATITUDE, element_buf ) )
    {
        static uint8_t wait_for_fix_cnt = 0;
        if ( strlen( element_buf ) > 0 )
        {
            log_printf( &logger, "\r\n Latitude: %.2s degrees, %s minutes \r\n", element_buf, &element_buf[ 2 ] );
            memset( element_buf, 0, sizeof( element_buf ) );
            gnssrtk5_parse_gga( rsp, GNSSRTK5_GGA_LONGITUDE, element_buf );
            log_printf( &logger, " Longitude: %.3s degrees, %s minutes \r\n", element_buf, &element_buf[ 3 ] );
            memset( element_buf, 0, sizeof( element_buf ) );
            gnssrtk5_parse_gga( rsp, GNSSRTK5_GGA_ALTITUDE, element_buf );
            log_printf( &logger, " Altitude: %s m \r\n", element_buf );
            wait_for_fix_cnt = 0;
        }
        else
        {
            if ( wait_for_fix_cnt % 5 == 0 )
            {
                log_printf( &logger, " Waiting for the position fix...\r\n\n" );
                wait_for_fix_cnt = 0;
            }
            wait_for_fix_cnt++;
        }
        gnssrtk5_clear_app_buf(  );
    }
}

// ------------------------------------------------------------------------ END

额外支持

资源

喜欢这个项目吗?

'购买此套件' 按钮会直接带您进入购物车,您可以在购物车中轻松添加或移除产品。