ESP32- 开发笔记- 软件开发 4 - GPIO 口

1 背景介绍

GPIO(General Purpose Input/Output) ——通用输入输出口,就是能由软件自由控制输入(接收外界信号)或输出(发出电平信号)的引脚。

ESP32 最核心的功能之一,能被用来控制、连接、读取各种外设,比如按键、LED、传感器、继电器、屏幕等。

ESP32 有多达 39 个 GPIO 引脚,编号为 GPIO0 ~ GPIO39,不过并不是每一个都可以任意使用。

在这里插入图片描述

1.1 基本特性

在这里插入图片描述

1.2 不建议使用GPIO口

在这里插入图片描述

1.3 常用设置

在这里插入图片描述

1.3 IO Matrix(IOMUX)

ESP32每个引脚都可以通过IO Matrix(IOMUX)将其映射为某种外设功能,比如 UART、PWM、SPI等。这意味着你可以自由地分配功能到引脚,非常灵活!你可以把 I2C 的 SDA/SCL 分别映射到 GPIO21 和 GPIO22,也可以换成 GPIO18 和 GPIO19,只要代码里配置对应即可。

1.4 总结

ESP32 的 GPIO 功能非常强大、灵活。

要注意某些 GPIO 的启动限制或输入输出限制。

使用前建议查 ESP32 的 datasheet 或 IO 使用图。

可以结合中断、PWM、ADC、DAC、外设等,组成丰富的控制/采集系

2 案例展示

ESP-IDF里操作 GPIO,一般按这几个步骤:

  1. 配置 GPIO(方向/上拉/下拉/中断触发条件)

  2. 读输入 / 写输出

  3. (可选)注册中断回调

2.1 输出模式-控制led灯

