ESP-IDF实现esp32点灯
LED灯发光与驱动原理
LED(Light Emitting Diode,发光二极管)是一种半导体器件,其发光基于电致发光效应。当电流通过PN结时,电子与空穴复合释放能量,以光子形式发射。
LED通常有两种接法,分别为灌电流接法和拉电流接法
灌电流(Sink Current):MCU的GPIO引脚作为电流的接收端(接地路径),LED的正极接电源。

拉电流(Source Current):MCU的GPIO引脚作为电流的提供端(电源路径),LED的负极接地。

本人使用立创·ESP32S3R8N8开发板,其中LED灯通过灌电流法接入GPIO48,所以我们只要使GPIO48输出低电平即可点亮LED,输出高电平则LED熄灭。

创建新项目

在新建工程页,配置工程名、工程路径、ESP32芯片、连接端口(后继可改)等,点击【Choose Template】进行模板创建。

在弹出的界面中,有两个选项可以选择,是使用扩展例程(ExtenSion)还是使用官方IDF的例程(ESP-IDF),这里我们选择选择 【ExtenSion】下的 【template-app】进行工程创建,有许多其他例程小伙伴们可以自行尝试,点击【Create project using template hellp_world】创建项目。

创建完成之后,右下角会提示【工程已经创建完毕,是否用新窗口打开工程?】点击Yes,出现打开一个VSCode窗口。

代码实现
方法一
通过设置一个结构体gpio_config_t直接配置IO口。
打开main.c,输入代码:
#include <stdio.h>
#include "driver/gpio.h"
#define LED_PIN 48
gpio_config_t led_config = {
.pin_bit_mask = (1ULL<<LED_PIN), //配置引脚
.mode =GPIO_MODE_OUTPUT, //输出模式
.pull_up_en = GPIO_PULLUP_DISABLE, //不使能上拉
.pull_down_en = GPIO_PULLDOWN_DISABLE, //不使能下拉
.intr_type = GPIO_INTR_DISABLE //不使能引脚中断
};
void app_main(void)
{
gpio_config(&led_config);
}
1. pin_bit_mask = (1ULL<<LED_PIN)
-
作用:指定要配置的GPIO引脚
-
格式:64位位掩码,每位对应一个GPIO引脚
-
示例:
-
(1ULL<<2)- 配置GPIO2 -
(1ULL<<2) | (1ULL<<4)- 同时配置GPIO2和GPIO4
-
-
ULL后缀:确保64位无符号长整型,避免移位溢出
2. mode = GPIO_MODE_OUTPUT
-
作用:设置GPIO工作模式
-
可选值:
-
GPIO_MODE_INPUT- 输入模式 -
GPIO_MODE_OUTPUT- 输出模式 -
GPIO_MODE_OUTPUT_OD- 开漏输出模式 -
GPIO_MODE_INPUT_OUTPUT_OD- 输入+开漏输出 -
GPIO_MODE_INPUT_OUTPUT- 输入+输出
-
3. pull_up_en = GPIO_PULLUP_DISABLE
-
作用:是否启用内部上拉电阻
-
可选值:
-
GPIO_PULLUP_ENABLE- 启用上拉(约45kΩ) -
GPIO_PULLUP_DISABLE- 禁用上拉(默认)
-
-
应用场景:
-
输入模式时,防止引脚悬空
-
按钮检测时提供默认高电平
-
4. pull_down_en = GPIO_PULLDOWN_DISABLE
-
作用:是否启用内部下拉电阻
-
可选值:
-
GPIO_PULLDOWN_ENABLE- 启用下拉(约45kΩ) -
GPIO_PULLDOWN_DISABLE- 禁用下拉(默认)
-
-
应用场景:
-
输入模式时,防止引脚悬空
-
提供默认低电平
-
5. intr_type = GPIO_INTR_DISABLE
-
作用:设置中断触发类型
-
可选值:
-
GPIO_INTR_DISABLE- 禁用中断 -
GPIO_INTR_POSEDGE- 上升沿触发 -
GPIO_INTR_NEGEDGE- 下降沿触发 -
GPIO_INTR_ANYEDGE- 任意边沿触发 -
GPIO_INTR_LOW_LEVEL- 低电平触发 -
GPIO_INTR_HIGH_LEVEL- 高电平触发
-
注:当调用 gpio_config(&led_config) 时:
-
清除原有配置:指定的GPIO引脚(在
pin_bit_mask中)的所有现有设置被完全清除 -
应用新配置:按照结构体中的参数重新配置该引脚
-
影响所有方面:包括模式、上下拉、中断设置等所有GPIO属性
即使你只关心某个参数(如模式),也必须设置所有参数:
// 错误:只设置模式,其他用默认值(但默认值可能不是期望的)
gpio_config_t bad_config = {
.pin_bit_mask = (1ULL<<2),
.mode = GPIO_MODE_OUTPUT
// 其他字段未初始化,值不确定!
};
// 正确:明确设置所有参数
gpio_config_t good_config = {
.pin_bit_mask = (1ULL<<2),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
方法二
先通过gpio_reset_pin函数初始化一个IO口,然后再使用gpio_set_direction函数配置这个引脚的输入输出模式。
#include <stdio.h>
#include "driver/gpio.h"
#define LED_PIN 48
void app_main(void)
{
gpio_reset_pin(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
}
gpio_reset_pin() 是ESP-IDF中一个非常重要的GPIO管理函数。
函数原型:
esp_err_t gpio_reset_pin(gpio_num_t gpio_num);
参数说明:
gpio_num_t gpio_num:
-
类型:枚举类型,指定要复位的GPIO引脚编号
-
取值范围:
GPIO_NUM_0到GPIO_NUM_48(取决于ESP32型号) -
示例:
-
GPIO_NUM_2- GPIO2引脚
-
-
等效于手动配置:
gpio_config_t reset_config = {
.pin_bit_mask = (1ULL << gpio_num),
.mode = GPIO_MODE_DISABLE, // 禁用模式(高阻态)
.pull_up_en = GPIO_PULLUP_DISABLE, // 禁用上拉
.pull_down_en = GPIO_PULLDOWN_DISABLE, // 禁用下拉
.intr_type = GPIO_INTR_DISABLE // 禁用中断
};
gpio_config(&reset_config);
gpio_set_direction() 是ESP-IDF中用于设置GPIO引脚方向的函数。
函数原型:
esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode);
参数说明
1. gpio_num_t gpio_num
-
作用:指定要设置的GPIO引脚编号
-
类型:枚举类型
-
取值范围:
GPIO_NUM_0到GPIO_NUM_48(取决于ESP32型号) -
示例:
-
GPIO_NUM_2- GPIO2引脚 -
GPIO_NUM_4- GPIO4引脚 -
GPIO_NUM_18- GPIO18引脚
-
2. gpio_mode_t mode
-
作用:设置GPIO的工作模式
-
类型:枚举类型
-
常用值:
-
GPIO_MODE_INPUT- 输入模式 -
GPIO_MODE_OUTPUT- 输出模式 -
GPIO_MODE_OUTPUT_OD- 开漏输出模式 -
GPIO_MODE_INPUT_OUTPUT_OD- 输入+开漏输出模式 -
GPIO_MODE_INPUT_OUTPUT- 输入+输出模式 -
GPIO_MODE_DISABLE- 禁用模式(高阻态)
-
构建与烧录
构建项目:

用USB数据线将开发板连接到电脑,选择相应端口,烧录到开发板:

可以看到开发板LED灯成功点亮:

更多推荐

所有评论(0)