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+] 可退出监视器。

验证方法与判定标准

  1. 观察现象:程序烧录并复位后,LED应以稳定的1Hz频率闪烁(即每秒完成一次完整的亮灭循环,亮500ms、灭500ms)。
  2. 判定通过:若LED闪烁频率明显偏离1Hz(例如过快或过慢),请检查 vTaskDelay 的延时参数是否为 500,以及是否使用了 pdMS_TO_TICKS 宏进行毫秒到系统时钟节拍的转换。
  3. 引脚确认:若LED完全不亮,请确认 LED_GPIO_PIN 宏定义的值与开发板实际LED连接的GPIO引脚一致。

关键说明

  • gpio_config() 用于一次性完成引脚模式、上下拉和中断的配置,比逐项调用 gpio_set_direction() 更简洁。
  • vTaskDelay() 是FreeRTOS提供的任务延时函数,调用时会释放CPU给其他任务使用,延时精度由系统节拍(通常为100Hz或1000Hz)决定。pdMS_TO_TICKS() 负责将毫秒值转换为对应的节拍数。
  • 若使用ESP32-C3、ESP32-S3等较新芯片,板载LED引脚可能不同,请参考开发板原理图确认。