2. GPIO控制LED闪烁

任务目标

在ESP32-S3开发板上,通过GPIO控制板载LED以两种不同频率交替闪烁(例如:1Hz闪烁5秒,然后2Hz闪烁5秒,循环进行),以此熟悉GPIO的初始化配置和延时函数的使用方法。

环境与依赖

  • 硬件:ESP32-S3-DevKitC-1开发板(板载RGB LED,本例使用其中绿色通道,对应GPIO38)
  • 软件:ESP-IDF v5.x 或 Arduino-ESP32 core 2.x(本例以ESP-IDF为例)
  • 无需额外组件,仅使用板载LED

关键完整代码

以下代码使用ESP-IDF实现,通过gpio_set_level控制电平,vTaskDelay实现延时。代码中定义了两种闪烁模式,通过循环切换实现不同频率的交替闪烁。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"

#define LED_GPIO  38   // 板载RGB LED绿色通道

// 延时辅助函数:ms转tick
static void delay_ms(uint32_t ms) {
    vTaskDelay(pdMS_TO_TICKS(ms));
}

// 闪烁控制函数:按指定周期(ms)和次数闪烁
static void blink_led(uint32_t period_ms, int times) {
    for (int i = 0; i < times; i++) {
        gpio_set_level(LED_GPIO, 1);   // LED亮
        delay_ms(period_ms / 2);
        gpio_set_level(LED_GPIO, 0);   // LED灭
        delay_ms(period_ms / 2);
    }
}

void app_main(void) {
    // 配置GPIO为推挽输出
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << LED_GPIO),
        .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) {
        // 模式1:1Hz闪烁(周期1000ms),持续5秒
        blink_led(1000, 5);
        // 模式2:2Hz闪烁(周期500ms),持续5秒
        blink_led(500, 10);
    }
}

编译与烧录

  1. 创建ESP-IDF工程,将上述代码保存为main.c,替换工程中的默认源文件。
  2. 在工程根目录执行以下命令编译并烧录:
idf.py set-target esp32s3
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor   # 根据实际串口设备调整路径

验证方法

烧录成功后,观察板载LED(绿色)的闪烁行为:

  • 阶段1:LED以1Hz频率闪烁(每秒亮灭各一次),持续5秒,共闪烁5次。
  • 阶段2:LED切换为2Hz频率闪烁(每秒亮灭各两次),持续5秒,共闪烁10次。
  • 两个阶段循环交替执行,无停顿。

若观察到上述规律性闪烁,且串口监视器无错误输出,则判定案例通过。可通过修改blink_led调用参数中的周期和次数,验证不同频率组合下的闪烁行为是否符合预期。