ESP32-IDF开发之旅 基础篇⑤ 第一个基础代码:ESP32S3 Blink点灯

  • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
  • ❤️ 本篇创建记录 2025-08-24 ❤️
  • ❤️ 本篇更新记录 2025-08-31 ❤️
  • 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
  • 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!

1. 前言

今天直接来学习ESP32S3的点灯代码。主要分几个部分:

  • 介绍一下ESP32S3开发板
  • 编译运行Blink代码,分析使用API

注意:

  • 后续如果不特别说明,都是基于ESP32S3开发板演示
  • 建议单独一个目录去存储所编译过的所有示例代码,比如博主这里
    在这里插入图片描述

2. ESP32S3板子介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:因为这个板子有两个USB口,别插错了!!!然后就是RGB灯对应的IO口是48.
在这里插入图片描述

3. 右键通过vscode打开Blink工程

在这里插入图片描述

在这里插入图片描述

/* Blink 示例代码
   这段示例代码属于公共领域(或者根据你的选择采用CC0许可证)。

   除非适用法律要求或书面同意,本软件按"原样"分发,不附带任何明示或暗示的担保或条件。
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "led_strip.h"
#include "sdkconfig.h"

// 定义日志标签
static const char *TAG = "example";

/* 使用项目配置菜单 (idf.py menuconfig) 选择要闪烁的GPIO,
   或者你可以在下面这行编辑并设置一个数字。
*/
#define BLINK_GPIO CONFIG_BLINK_GPIO

// LED状态变量,0表示关闭,1表示打开
static uint8_t s_led_state = 0;

// 如果配置为使用LED灯带
#ifdef CONFIG_BLINK_LED_STRIP

static led_strip_handle_t led_strip;  // LED灯带句柄

// LED闪烁函数
static void blink_led(void)
{
    /* 如果LED状态为开启 */
    if (s_led_state) {
        /* 设置LED像素颜色,RGB值从0 (0%) 到 255 (100%) */
        led_strip_set_pixel(led_strip, 0, 16, 16, 16);
        /* 刷新灯带以发送数据 */
        led_strip_refresh(led_strip);
    } else {
        /* 清除所有像素,关闭所有LED */
        led_strip_clear(led_strip);
    }
}

// 配置LED函数
static void configure_led(void)
{
    ESP_LOGI(TAG, "Example configured to blink addressable LED!");
    /* LED灯带初始化配置,设置GPIO和像素数量 */
    led_strip_config_t strip_config = {
        .strip_gpio_num = BLINK_GPIO,  // 灯带数据引脚GPIO号
        .max_leds = 1, // 板上至少一个LED
    };
    
// 如果配置为使用RMT后端
#if CONFIG_BLINK_LED_STRIP_BACKEND_RMT
    led_strip_rmt_config_t rmt_config = {
        .resolution_hz = 10 * 1000 * 1000, // 10MHz分辨率
        .flags.with_dma = false,  // 不使用DMA
    };
    // 创建RMT设备LED灯带,ESP_ERROR_CHECK用于检查错误
    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
    
// 如果配置为使用SPI后端
#elif CONFIG_BLINK_LED_STRIP_BACKEND_SPI
    led_strip_spi_config_t spi_config = {
        .spi_bus = SPI2_HOST,  // 使用SPI2主机
        .flags.with_dma = true,  // 使用DMA
    };
    // 创建SPI设备LED灯带
    ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip));
#else
#error "不支持的LED灯带后端"
#endif
    /* 清除所有像素,关闭所有LED */
    led_strip_clear(led_strip);
}

// 如果配置为使用GPIO LED
#elif CONFIG_BLINK_LED_GPIO

// LED闪烁函数
static void blink_led(void)
{
    /* 根据状态设置GPIO电平(低或高)*/
    gpio_set_level(BLINK_GPIO, s_led_state);
}

// 配置LED函数
static void configure_led(void)
{
    ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
    // 重置GPIO引脚
    gpio_reset_pin(BLINK_GPIO);
    /* 将GPIO设置为推挽输出模式 */
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}

#else
#error "不支持的LED类型"
#endif

// 主应用程序入口函数
void app_main(void)
{
    /* 根据LED类型配置外设 */
    configure_led();

    // 主循环
    while (1) {
        // 记录LED状态日志
        ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
        // 控制LED闪烁
        blink_led();
        /* 切换LED状态 */
        s_led_state = !s_led_state;
        // 延迟一段时间,portTICK_PERIOD_MS表示每个tick的毫秒数
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
    }
}

3.1 IDF方法说明

  • ESP_LOGI(TAG, “message”):
  • 用于输出信息级别日志
  • TAG用于标识日志来源,便于过滤和调试
  • 常用的一个方法
  • gpio_reset_pin(gpio_num):
  • 重置GPIO引脚到默认状态
  • 解除引脚的其它功能配置
  • gpio_set_direction(gpio_num, mode):
  • 设置GPIO引脚方向
  • GPIO_MODE_OUTPUT表示设置为输出模式
  • gpio_set_level(gpio_num, level):
  • 设置GPIO输出电平
  • level为0输出低电平,1输出高电平
  • vTaskDelay(ticks):
  • FreeRTOS任务延迟函数
  • 使当前任务进入阻塞状态指定时间
  • portTICK_PERIOD_MS是系统时钟节拍周期(毫秒)
  • ESP_ERROR_CHECK(expr):
  • 检查ESP-IDF函数返回值
  • 如果表达式返回错误码,会打印错误并中止程序
  • led_strip_new_rmt_device()/led_strip_new_spi_device():
  • 创建基于RMT或SPI的LED灯带设备
  • 返回灯带句柄用于后续操作
  • led_strip_set_pixel():
  • 设置灯带上特定像素的RGB颜色值
  • 红色: (255, 0, 0)
    绿色: (0, 255, 0)
    蓝色: (0, 0, 255)
    白色: (255, 255, 255)
    黄色: (255, 255, 0)
    紫色: (255, 0, 255)
    青色: (0, 255, 255)
  • led_strip_refresh():
  • 将像素数据发送到灯带,更新显示
  • led_strip_clear():
  • 清除灯带所有像素,关闭所有LED

4. 编译测试

  • 步骤1:选择入口
    在这里插入图片描述

  • 步骤2:配置FlashMode、FlashSize
    在这里插入图片描述

  • 步骤3:配置IO口、间隔时间
    在这里插入图片描述

  • 步骤4:选择目标板子、com口、烧录方式
    在这里插入图片描述

  • 步骤5:编译、烧录、观察串口
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    后续当你熟悉这套流程之后,这个步骤基本上1分钟配置完成,剩下就是开发编译bin的事情了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值