飞书文档https://x509p6c8to.feishu.cn/wiki/L6IGwHKV6ikQ08kqwAwcAvhznBc

前面我们学习了GPIO的输出,GPIO输入部分其实也是一样的,这里我们使用按键作为GPIO输入例程讲解,分三步走。

  • 查看板卡原理图,确定使用的是哪个GPIO
  • 查看GPIO官方例程,了解GPIO输入如何配置
  • 查看GPIO官方API文档,了解API参数和如何使用

1.1、查看板卡原理图,确定使用的是哪个GPIO

这里我们使用按键作为GPIO输入例程讲解,先查看原理图,找到按键连接的GPIO,如下图所示,板卡的GPIO42连接到按键。

1.2、查看GPIO官方例程,了解GPIO如何配置

这部分和GPIO输出的配置比较类似,GPIO的输入配置和输出配置,用的都是一个函数gpio_config,我们只需要把参数中的mode设置为输入模式即可。

    gpio_config_t io_conf = {};io_conf.intr_type = GPIO_INTR_DISABLE;io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;io_conf.mode = GPIO_MODE_INPUT;io_conf.pull_up_en = GPIO_PULLUP_ENABLE;gpio_config(&io_conf);

1.3、查看GPIO官方API文档,了解API参数和如何使用

GPIO输入主要用到两个函数,gpio_config和gpio_get_level,我们参考官方API手册了解下这两个函数的说明

头文件
#include "driver/gpio.h"esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
功能: gpio_config 函数用于配置一个或多个 GPIO 引脚。通过传递一个 gpio_config_t 结构体,可以设置引脚的模式、上拉/下拉电阻、中断类型等属性。pGPIOConfig参数说明
typedef struct {uint64_t pin_bit_mask;  // 要配置的 GPIO 引脚的位掩码gpio_mode_t mode;       // GPIO 引脚的工作模式gpio_pullup_t pull_up_en; // 是否启用上拉电阻gpio_pulldown_t pull_down_en; // 是否启用下拉电阻gpio_int_type_t intr_type; // 中断触发类型
} gpio_config_t;pin_bit_mask:
一个64位的掩码,用于指定要配置的引脚。每个位对应一个 GPIO 引脚,例如,若要配置 GPIO 2 和 GPIO 3,则可以设置为 (1ULL << 2) | (1ULL << 3)。mode: 引脚的工作模式,可以是以下值之一:
GPIO_MODE_DISABLE: 禁用引脚。
GPIO_MODE_INPUT: 输入模式。
GPIO_MODE_OUTPUT: 输出模式。
GPIO_MODE_OUTPUT_OD: 开漏输出模式。
GPIO_MODE_INPUT_OUTPUT_OD: 开漏输入输出模式。
GPIO_MODE_INPUT_OUTPUT: 输入输出模式。pull_up_en: 上拉电阻使能,可以是以下值之一:
GPIO_PULLUP_DISABLE: 禁用上拉电阻。
GPIO_PULLUP_ENABLE: 启用上拉电阻。pull_down_en: 下拉电阻使能,可以是以下值之一:
GPIO_PULLDOWN_DISABLE: 禁用下拉电阻。
GPIO_PULLDOWN_ENABLE: 启用下拉电阻。intr_type: 中断类型,可以是以下值之一:
GPIO_INTR_DISABLE: 禁用中断。
GPIO_INTR_POSEDGE: 上升沿触发中断。
GPIO_INTR_NEGEDGE: 下降沿触发中断。
GPIO_INTR_ANYEDGE: 任意边沿触发中断。
GPIO_INTR_LOW_LEVEL: 低电平触发中断。
GPIO_INTR_HIGH_LEVEL: 高电平触发中断。int gpio_get_level(gpio_num_t gpio_num);
功能: gpio_get_level 函数用于获取指定 GPIO 引脚的电平状态。该函数适用于配置为输入模式的 GPIO 引脚。
参数:
gpio_num: 要读取电平的 GPIO 引脚编号。
返回值:
0: 引脚处于低电平。
1: 引脚处于高电平。
-1: 参数无效(例如,GPIO 引脚编号无效或引脚未配置为输入模式)。

