实现 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_dirsLED)
#头文件路径,指本目录下的所有代码驱动
set(include_dirsLED)
#设置依赖库
set(requiresdriver)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)我安装的插件如下: