点亮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驱动控制。
硬件要求¶
pico开发板,点此购买。
USB数据线(Type-C),点此购买。
LED模块,点此购买。
软件要求¶
Python:用于运行unirtos-cli工具,需使用3.9及更高版本。安装步骤详见 环境搭建。
Git:unirtos-cli使用该工具拉取SDK、依赖库等,需使用2.40及更高版本。安装步骤详见 环境搭建。
unirtos-cli:UniRTOS的命令行工具,用于一键拉取SDK、快速创建工程。安装步骤详见 环境搭建 或 unirtos-cli使用教程。
QFlash.exe:模块固件烧录程序,用于烧录UniRTOS编译生成的固件,点此获取。安装步骤详见 环境搭建 或 QFlash使用教程。
EPAT工具:芯片厂商提供的日志抓取工具,用于查看模块运行日志以分析应用程序执行情况,点此获取。安装步骤详见 EPAT工具使用教程 。
快速上手¶
下载项目¶
示例代码位于UniRTOS官方创客仓库,点此访问下载。
添加项目至UniRTOS SDK¶
编译构建
下载项目后,请确保已安装unirtos-cli和unirtos-toolchain工具。随后,在下载的项目根目录中打开命令行窗口(Cmd或PowerShell),依次执行以下命令以拉取编译环境并进行编译:
unirtos-cli env-setup
unirtos-cli build
型号配置
项目配置中默认的编译型号为EG800ZCN_LA。若您使用的模块型号并非EG800ZCN_LA,请修改项目目录下 env_config.json 文件中的build字段,修改之后需重新编译固件以适配您的硬件。
备注
有关详细的编译与烧录流程,请参考 快速上手。
有关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功能。操作流程
调用 qosa_memset() 将 pin_cfg 中的成员初始化为0。
调用 qosa_get_pin_default_cfg() 获取引脚的默认配置,并获取引脚对应的GPIO号和GPIO功能配置。
调用 qosa_pin_set_func() 设置当前引脚功能为GPIO功能,配置值由 qosa_get_pin_default_cfg() 获取。
调用 qosa_gpio_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
);
}
}
应用逻辑流程图¶
常见问题¶
LED没有任何反应?¶
首先,检查数据线连接是否正确。若数据线连接正确,请确认GPIO已配置为输出模式,且引脚功能已配置为GPIO。
是否可以使用其他引脚?¶
可以。修改上述 示例代码 中的宏定义 LED_PIN_NUM 即可更换为其他引脚。