三、ESP32-IDF之LED

news2025/3/18 23:39:46

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

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模块化程序设计(函数的定义、调用、参数传递、局部变量、全局变量)

函数的引入&#xff1a; 我们曾经学习了程序设计中的三种基本控制结构&#xff08;顺序、分支、循环&#xff09;。用它们可以组成任何程序。但在应用中&#xff0c;还经常用到子程序结构。 通常&#xff0c;在程序设计中&#xff0c;我们会发现一些程序段在程序的不同地方反复…

[数据集][目标检测]痤疮检测数据集VOC+YOLO格式915张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;915 标注数量(xml文件个数)&#xff1a;915 标注数量(txt文件个数)&#xff1a;915 标注类别…

qmt量化教程4----订阅全推数据

文章链接 qmt量化教程4----订阅全推数据 (qq.com) 上次写了订阅单股数据的教程 量化教程3---miniqmt当作第三方库设置&#xff0c;提供源代码 全推就主动推送&#xff0c;当行情有变化就会触发回调函数&#xff0c;推送实时数据&#xff0c;可以理解为数据驱动类型&#xff0…

有趣的css - 圆形背景动效多选框

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个圆形背景动效多选框&#xff0c;适用提醒用户勾选场景&#xff0c;突出多选框选项&#xff0c;可以有效增加用户识别度。 最新文章通过公众号「设计师工作日常」发布…

【完整解析】2024电工杯数学建模A题论文与代码

园区微电网风光储协调优化配置 1 论文2 代码分享2.1 第三题第一问 3 数据与代码 1 论文 2 代码分享 2.1 第三题第一问 function anssq3w1ObjFun(ttt,id); %ttttt(1); tt[750,0,0,1000,600,500]; limttt(1)*200; limmttt(2)*500*0.9-ttt(2)*500*0.1; t1ttt(3)*1000;t2ttt(4)*1…

【spring】@RequestMapping注解学习

RequestMapping介绍 官网地址&#xff1a;Mapping Requests :: Spring Framework RequestMapping 是Spring框架中的一个核心注解&#xff0c;主要用于处理HTTP请求的地址映射。它属于Spring MVC框架的一部分&#xff0c;用于将接收到的Web请求映射到特定的处理器类或处理器方…

MySQL存储过程for循环处理查询结果

在MySQL数据库中&#xff0c;存储过程是一种预编译的SQL语句集&#xff0c;可以被多次调用。在MySQL中使用存储过程查询到结果后&#xff0c;有时候需要对这些结果进行循环处理。 1. 创建表 CREATE TABLE t_job (job_id int(11) unsigned NOT NULL AUTO_INCREMENT,job_name v…

手写tomcat(Ⅰ)——tomcat原理

Tomcat简介 众所周知&#xff0c;动态web项目基本就是使用了tomcat作为服务端 动态web项目的目录结构 Tomcat是一个轻量级的服务器&#xff0c;其实就是一个Java程序&#xff0c;能够作为一个服务端去接收客户端的请求&#xff0c;并返回给客户端响应 Tomcat本身是一个容器…

基于Keras的手写数字识别(附源码)

目录 引言 为什么要创建虚拟环境&#xff0c;好处在哪里&#xff1f; 源码 我修改的部分 调用本地数据 修改第二层卷积层 引言 本文是博主为了记录一个好的开源代码而写&#xff0c;下面是代码出处&#xff01;强烈建议收藏&#xff01;【深度学习实战—1】&#xff1a…

5、sqlmap注入post类型+os-shell

题目&#xff1a;青少年&#xff1a;Easy_SQLi 1、打开网页&#xff0c;是一个登入表单 2、判断注入类型&#xff0c;是一个字符注入&#xff0c;使用or直接绕过密码进去了 3、上bp抓取数据包&#xff0c;sqlmmap用post注入走一遍&#xff0c;找到数据库&#xff0c;账号密码&…

【Linux】TCP协议【中】{确认应答机制/超时重传机制/连接管理机制}

文章目录 1.确认应答机制2.超时重传机制&#xff1a;超时不一定是真超时了3.连接管理机制 1.确认应答机制 TCP协议中的确认应答机制是确保数据可靠传输的关键部分。以下是该机制的主要步骤和特点的详细解释&#xff1a; 数据分段与发送&#xff1a; 发送方将要发送的数据分成一…

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

JVM-调优之-如何使用arthas-观察jvm-cpu-内存-垃圾回收等信息

前言&#xff1a; 可以简单代替把dump文件下载下来后用visualvm分析了&#xff1b;跟visualvm类似的&#xff1b; docker中如何安装arthas看这个&#xff1a;docker中怎么使用arthas_arthas 集成到容器镜像-CSDN博客 curl -O https://arthas.aliyun.com/arthas-boot.jar wget …

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版&#xff0c;它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台&#xff0c;所以它没有 .NET FrameWork 的历史包袱&#xff0c;相对于 .NET FrameWork&#xff0c;它具备很多优势。 .NET Core 有哪些优势&am…

列主元消去法和矩阵三角分解法求解线性方程组

目录 列主元消去法矩阵三角分解法 列主元消去法 构建增广矩阵&#xff1a; 将线性方程组写成矩阵形式 &#x1d434;&#x1d44b;&#x1d435;&#xff0c;并将系数矩阵 &#x1d434;与常数向量 &#x1d435;组成增广矩阵 [&#x1d434;∣&#x1d435;]。选择主元&#…

ACW石子合并-XMUOJ元素共鸣:唤醒神之眼 -区间DP

题目 思路 话不多说&#xff0c;直接上代码 代码 /* ACW石子合并-XMUOJ元素共鸣&#xff1a;唤醒神之眼 JinlongW-2024/05/25 区间DP 当i<j时&#xff0c;f[i][j]min(f[i][k]f[k][j]s[j]-s[i-1]) 当ij时&#xff0c;f[i][j]0 最终答案&#xff1a;f[1][n] *//* 区间DP…

ESP32 接入点灯科技实现远程控制(物联网)

文章目录 ESP32-C3MQTT协议blinker App 源码blinker 开发者Arduino 支持文档导入 blinker 库注册点灯 APPblinker WiFi 示例blinker 蓝牙示例 本示例中开发板使用的是Seeed Studio (XIAO-ESP32-C3) ESP32-C3 ESP32-C3 是 Espressif Systems 公司开发的一款单核 Wi-Fi 和蓝牙双模…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

每日5题Day10 - LeetCode 46 - 50

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;46. 全排列 - 力扣&#xff08;LeetCode&#xff09; class Solution {//这道题就是一个dfs//把所有结果遍历&#xff0c;到叶子节点就可以添加结果了List<Int…

忘记“也是一门学问:机器如何忘记自己学到的知识?

在信息时代&#xff0c;我们常常希望人工智能能够学到更多的知识&#xff0c;变得更加智能。但你是否想过&#xff0c;有时候让机器"忘记"一些它学到的东西&#xff0c;也是一件很重要的事&#xff1f; 随着用户隐私保护意识的提高和相关法律法规的出台&#xff0c;…