#include "driver/gpio.h"#define LED_GPIO_PIN 2  // GPIO2接LEDvoid app_main(void)
{gpio_reset_pin(LED_GPIO_PIN);gpio_set_direction(LED_GPIO_PIN, GPIO_MODE_OUTPUT);while (1) {gpio_set_level(LED_GPIO_PIN, 1); // 点亮LEDvTaskDelay(pdMS_TO_TICKS(500));gpio_set_level(LED_GPIO_PIN, 0); // 熄灭LEDvTaskDelay(pdMS_TO_TICKS(500));}
}

2.2 读入按键

#include "driver/gpio.h"#define BUTTON_GPIO_PIN 0  // GPIO0接按钮void app_main(void)
{gpio_reset_pin(BUTTON_GPIO_PIN);gpio_set_direction(BUTTON_GPIO_PIN, GPIO_MODE_INPUT);gpio_pullup_en(BUTTON_GPIO_PIN); // 开启上拉,避免悬空抖动while (1) {int button_level = gpio_get_level(BUTTON_GPIO_PIN);if (button_level == 0) {printf("Button Pressed!\n");}vTaskDelay(pdMS_TO_TICKS(100));}
}

3 总结

在这里插入图片描述
正常开发推荐使用 GPIO 2, 4, 5, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33 这些口,比较安全

4 中断

4.1 工作模式

ESP32支持在GPIO上检测:

  1. 上升沿触发(低 → 高)

  2. 下降沿触发(高 → 低)

  3. 任意电平触发(高电平/低电平)

  4. 双边沿触发(上升+下降)

⚡ 触发时,会调用一个中断回调函数(ISR Handler),可以马上做反应,比如读取按键状态!

在这里插入图片描述

4.2 设置流程

在这里插入图片描述

4.3 案例

用 GPIO0 按钮触发中断,点亮/熄灭LED(GPIO2)

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"#define BUTTON_GPIO GPIO_NUM_0
#define LED_GPIO    GPIO_NUM_2static const char *TAG = "GPIO_ISR";volatile int led_state = 0; // 注意 volatile,ISR中会修改!// 中断回调函数(一定要短小!)
static void IRAM_ATTR gpio_isr_handler(void* arg)
{led_state = !led_state; // 翻转LED状态gpio_set_level(LED_GPIO, led_state);
}void app_main(void)
{// 配置LED引脚gpio_reset_pin(LED_GPIO);gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);// 配置按钮引脚gpio_reset_pin(BUTTON_GPIO);gpio_set_direction(BUTTON_GPIO, GPIO_MODE_INPUT);gpio_pullup_en(BUTTON_GPIO); // 开启上拉,避免悬空gpio_set_intr_type(BUTTON_GPIO, GPIO_INTR_NEGEDGE); // 配置下降沿中断(按下)// 安装中断服务gpio_install_isr_service(0); // 参数是flag,一般填0gpio_isr_handler_add(BUTTON_GPIO, gpio_isr_handler, NULL); // 绑定回调函数ESP_LOGI(TAG, "Setup complete, waiting for button interrupt...");// 主循环啥也不用做while (1) {vTaskDelay(pdMS_TO_TICKS(1000));}
}

4.4 总结

按键中断常用下降沿(NEGEDGE)。

中断回调要短小、快速,不能长时间占用CPU。

可以通过信号量或消息队列,把中断事件传给主任务中慢慢处理

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

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

相关文章

格式工厂:多媒体转换工具

格式工厂&#xff08;FormatFactory&#xff09;是一款免费且功能全面的多媒体格式转换工具&#xff0c;支持视频、音频、图片及文档等多种格式的转换&#xff0c;覆盖超过70种语言&#xff0c;并兼容Windows XP至Win10/11系统。软件基于FFmpeg解码库开发&#xff0c;支持高效转…

在Anolis OS 8上部署Elasticsearch 7.16.1与JDK 11的完整指南

目录 1. 环境与版本选择 1.1 操作系统选择:Anolis OS 8 1.2 版本匹配说明 1.3 前置条件检查 2. JDK 11安装与配置 2.1 安装流程 2.2 配置详解 3. Elasticsearch 7.16.1安装与优化 3.1 基础安装 3.2 目录规划与权限 3.3 核心配置文件详解 3.4 JVM调优 4. 用户权限管…

Java中final关键字的作用?

在Java中&#xff0c;final 关键字用于表示不可变性&#xff0c;具体作用取决于它修饰的目标&#xff08;变量、方法或类&#xff09;。以下是其核心作用&#xff1a; 1. 修饰变量&#xff08;常量&#xff09; 基本类型变量&#xff1a;值不可更改&#xff08;常量&#xff09…

自动伴随无人机说明文档

自动伴随无人机说明文档 一、无人机参数二、能力说明三、操作流程3.1 模式定义3.2 启动流程3.3 可调参数&#xff08;建议默认&#xff09; 四、特别注意五、最后 一、无人机参数 型号&#xff1a;S400视觉pro版轴距&#xff1a;400mm起飞重量&#xff1a;1300g额外载重&#…

53.[前端开发-JS实战框架应用]Day04-Bootstrap入门到项目实战

Bootstrap入门到实战 1 认识Bootstrap 认识Bootstrap Bootstrap起源和历史 Bootstrap3-5版本的区别 Bootstrap优缺点 学习Bootstrap的理由 2 Bootstrap安装 Bootstrap4的安装 方式一 : CDN <!DOCTYPE html> <html lang"en"> <head><meta cha…

C#:创建变量和类的实例

在 C# 编程中&#xff0c;类作为引用类型&#xff0c;创建其变量和实例涉及到内存分配等重要概念。以下为你详细介绍创建类实例的步骤和相关操作。 类的声明与变量声明 类的声明就像是创建类实例的蓝图。当我们声明一个类后&#xff0c;就能够创建该类的实例。类属于引用类型…

<el-date-picker 设置记录时间早于当前时间 (包含时分秒)

<el-date-picker 设置记录时间早于当前时间 &#xff08;包含时分秒&#xff09; <el-date-pickerv-else-if"item.type datetime"v-model"state.ruleForm[item.key]"type"datetime":placeholder"item.title"format"YYYY-M…

Tailwind CSS 响应式设计解析(含示例)

本文内容&#xff1a; Tailwindcss V4 中如何使用响应式设计功能&#xff0c;包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧&#xff0c;帮助你在不离开 HTML 的前提下优雅构建响应式页面。 &#x1f31f; 默认断点用法&#xff08;移动优先&#xff09; Tail…

生态修复项目管理软件

在“双碳”目标与生态文明建设的双重驱动下&#xff0c;生态修复项目正成为全球环境治理的核心战场。然而&#xff0c;矿山复绿、湿地修复、水土保持等工程往往面临跨地域、多主体、长周期的管理难题——从数据分散到进度失控&#xff0c;从成本超支到风险频发&#xff0c;传统…

基于PyTorch的图像分类特征提取与模型训练文档

概述 本代码实现了一个基于PyTorch的图像特征提取与分类模型训练流程。核心功能包括&#xff1a; 使用预训练ResNet18模型进行图像特征提取 将提取的特征保存为标准化格式 基于提取的特征训练分类模型 代码结构详解 1. 库导入 import torch import torch.nn as nn import…

写一个 Java 程序,用于将字符串中的指定子串替换为另一个子串

以下是一个 Java 程序&#xff0c;它可以将字符串中的指定子串替换为另一个子串。 public class SubstringReplacement {public static String replaceSubstring(String original, String oldSubstring, String newSubstring) {return original.replace(oldSubstring, newSubs…

Docker 容器双网卡访问物理雷达网络教程

作者&#xff1a; 陈梓洋 环境&#xff1a; ubuntu 22.04lts 时间&#xff1a; 2025年4月29日 Docker 容器双网卡访问物理雷达网络教程 这个教程适用于这样的场景&#xff1a;容器保留原有 ROS 通信网络&#xff08;如 bridge 网络&#xff09;&#xff0c;同时需要访问一个物…

AWS创建多块盘并创建RAID0以及后增加空间

创建硬盘并挂载到EC2上,后查询如下 [rootip-127-0-0-1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 40G 0 disk ├─nvme0n1p1 259:1 0 40G 0 part / ├─nvme0n1p127 259:2 0 1M 0 part └─nvme0n1p128 259:3 …

数据结构---单链表的增删查改

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言 概念&#xff1a; 单链表的结构 我们设定一个哨兵位头节点给链…

XSS靶场实战(工作wuwuwu)

knoxss knoxss Single Reflection Using QUERY of URL ——01 测试标签 <script>alert(666666)</script>——02: " <h1>test</h1>没有反应&#xff0c;查看源码 现在需要闭合双引号&#xff0c;我计划还是先搞标签 "><h1>tes…

基于 BERT 微调一个意图识别(Intent Classification)模型

基于 BERT 微调一个意图识别&#xff08;Intent Classification&#xff09;模型&#xff0c;你的意图类别包括&#xff1a; 查询天气获取新闻咨询想听音乐想添加备忘查询备忘获取家政服务结束对话增加音量减小音量其他 具体实现步骤&#xff08;详细版&#xff09; 1. 准备你…

SSM书籍管理(环境搭建)

整合SSM&#xff1a;SpringSpringMVCMybatis 环境要求&#xff1a;IDEA、MySQL5、Tomcat9、Maven3 数据库搭建 数据库准备以下数据用于后续实验&#xff1a;创建一个ssmbuild数据库&#xff0c;表books&#xff0c;该表有4个字段&#xff0c;并且插入3条数据用于后续。 CRE…

API文档生成与测试工具推荐

在API开发过程中&#xff0c;文档的编写和维护是一项重要但繁琐的工作。为了提高效率&#xff0c;许多开发者会选择使用API文档自动生成工具或具备API文档生成功能的API门户产品。选择能导入API文档的工具生成测试脚本, 本文将全面梳理市面上符合OpenAPI 3.0规范的文档生成工具…

linux修改环境变量

添加环境变量注意事项。 vim ~/.bashrc 添加环境变量时&#xff0c;需要source ~/.bashrc后才能有效。同时只对当前shell窗口有效&#xff0c;当打开另外的shell窗口时&#xff0c;需要重新source才能起效。 1.修改bashrc文件后 2.source后打开另一个shell窗口则无效&#xff…

springboot项目中,MySQL数据库转达梦数据库

前言 前段时间&#xff0c;公司要求要把某几个项目的数据库换成达梦数据库&#xff0c;说是为了国产化。我就挺无语的&#xff0c;三四年的项目了&#xff0c;现在说要换数据库。我一开始以为这个达梦数据库应该是和TIDB差不多的。 我之前做的好几个项目部署到测试服、正式服…