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);
}
}
编译与烧录
- 创建ESP-IDF工程,将上述代码保存为
main.c,替换工程中的默认源文件。 - 在工程根目录执行以下命令编译并烧录:
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调用参数中的周期和次数,验证不同频率组合下的闪烁行为是否符合预期。