1. GPIO输出控制LED闪烁
任务目标
在Zephyr OS环境下,使用GPIO驱动API将指定引脚配置为输出模式,通过交替设置高低电平实现LED周期性闪烁,掌握gpio_pin_configure、gpio_pin_set等核心接口的用法。
环境与依赖
- Zephyr RTOS 3.x及以上版本
- 开发板:以nRF52840DK为例(其他板卡需按硬件原理图调整引脚号)
- 板载LED:P0.13(LED1),低电平点亮
完整代码实现
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
/* 根据开发板原理图定义LED引脚 */
#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
#define SLEEP_TIME_MS 500
int main(void)
{
int ret;
/* 校验设备就绪 */
if (!gpio_is_ready_dt(&led)) {
return -ENODEV;
}
/* 配置引脚为输出模式,初始电平为高(LED熄灭) */
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
return ret;
}
while (1) {
/* 翻转引脚输出状态 */
ret = gpio_pin_toggle_dt(&led);
if (ret < 0) {
return ret;
}
k_msleep(SLEEP_TIME_MS);
}
return 0;
}
构建与运行
- 在项目
prj.conf中无需额外GPIO配置(驱动默认启用)。 - 确保开发板设备树中包含
led0别名(nRF52840DK默认已定义)。 - 构建并烧录:
west build -b nrf52840dk_nrf52840 .
west flash
验证方法
- 观察现象:烧录后板载LED1应以约1Hz频率闪烁(亮500ms、灭500ms)。
- 判定通过:LED持续周期性闪烁且系统无异常复位,即表示GPIO输出控制功能正常。
- 逻辑说明:
GPIO_OUTPUT_ACTIVE宏会根据设备树中gpio-hog标志自动适配高低电平有效极性(本案例LED低电平点亮,因此初始输出高电平为熄灭状态)。
常见问题
- LED不亮:检查
led0别名是否在开发板board.dts中正确指向实际引脚,并确认GPIO控制器设备名匹配。 - 编译报错:确认Zephyr版本≥3.0,且
CONFIG_GPIO=y已启用(默认开启)。 - 引脚冲突:若使用自定义板卡,需确保目标引脚未被其他外设占用。