实现 ESP32-S3 的 IO 作为输出功能,实现LED灯以500毫秒闪烁一次
1、GPIO&LED简介
1.1、GPIO简介
GPIO 是负责控制或采集外部器件信息的外设,主要负责输入输出功能。
1.2、LED简介
LED,即发光二极管。
2、硬件设计
(1)原理图
- LED 接IO1引脚
- IO1 输出低电平时,则 LED 亮起,反之,熄灭。
3、程序设计
明月实验目的和GPIO驱动方式,即可开始程序设计。
3.1、程序流程图

3.2、GPIO相关函数
(1)ESP-IDF 提供了丰富的 GPIO 操作函数,开发者可以在 esp-idf-v5.1.2\components\driver\gpio路径下找到相关的 gpio.c 和 gpio.h 文件。在 gpio.h 头文件中,你可以找到 ESP32-S3 的所有 GPI O 函数定义。
(2)官网API搜索查询
- ESP 官方推出的几款芯片的编程指南,网站:ESP-IDF 入门指南 | 乐鑫科技
- 选择当前使用的芯片,进入如下页面,搜索相应API,可查询相应API的功能及参数。
3.3、LED驱动
(1)在基础工程路径下components\BSP路径下新增了一个 LED文件夹,用于存放 led.c 和 led.h 这两个文件。其中, led.h 文件负责声明 LED 相关的函数和变量,而 led.c文件则实现了 LED 的驱动代码。两个文件的实现内容见下文。
- 直接修改项目文件夹名为led
- 修改工程外城CMakeLists.txt文件
(2)led.h文件
/**
****************************************************************************************************
* @file led.h
* @author zjd
* @version V1.0
* @date 2024-05-25
* @brief LED驱动代码
****************************************************************************************************
*/
#ifndef __LED_H_
#define __LED_H_
#include "driver/gpio.h"
/* 引脚定义 */
#define LED_GPIO_PIN GPIO_NUM_1 /* LED连接的GPIO端口 */
/* 引脚的输出的电平状态 */
enum GPIO_OUTPUT_STATE
{
PIN_RESET,
PIN_SET
};
/* LED端口定义 */
#define LED(x) do { x ? \
gpio_set_level(LED_GPIO_PIN, PIN_SET) : \
gpio_set_level(LED_GPIO_PIN, PIN_RESET); \
} while(0) /* LED翻转 */
/* LED取反定义 */
#define LED_TOGGLE() do { gpio_set_level(LED_GPIO_PIN, !gpio_get_level(LED_GPIO_PIN)); } while(0) /* LED翻转 */
/* 函数声明*/
void led_init(void); /* 初始化LED */
#endif
(3)led.c文件
/**
****************************************************************************************************
* @file led.c
* @author zjd
* @version V1.0
* @date 2024-05-25
* @brief LED驱动代码
****************************************************************************************************
*/
#include "led.h"
/**
* @brief 初始化 LED
* @param 无
* @retval 无
*/
void led_init(void)
{
gpio_config_t gpio_init_struct = {0};
gpio_init_struct.intr_type = GPIO_INTR_DISABLE; /* 失能引脚中断 */
gpio_init_struct.mode = GPIO_MODE_INPUT_OUTPUT; /* 输入输出模式 */
gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE; /* 使能上拉 */
gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE; /* 失能下拉 */
gpio_init_struct.pin_bit_mask = 1ull << LED_GPIO_PIN; /* 设置的引脚的位掩码*/
gpio_config(&gpio_init_struct); /* 配置 GPIO */
LED(1); /* 关闭 LED */
}
3.4、CMakeLists.txt 文件
(1)在 components/BSP 路径下定义了CMakeLists.txt 文件。
(2)此文件的作用是将 BSP 文件夹下的驱动程序添加到构建系统中,确保在编译项目工程时能够调用这些驱动程序。下面展示了该驱动 CMakeLists.txt 文件的具体内容。
#源文件路径,指本目录下的所有代码驱动
set(src_dirs
LED)
#头文件路径,指本目录下的所有代码驱动
set(include_dirs
LED)
#设置依赖库
set(requires
driver)
idf_component_register(SRC_DIRS ${src_dirs} INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})
component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
3.5、应用代码
打开 main/main.c 文件,内容如下:
/**
******************************************************************************
* @file main.c
* @author zjd
* @version V1.0
* @date 2024-05-25
* @brief LED灯
******************************************************************************
*/
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "led.h"
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
while(1)
{
LED_TOGGLE();
vTaskDelay(500); /* 延时500ms */
}
}
4、下载验证
下载完之后,可以看到 LED 以每次 500ms 闪烁。
5、补充
(1)VS Code安装C语言相关插件,才能正常跳转查看程序。
(2)我安装的插件如下: