SOC-ESP32S3部分:9-GPIO輸入按鍵狀態讀取

飛書文檔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;對用戶首選項進行高效管理。接下…