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.pswp.cn/web/77726.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77726.shtml
英文地址,請注明出處:http://en.pswp.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差不多的。 我之前做的好幾個項目部署到測試服、正式服…