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

相关推荐
luckyluckypolar1 小时前
STM32——SPI
stm32·单片机·嵌入式硬件·物联网
极客小张3 小时前
基于STM32MP157与OpenCV的嵌入式Linux人脸识别系统开发设计流程
linux·stm32·单片机·opencv·物联网
OH五星上将3 小时前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
linux·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·liteos-a·鸿蒙内核
浅陌pa4 小时前
24:RTC实时时钟
c语言·stm32·单片机·嵌入式硬件
敲上瘾4 小时前
多态的使用和原理(c++详解)
开发语言·数据结构·c++·单片机·aigc·多态·模拟
小熊在忙fpga4 小时前
STM32如何修改外部晶振频率和主频
stm32·单片机·嵌入式硬件
我命由我123454 小时前
GPIO 理解(基本功能、模拟案例)
linux·运维·服务器·c语言·c++·嵌入式硬件·c#
学习日记hhh5 小时前
STM32G431RBT6(蓝桥杯)串口(发送)
stm32·单片机·嵌入式硬件
老李的森林5 小时前
嵌入式开发--STM32延时函数重构
stm32·单片机·嵌入式硬件·重构·延时
OH五星上将7 小时前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上
linux·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·liteos-a·鸿蒙内核