于是我们就可以得到最终的程序:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"static const char* TAG = "MyModule";
// 定义一个宏 GPIO_INPUT_IO,其值为 42,表示要使用的输入 GPIO 引脚编号为 42
#define GPIO_INPUT_IO 42
// 定义一个宏 GPIO_INPUT_PIN_SEL,通过位运算(将无符号长整型 1 左移 GPIO_INPUT_IO 位)生成一个用于选择特定 GPIO 引脚的掩码
#define GPIO_INPUT_PIN_SEL (1ULL << GPIO_INPUT_IO)void app_main(void)
{// 定义一个 gpio_config_t 类型的结构体变量 io_conf,并初始化为空结构体gpio_config_t io_conf = {};// 设置 GPIO 引脚的中断触发类型为上升沿触发io_conf.intr_type = GPIO_INTR_DISABLE;// 使用之前定义的掩码 GPIO_INPUT_PIN_SEL 来指定要配置的 GPIO 引脚io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;// 将 GPIO 引脚的工作模式设置为输入模式io_conf.mode = GPIO_MODE_INPUT;// 启用 GPIO 引脚的上拉电阻io_conf.pull_up_en = GPIO_PULLUP_ENABLE;// 调用 gpio_config 函数,将上述配置应用到指定的 GPIO 引脚gpio_config(&io_conf);while (1){int level = gpio_get_level(GPIO_INPUT_IO);ESP_LOGI(TAG, "level: %d", level);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

代码优化

上面代码中,GPIO初始化部分代码还是太零散了,有没有办法更整洁点,也是有的,我们可以使用另一种结构体初始化的方式,定义+赋值放到一起。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"static const char* TAG = "MyModule";#define GPIO_INPUT_IO 42
#define GPIO_INPUT_PIN_SEL (1ULL << GPIO_INPUT_IO)void app_main(void)
{gpio_config_t io_conf = {.pin_bit_mask = GPIO_INPUT_PIN_SEL,.mode = GPIO_MODE_INPUT,.pull_up_en = GPIO_PULLUP_ENABLE,};gpio_config(&io_conf);while (1){int level = gpio_get_level(GPIO_INPUT_IO);ESP_LOGI(TAG, "level: %d", level);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

然后我们需要把板卡接到底板上,因为按键是在底板上的。

然后按下按键,可以看到打印level:0,松开按键打印level:1

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

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

相关文章

高可用集群keepalived

1.不同操作系统的安装 1.1 不同系统编译安装 ubuntu环境 apt-get - y install libssl-dev libpopt-dev daemon build-essential libssl-dev openssl libpopt-dev libsnmp-dev libnl-3-dev libnl-genl-3-dev centos环境 &#xff08;其他的下同&#xff09; yum install - y…

SpringCloud - 整合MQ实现消息总线服务

一、背景介绍 每当修改配置文件内容&#xff0c;如果需要客户端也同步更新&#xff0c;就需要手动调用/refresh接口&#xff0c;以便客户端能获取到最新的配置内容。 当客户端越来越多的时候&#xff0c;通过人工进行处理显然非常鸡肋。有没有一种更加高效的办法&#xff0c;…

测试W5500的第3步_使用ioLibrary库创建TCPServer

W5500是一款具有8个Socket的网络芯片&#xff0c;支持TCP Server模式&#xff0c;最多可同时连接8个客户端。本文介绍了基于STM32F10x和W5500的TCP Server实现&#xff0c;包括SPI初始化、W5500复位、网络参数配置、Socket状态管理等功能&#xff0c;适用于需要多客户端连接的嵌…

Web攻防-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路

知识点&#xff1a; 1、Web攻防-SQL注入-产生原理&应用因素 2、Web攻防-SQL注入-各类数据库类型利用 演示案例-WEB攻防-SQL注入-数据库类型&架构分层&符号干扰 一、数据库知识 1、数据库名&#xff0c;表名&#xff0c;列名&#xff0c;数据 2、自带数据库&…

手机合集(不定期更新)

一、华为手机&#xff1a; 1.华为手机自助维修的方法&#xff1a; https://blog.csdn.net/humors221/article/details/145946128 2.华为手机实用功能介绍&#xff1a; https://blog.csdn.net/humors221/article/details/132514011 3.华为手机清理大数据的方法&#xff1a;…

移动安全Android——ROOT检测绕过

工具准备 Magisk GitHub - topjohnwu/Magisk: The Magic Mask for Android ZygisckNext GitHub - Dr-TSNG/ZygiskNext at v1.2.8 Shamiko Releases LSPosed/LSPosed.github.io 安卓ROOT教程 Magisk 安装教程 - Magisk 中文网 问题 大多数手机在ROOT状态下会出现APP闪…

Python高效网络爬虫开发指南

Python 网络爬虫入门与实战 一、引言 随着互联网数据的爆炸性增长&#xff0c;获取和分析这些数据变得越来越重要。网络爬虫作为数据采集的重要工具&#xff0c;在这其中扮演了不可或缺的角色。 二、环境搭建 首先我们需要安装Python环境以及一些必要的库&#xff1a; req…

wireshark: Display Filter Reference

https://www.wireshark.org/docs/dfref/// 这个里面的扩展功能还是很强大&#xff0c;可以帮着问题分析。支持大量的自定义化的字段读取功能&#xff0c;支持很多的协议。 https://www.wireshark.org/docs/dfref///f/frame.html frame.time_delta Time delta from previous ca…

dify创建银行客服系统例子

传统的银行客服系统&#xff0c;通常以会话管理的方式实现&#xff0c;配置繁琐复杂&#xff0c;固定且不灵活。如&#xff1a; 智能体的出现&#xff0c;为实现银行客服系统提供了想象空间&#xff0c;可以集知识库和业务流程为一体实现灵活可控的智能客服系统&#xff0c;即能…

前端函数防抖(Debounce)完整讲解 - 从原理、应用到完整实现

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

服务接口鉴权与内部认证:自定义注解与AOP实现的企业级实践

本文深入解析企业级系统中接口安全管控的核心需求&#xff0c;提出基于Spring AOP与自定义注解的轻量级鉴权方案。通过解构注解元数据定义、切面拦截逻辑、上下文传递机制等关键技术环节&#xff0c;系统阐述零侵入式鉴权体系的构建路径。结合金融支付网关、多租户SaaS平台、物…

26考研|高等代数:线性变换

前言 线性变换这一章节是考频较高的一部分&#xff0c;此部分涉及考点较多&#xff0c;涉及的考题也较多&#xff0c;学习线性变换时&#xff0c;应该注意搭建线性变换与矩阵之间的联系&#xff0c;掌握如何利用矩阵表示一个线性变换结构&#xff0c;同时介绍了最简单的线性变…

电磁兼容(EMC)仿真(精编版)

写在前面 本系列文章主要讲解电磁兼容(EMC)仿真的相关知识,希望能帮助更多的同学认识和了解电磁兼容(EMC)仿真。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 随着产品复杂性和密集度的提高以及设计周期的不断缩短,在设计周期的后期解决电磁兼容性(EMC)问题变得…

解决:dpkg: error: dpkg frontend lock is locked by another process

1、等待其他进程完成 如果后台有其他包管理操作&#xff08;如自动更新、软件安装等&#xff09;&#xff0c;等待几分钟再重试。 可以通过以下命令查看是否有相关进程&#xff1a; ps aux | grep -E apt|apt-get|dpkg 2、强制终止占用锁的进程 如果确认没有其他包管理操作&…

LVGL(lv_textarea文本框控件)

文章目录 一、lv_textarea 是什么&#xff1f;二、基本用法1. 创建 lv_textarea 对象2. 设置提示文字&#xff08;占位符&#xff09;3. 设置最大长度4. 设置密码模式&#xff08;显示为\*号&#xff09;5. 获取和设置内容6. 配合虚拟键盘使用&#xff08;常用于触摸屏&#xf…

【Java高阶面经:数据库篇】18、分布式事务:如何在分库分表中实现高性能与一致性?

一、分布式事务核心挑战:分库分表下的一致性困境 在分布式系统架构中,分库分表通过将数据分散存储提升了扩展性和性能,但却打破了传统单库事务的边界,使得分布式事务成为保障数据一致性的核心难题。其挑战主要体现在以下三方面: 1.1 ACID特性的分布式撕裂 原子性(Atomi…

【云呐】房地产企业固定资产如何管理

房产类固定资产如办公楼、门面房、宿舍楼、库房等&#xff0c;价值高、使用年限长、权属复杂、变更流程多&#xff0c;是企业最为关键的资产类型之一。管理房产类资产不仅要“看得到”&#xff0c;更要“管得住”。 房产资产管理应从权属明确开始。固定资产管理系统支持房产资产…

oracle数据库生成awr报告,排查数据库服务器CPU100%,系统卡顿,慢sql,根据sqlid查询关键信息,如会话SID,客户端机器名

AWR报告简介 AWR是Oracle 10g版本推出的特性,全称叫做 Automatic Workload Repository 全自动负载信息库 。Oracle启动后,会有后台进程定时采集并保存系统快照信息,也可以手工创建快照。AWR通过对比两个时间点的快照信息,生成该时间段的AWR报告,帮助DBA或开发人员了解 Ora…

kafka吞吐量提升总结

前言 原本自以为阅读了很久kafka的源码&#xff0c;对于kafka的了解已经深入到一定程度了&#xff0c;后面在某大厂的面试中&#xff0c;面试官询问我&#xff0c;如果需要提升kafka的性能&#xff0c;应该怎么做&#xff0c;我发现我能答上来的点非常的少&#xff0c;也暴露了…

鸿蒙 HarmonyOS NEXT 系统 Preference 首选项使用全解析

鸿蒙HarmonyOS系统Preference首选项使用全解析 大家好&#xff0c;我是威哥。在鸿蒙应用开发里&#xff0c;用户偏好设置的管理是极为重要的一环。HarmonyOS为我们提供了Preference组件&#xff0c;它能让我们轻松实现应用设置界面&#xff0c;对用户首选项进行高效管理。接下…