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

相关推荐
KaiGer6661 小时前
AUTOSAR图解==>AUTOSAR_SWS_ICUDriver
单片机·汽车·嵌入式·autosar
SANGEDZ_YYDS2 小时前
三格电子上新了——IO-Link系列集线器
单片机
亿道电子Emdoor2 小时前
【ARM】MDK如何将变量存储到指定内存地址
arm开发·stm32·单片机
搬砖的小码农_Sky2 小时前
FPGA:Lattice的FPGA产品线以及器件选型建议
嵌入式硬件·fpga开发·硬件架构·硬件工程
mftang2 小时前
Zephyr OS Nordic芯片的Flash 操作
单片机·嵌入式硬件·物联网
阿川!4 小时前
嵌入式软件--stm32 DAY 6 USART串口通讯(下)
stm32·单片机·嵌入式硬件
WKJay_13 小时前
深入理解 Cortex-M3 特殊寄存器
stm32·单片机·嵌入式硬件
Linux嵌入式木子15 小时前
# 2-STM32F103-复位和时钟控制RCC
stm32·单片机·嵌入式硬件
小智学长 | 嵌入式17 小时前
单片机-STM32部分:13-1、编码器
单片机·嵌入式硬件
暗碳17 小时前
WF24 wifi/蓝牙模块串口与手机蓝牙通信
嵌入式硬件