2. LED闪烁控制
任务目标
使用ESP-IDF框架,通过GPIO输出控制开发板上的LED,使其以1Hz频率(即每500ms翻转一次电平)持续闪烁。本案例旨在掌握ESP-IDF中GPIO配置为输出模式的方法,以及延时函数 vTaskDelay 的使用。
环境与依赖
- 硬件:任意乐鑫ESP32系列开发板(如ESP32-DevKitC),板载LED通常连接至GPIO2(部分型号为GPIO8,请根据实际板卡确认)。
- 软件:已安装并配置好ESP-IDF v5.x或更高版本开发环境。
- 本案例不依赖额外组件,仅使用ESP-IDF标准库。
完整实现代码
创建项目后,将以下代码完整写入主程序文件 main.c:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
// 根据实际开发板修改LED引脚编号
#define LED_GPIO_PIN GPIO_NUM_2
void app_main(void)
{
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << LED_GPIO_PIN),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
while (1) {
gpio_set_level(LED_GPIO_PIN, 1); // LED点亮
vTaskDelay(pdMS_TO_TICKS(500)); // 延时500ms
gpio_set_level(LED_GPIO_PIN, 0); // LED熄灭
vTaskDelay(pdMS_TO_TICKS(500)); // 延时500ms
}
}
编译与烧录
在项目根目录下打开终端,依次执行以下命令:
idf.py set-target esp32 # 若使用其他芯片,请替换为对应target
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor # 将端口替换为实际串口设备
执行 flash monitor 后,程序将自动烧录并打开串口监视器。按 Ctrl+] 可退出监视器。
验证方法与判定标准
- 观察现象:程序烧录并复位后,LED应以稳定的1Hz频率闪烁(即每秒完成一次完整的亮灭循环,亮500ms、灭500ms)。
- 判定通过:若LED闪烁频率明显偏离1Hz(例如过快或过慢),请检查
vTaskDelay的延时参数是否为500,以及是否使用了pdMS_TO_TICKS宏进行毫秒到系统时钟节拍的转换。 - 引脚确认:若LED完全不亮,请确认
LED_GPIO_PIN宏定义的值与开发板实际LED连接的GPIO引脚一致。
关键说明
gpio_config()用于一次性完成引脚模式、上下拉和中断的配置,比逐项调用gpio_set_direction()更简洁。vTaskDelay()是FreeRTOS提供的任务延时函数,调用时会释放CPU给其他任务使用,延时精度由系统节拍(通常为100Hz或1000Hz)决定。pdMS_TO_TICKS()负责将毫秒值转换为对应的节拍数。- 若使用ESP32-C3、ESP32-S3等较新芯片,板载LED引脚可能不同,请参考开发板原理图确认。