点亮LED

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


项目概述

本案例基于pico开发板和UniRTOS实现。通过调用 GPIO相关接口,控制GPIO引脚每1秒翻转一次输出电平,从而实现LED模块灯的闪烁效果。

功能特性

基于GPIO的精准LED控制

  • 硬件级引脚控制:直接操作GPIO引脚,精准控制LED状态。

  • 灵活闪烁模式:支持自定义LED闪烁频率与周期,可轻松实现快闪和慢闪的视觉效果。

  • 超低资源占用:纯软件逻辑控制,无需额外硬件定时器或复杂外设,极大节省系统资源。

开发准备

正如Hello World是学习编程语言的第一步,驱动GPIO也是嵌入式开发的第一步。请按照以下步骤,使用UniRTOS实现GPIO驱动控制。

硬件要求

../../_images/image_XFV0b2C46oEOVlxCQHwcoJMLnFC.webp ../../_images/image_ZWg6bw80CoWMmvxINgvca7HPn5c.webp ../../_images/image_GFX9bwW06oXqSnxaQw6clAHJnve.webp

软件要求

  • unirtos-toolchain.exe:编译工具链安装程序,点此获取。安装步骤详见 环境搭建

  • Python:用于运行unirtos-cli工具,需使用3.9及更高版本。安装步骤详见 环境搭建

  • Git:unirtos-cli使用该工具拉取SDK、依赖库等,需使用2.40及更高版本。安装步骤详见 环境搭建

  • unirtos-cli:UniRTOS的命令行工具,用于一键拉取SDK、快速创建工程。安装步骤详见 环境搭建unirtos-cli使用教程

  • USB驱动:用于PC识别模块的USB枚举接口,点此获取。安装步骤详见 环境搭建

  • QFlash.exe:模块固件烧录程序,用于烧录UniRTOS编译生成的固件,点此获取。安装步骤详见 环境搭建QFlash使用教程

  • EPAT工具:芯片厂商提供的日志抓取工具,用于查看模块运行日志以分析应用程序执行情况,点此获取。安装步骤详见 EPAT工具使用教程

  • QCOM工具:移远通信提供的串口调试工具,用于执行和验证AT命令,点此获取。安装步骤详见 QCOM使用教程

快速上手

下载项目

示例代码位于UniRTOS官方创客仓库,点此访问下载

添加项目至UniRTOS SDK

编译构建

下载项目后,请确保已安装unirtos-cli和unirtos-toolchain工具。随后,在下载的项目根目录中打开命令行窗口(Cmd或PowerShell),依次执行以下命令以拉取编译环境并进行编译:

unirtos-cli env-setup
unirtos-cli build

型号配置

项目配置中默认的编译型号为EG800ZCN_LA。若您使用的模块型号并非EG800ZCN_LA,请修改项目目录下 env_config.json 文件中的build字段,修改之后需重新编译固件以适配您的硬件。

备注

  1. 有关详细的编译与烧录流程,请参考 快速上手

  2. 有关unirtos-cli的相关命令介绍,请参考 unirtos-cli使用教程

硬件连接

  • LED模块连接开发板对应物理引脚,V->3V3 , R/G/B->Pin19(19号引脚)。引脚接口详情可参考 pico开发板介绍

  • 使用USB数据线连接开发板和电脑。

功能函数

常量定义

  • 定义线程栈大小为1024字节(1 KB)。

  • 定义线程优先级为一般优先级。

  • 定义线程任务句柄,并将其初始化为空。

  • 定义需要初始化的引脚号为Pin19(本引脚为示例,如需初始化其他引脚,请自行修改)。

  • 定义 pin_cfg 变量,用于后续接收默认引脚配置,类型为 qosa_pin_cfg_t

示例代码

