三、ESP32-IDF之LED

实现 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、程序流程图

LED闪烁程序流程图

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)我安装的插件如下:

相关推荐
Y1rong5 小时前
STM32之中断(二)
stm32·单片机·嵌入式硬件
Y1rong5 小时前
STM32之中断(一)
stm32·单片机·嵌入式硬件
LaoZhangGong1236 小时前
学习TCP/IP的第3步:和SYN相关的数据包
stm32·单片机·网络协议·tcp/ip·以太网
小郭团队6 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
持戒波罗蜜6 小时前
ubuntu20解决intel wifi 驱动问题
linux·驱动开发·嵌入式硬件·ubuntu
不做无法实现的梦~7 小时前
使用ros2来跑通mid360的驱动包
linux·嵌入式硬件·机器人·自动驾驶
bai5459367 小时前
STM32 CubeIDE 使用蓝牙模块实现手机控制LED灯
stm32·单片机·嵌入式硬件
gihigo19988 小时前
基于DSP28335 SCI模块控制ESP8266 WiFi模块的实现方案
单片机·嵌入式硬件
想放学的刺客8 小时前
单片机嵌入式嵌入式试题(第16期):硬件可靠性设计与复杂状态机架构设计
c语言·stm32·单片机·嵌入式硬件·物联网
qq_7391753699 小时前
stm32h743单片机驱动dac8568失效问题分析
stm32·单片机·嵌入式硬件