# 点亮LED ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 项目概述 本案例基于pico开发板和UniRTOS实现。通过调用 [GPIO相关接口](<../../外设与驱动/GPIO/GPIO.md#>),控制GPIO引脚每1秒翻转一次输出电平,从而实现LED模块灯的闪烁效果。 # 功能特性 **基于GPIO的精准LED控制** - **硬件级引脚控制**:直接操作GPIO引脚,精准控制LED状态。 - **灵活闪烁模式**:支持自定义LED闪烁频率与周期,可轻松实现快闪和慢闪的视觉效果。 - **超低资源占用**:纯软件逻辑控制,无需额外硬件定时器或复杂外设,极大节省系统资源。 # 开发准备 正如Hello World是学习编程语言的第一步,驱动GPIO也是嵌入式开发的第一步。请按照以下步骤,使用UniRTOS实现GPIO驱动控制。 ## 硬件要求 - pico开发板,[点此购买]()。 ```{image} images/image_XFV0b2C46oEOVlxCQHwcoJMLnFC.webp :width: 600px :height: 600px ``` - USB数据线(Type-C),[点此购买]()。 ```{image} images/image_ZWg6bw80CoWMmvxINgvca7HPn5c.webp :width: 615px :height: 615px ``` - LED模块,[点此购买]()。 ```{image} images/image_GFX9bwW06oXqSnxaQw6clAHJnve.webp :width: 615px :height: 615px ``` ## 软件要求 - **unirtos-toolchain.exe**:编译工具链安装程序,[点此获取]()。安装步骤详见 [环境搭建](<../../快速上手/环境搭建/环境搭建.md>)。 - **Python**:用于运行unirtos-cli工具,需使用3.9及更高版本。安装步骤详见 [环境搭建](<../../快速上手/环境搭建/环境搭建.md>)。 - **Git**:unirtos-cli使用该工具拉取SDK、依赖库等,需使用2.40及更高版本。安装步骤详见 [环境搭建](<../../快速上手/环境搭建/环境搭建.md>)。 - **unirtos-cli**:UniRTOS的命令行工具,用于一键拉取SDK、快速创建工程。安装步骤详见 [环境搭建](<../../快速上手/环境搭建/环境搭建.md>) 或 [unirtos-cli使用教程](<../../开发工具/unirtos-cli使用教程/unirtos-cli使用教程.md>)。 - **USB驱动**:用于PC识别模块的USB枚举接口,[点此获取]()。安装步骤详见 [环境搭建](<../../快速上手/环境搭建/环境搭建.md>)。 - **QFlash.exe**:模块固件烧录程序,用于烧录UniRTOS编译生成的固件,[点此获取]()。安装步骤详见 [环境搭建](<../../快速上手/环境搭建/环境搭建.md>) 或 [QFlash使用教程](<../../开发工具/QFlash使用教程/QFlash使用教程.md>)。 - **EPAT工具**:芯片厂商提供的日志抓取工具,用于查看模块运行日志以分析应用程序执行情况,[点此获取]()。安装步骤详见 [EPAT工具使用教程](<../../开发工具/EPAT工具使用教程/EPAT工具使用教程.md>) 。 - **QCOM工具**:移远通信提供的串口调试工具,用于执行和验证AT命令,[点此获取]()。安装步骤详见 [QCOM使用教程](<../../开发工具/QCOM使用教程/QCOM使用教程.md>)。 # 快速上手 ## 下载项目 示例代码位于UniRTOS官方创客仓库,[点此访问下载]()**。** ## 添加项目至UniRTOS SDK **编译构建** 下载项目后,请确保已安装unirtos-cli和unirtos-toolchain工具。随后,在下载的项目根目录中打开命令行窗口(Cmd或PowerShell),依次执行以下命令以拉取编译环境并进行编译: ```plaintext unirtos-cli env-setup unirtos-cli build ``` **型号配置** 项目配置中默认的编译型号为EG800ZCN_LA。若您使用的模块型号并非EG800ZCN_LA,请修改项目目录下 *env_config.json* 文件中的build字段,修改之后需重新编译固件以适配您的硬件。 ```{note} 1. 有关详细的编译与烧录流程,请参考 [快速上手](<../../快速上手/快速上手.md>)。 2. 有关unirtos-cli的相关命令介绍,请参考 [unirtos-cli使用教程](<../../开发工具/unirtos-cli使用教程/unirtos-cli使用教程.md#unirtos-cli使用教程>)。 ``` ## 硬件连接 - LED模块连接开发板对应物理引脚,V->3V3 , R/G/B->Pin19(19号引脚)。引脚接口详情可参考 [pico开发板介绍](<../../开发板介绍/pico开发板介绍/pico开发板介绍.md>)。 - 使用USB数据线连接开发板和电脑。 # 功能函数 ## 常量定义 - 定义线程栈大小为1024字节(1 KB)。 - 定义线程优先级为一般优先级。 - 定义线程任务句柄,并将其初始化为空。 - 定义需要初始化的引脚号为Pin19(本引脚为示例,如需初始化其他引脚,请自行修改)。 - 定义 *pin_cfg* 变量,用于后续接收默认引脚配置,类型为 *qosa_pin_cfg_t*。 **示例代码**: ```c #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功能。 - **操作流程** - 调用 *qosa_memset()* 将 *pin_cfg* 中的成员初始化为0。 - 调用 [*qosa_get_pin_default_cfg()*](<../../外设与驱动/GPIO/GPIO.md#>) 获取引脚的默认配置,并获取引脚对应的GPIO号和GPIO功能配置。 - 调用 [*qosa_pin_set_func()*](<../../外设与驱动/GPIO/GPIO.md#>) 设置当前引脚功能为GPIO功能,配置值由 [*qosa_get_pin_default_cfg()*](<../../外设与驱动/GPIO/GPIO.md#>) 获取。 - 调用 [*qosa_gpio_init()*](<../../外设与驱动/GPIO/GPIO.md#>) 初始化GPIO功能,配置为上拉输出模式,默认输出高电平。 - **示例代码** ```c 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的亮灭。 - **示例代码** ```c 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输出电平。 - **示例代码** ```c 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()*](<../../系统功能/多线程/多线程.md#>) 创建线程任务,并将 ***unir_led_demo_process()*** 指定为任务入口函数。 - **示例代码** ```c 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 ); } } ``` # 应用逻辑流程图 ```{image} images/board_J0YywuvOBhDIjyb5APRcrSPpn4d.jpg :width: 819px :height: 556px :align: center ``` # 常见问题 ## LED没有任何反应? 首先,检查数据线连接是否正确。若数据线连接正确,请确认GPIO已配置为输出模式,且引脚功能已配置为GPIO。 ## 是否可以使用其他引脚? 可以。修改上述 **示例代码** 中的宏定义 *LED_PIN_NUM* 即可更换为其他引脚。