#define UniRTOS_LED_DEMO_TASK_STACK_SIZE 1024  // Task stack size 1KB
#define UniRTOS_LED_DEMO_TASK_PRIO QOSA_PRIORITY_NORMAL // Normal priority
static qosa_task_t g_quec_LED_demo_task = QOSA_NULL;
#define LED_PIN_NUM 19
qosa_pin_cfg_t pin_cfg; // Global variable to store the LED pin configuration

unir_led_init

  • 功能描述
    初始化引脚对应的GPIO功能。

  • 操作流程

  • 示例代码

static qosa_uint8_t unir_led_init(void)
{
    qosa_memset(&pin_cfg, 0, sizeof(qosa_pin_cfg_t));
    qosa_get_pin_default_cfg(LED_PIN_NUM, &pin_cfg);
    qosa_pin_set_func(LED_PIN_NUM, pin_cfg.gpio_func);
    // Initialize the LED GPIO pin as output, with pull-up and default level high (LED off)
    if (qosa_gpio_init(pin_cfg.gpio_num, QOSA_GPIO_DIRECTION_OUTPUT, QOSA_GPIO_PULL_UP, QOSA_GPIO_LEVEL_HIGH) != QOSA_GPIO_SUCCESS)
    {
        QLOGD("[led]]Failed to initialize LED GPIO");
        return 1; // Return 1 on failure
    }
    QLOGI("[led]]LED GPIO initialized successfully, pin_num: %d, gpio_num: %d, level: %d", LED_PIN_NUM, pin_cfg.gpio_num, QOSA_GPIO_LEVEL_HIGH);
    return 0;
}

unir_led_set

  • 功能描述
    改变引脚的GPIO输出电平,从而实现LED的亮灭。

  • 示例代码

static qosa_uint8_t unir_led_set(qosa_gpio_level_e gpio_level)
{ 
    if(qosa_gpio_set_level(pin_cfg.gpio_num, gpio_level) != QOSA_GPIO_SUCCESS)
    {
        QLOGD("[led]]Failed to set LED GPIO level");
        return 1; // Return 1 on failure
    }
    return 0;
}

unir_led_demo_process

  • 功能描述
    线程处理函数,实现LED的闪烁逻辑,即每隔1秒翻转一次GPIO输出电平。

  • 示例代码

static void unir_led_demo_process(void *ctx)
{
    unir_led_init();
    while (1)
    {
        unir_led_set(QOSA_GPIO_LEVEL_LOW);
        QLOGI("[led]]LED ON");
        qosa_task_sleep_ms(1000);
        unir_led_set(QOSA_GPIO_LEVEL_HIGH);
        QLOGI("[led]]LED OFF");
        qosa_task_sleep_ms(1000);
    }
    
}

unir_led_demo_init

  • 功能描述
    示例程序的初始化入口函数。该函数调用 qosa_task_create() 创建线程任务,并将 unir_led_demo_process() 指定为任务入口函数。

  • 示例代码

void unir_led_demo_init(void)
{
    // Log the entry of the LED Demo initialization
    QLOGV("[led]]enter LED DEMO !!!");

    // Create a task for the LED Demo using qosa_task_create, with specified stack size, priority, name, and entry function
    if (g_quec_test_demo_task == QOSA_NULL) // Check if the TEST Demo task has already been created
    {       
        
        qosa_task_create(
            &g_quec_test_demo_task,
            UniRTOS_LED_DEMO_TASK_STACK_SIZE,     // Task stack size
            UniRTOS_LED_DEMO_TASK_PRIO,           // Task priority
            "test_demo",                           // Task name
            unir_led_demo_process,                // Task entry function
            QOSA_NULL                             // Task context (not used in this case
        );
    }
}

应用逻辑流程图

../../_images/board_J0YywuvOBhDIjyb5APRcrSPpn4d.jpg

常见问题

LED没有任何反应?

首先,检查数据线连接是否正确。若数据线连接正确,请确认GPIO已配置为输出模式,且引脚功能已配置为GPIO。

是否可以使用其他引脚?

可以。修改上述 示例代码 中的宏定义 LED_PIN_NUM 即可更换为其他引脚。