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

相关推荐
实在太懒于是不想取名28 分钟前
STM32N6的开发日记(8):在N6中部署自训练的火焰检测模型
stm32·单片机·嵌入式硬件
木子单片机1 小时前
基于51单片机温度上下限报警设计 数码管显示
stm32·单片机·嵌入式硬件·51单片机·keil
森利威尔电子-2 小时前
森利威尔SL3180 替换LTC3639 150V降压恒压芯片 3A峰值电流能力转换效率高 静态电流低
单片机·嵌入式硬件·集成电路·芯片·电源芯片
qq_401700412 小时前
合宙4G模块Air724UG
嵌入式硬件
yugi9878383 小时前
基于51单片机的篮球计分器设计
单片机·嵌入式硬件·51单片机
编程之升级打怪3 小时前
什么是PWM
嵌入式硬件
zmj3203244 小时前
单片机内存在C 语言编译后的 “逻辑分区”
c语言·单片机·内存分区
小柯博客5 小时前
STM32MP2 Secure Boot实战
stm32·单片机·嵌入式硬件
Ww.xh5 小时前
STM32调用AI接口完整教程
stm32·单片机·嵌入式硬件
ZYNQRFSOC5 小时前
基于安路PH2A系列FPGA的JESD204B接口测试
嵌入式硬件·fpga开发