ESP32 入门笔记02: GPIO 参考指南


ESP32 芯片有48个引脚,具有多种功能,并不是所有的 ESP32 开发板的管脚都暴露在外,有些管脚不能使用。下图显示了典型 ESP-WROOM-32 模块的引脚排列。它由 38 针组成(每个长边 14 针,底部短边 10 针)。通过图片可知,除开3.3V和3个GND, ESP-WROOM-32 模块34个可编程GPIO端口。

在这里插入图片描述

ESP32每个 GPIO 消耗的绝对最大电流40mA。ESP32 还具有内置霍尔效应传感器,可检测周围磁场的变化。

关于如何使用 ESP32 GPIO 有很多问题。你应该使用什么引脚?您应该避免在项目中使用哪些引脚?这篇文章旨在成为一份简单易懂的 ESP32 GPIO 参考指南。

注意:并非所有 GPIO 都可以在所有开发板中访问,但无论您使用哪种开发板,每个特定 GPIO 都以相同的方式工作。如果您刚刚开始使用 ESP32,建议您阅读:ESP32 开发板入门

外设

(Peripherals)

ESP32 DEVKIT V1 DOIT 板具有 36个管脚,但管脚位置可能因制造商而异,38个管脚的开发板是在 ENGPIO23 的上面各多1个3v3 和1个 GND引脚,管脚位置可能因制造商而异。
在这里插入图片描述

  • 18 个 12 位 ADC 通道
  • 2 个 8 位 DAC 通道
  • 16PWM 通道
  • 3UART接口
  • 3SPI接口
  • 2I2C 接口
  • 2I2S 接口
  • 10 个电容式触摸感应 GPIO
  • 16RTC GPIO

ADC 和 DAC 引脚是出厂预定义的,您必须使用制造商指定的引脚。但其他功能如 PWM、SPI、UART、I2C 等可以通过程序分配给任何 GPIO 引脚。

GPIO接口

ESP32 芯片有34个可编程的GPIO引脚,每个引脚执行多个功能,也就是IO口复用,设置IO口功能的时候只有一个功能会被激活。可以在程序中将引脚配置为 GPIO 、 ADC 、UART等等。

此外,还有一些具有特定功能的引脚,使其适合或不适合特定项目。下表显示了哪些引脚最适合用作输入、输出以及需要谨慎使用的引脚。

绿色突出显示的引脚可以使用。黄色突出显示的可以使用,但您需要注意,因为它们可能主要在启动时出现意外行为。不建议将红色突出显示的引脚用作输入或输出

在这里插入图片描述

仅输入GPIO (Input only pins)

GPIO 34 到 39 是 GPIO——仅输入引脚。这些引脚没有内部上拉或下拉电阻。它们不能用作输出,因此只能将这些引脚用作输入:

  • GPIO 34
  • GPIO 35
  • GPIO 36
  • GPIO 39

电容式触摸 GPIO

ESP32 有 10 个内部电容式触摸传感器。这些可以感知任何带有电荷的东西的变化,比如人类皮肤。因此,他们可以检测用手指触摸 GPIO 时引起的变化。这些引脚可以很容易地集成到电容垫中并取代机械按钮。电容式触摸引脚也可用于将 ESP32 从深度睡眠中唤醒

这些内部触摸传感器连接到这些 GPIO:

  • T0 (GPIO 4)
  • T1 (GPIO 0)
  • T2 (GPIO 2)
  • T3 (GPIO 15)
  • T4 (GPIO 13)
  • T5 (GPIO 12)
  • T6 (GPIO 14)
  • T7 (GPIO 27)
  • T8 (GPIO 33)
  • T9 (GPIO 32)

了解如何在 Arduino IDE 中使用触控引脚: ESP32 Touch Pins with Arduino IDE

模数转换器 (ADC)

ESP32 有 18 个 12 位 ADC 输入通道(而ESP8266 只有 1 个 10 位 ADC)。这些是可用作 ADC 和相应通道的 GPIO:

  • ADC1_CH0 (GPIO 36)
  • ADC1_CH1 (GPIO 37)
  • ADC1_CH2 (GPIO 38)
  • ADC1_CH3 (GPIO 39)
  • ADC1_CH4 (GPIO 32)
  • ADC1_CH5 (GPIO 33)
  • ADC1_CH6 (GPIO 34)
  • ADC1_CH7 (GPIO 35)
  • ADC2_CH0 (GPIO 4)
  • ADC2_CH1 (GPIO 0)
  • ADC2_CH2 (GPIO 2)
  • ADC2_CH3 (GPIO 15)
  • ADC2_CH4 (GPIO 13)
  • ADC2_CH5 (GPIO 12)
  • ADC2_CH6 (GPIO 14)
  • ADC2_CH7 (GPIO 27)
  • ADC2_CH8 (GPIO 25)
  • ADC2_CH9 (GPIO 26)

注意:使用 Wi-Fi 时不能使用 ADC2 引脚。因此,如果您使用的是 Wi-Fi,并且无法从 ADC2 GPIO 获取值,则可以考虑改用 ADC1 GPIO。那应该可以解决您的问题。

了解如何使用 ESP32 ADC 引脚:ESP32 ADC – Read Analog Values with Arduino IDE

ADC 输入通道具有 12 位分辨率。这意味着您可以获得 0 到 4095 范围内的模拟读数,其中 0 对应 0V,4095 到 3.3V。您还可以在代码和 ADC 范围上设置通道的分辨率。

ESP32 ADC 引脚没有线性行为。您可能无法区分 0 和 0.1V,或 3.2 和 3.3V。使用 ADC 引脚时需要牢记这一点。

数模转换器 (DAC)

ESP32 上有 2 个 8 位 DAC 通道,用于将数字信号转换为模拟电压信号输出。这些是 DAC 通道:

  • DAC1 (GPIO25)
  • DAC2 (GPIO26)

脉宽调制 ( PWM)

ESP32 LED PWM 控制器有 16 个独立通道,可配置为生成具有不同属性的 PWM 信号。所有可以作为输出的引脚 都可以用作 PWM 引脚。

注意:所有GPIO端口中,GPIO 3439 不能生成 PWM)。

要设置 PWM 信号,您需要在代码中定义这些参数:

  • 信号频率;
  • 占空比;
  • 脉宽调制通道;
  • 要输出信号的 GPIO。

了解如何将 ESP32 PWM 与 Arduino IDE 一起使用:ESP32 PWM 与 Arduino IDE

实时时钟 (RTC)

ESP32 支持 RTC GPIO。当 ESP32 处于深度睡眠状态时,可以使用路由到 RTC 低功耗子系统的 GPIO。当超低功耗 (ULP) 协处理器运行时,这些 RTC GPIO 可用于将 ESP32 从深度睡眠中唤醒。以下 GPIO 可用作外部唤醒源

  • RTC_GPIO0 (GPIO36)
  • RTC_GPIO3 (GPIO39)
  • RTC_GPIO4 (GPIO34)
  • RTC_GPIO5 (GPIO35)
  • RTC_GPIO6 (GPIO25)
  • RTC_GPIO7 (GPIO26)
  • RTC_GPIO8 (GPIO33)
  • RTC_GPIO9 (GPIO32)
  • RTC_GPIO10 (GPIO4)
  • RTC_GPIO11 (GPIO0)
  • RTC_GPIO12 (GPIO2)
  • RTC_GPIO13 (GPIO15)
  • RTC_GPIO14 (GPIO13)
  • RTC_GPIO15 (GPIO12)
  • RTC_GPIO16 (GPIO14)
  • RTC_GPIO17 (GPIO27)

了解如何使用 RTC GPIO 将 ESP32 从深度睡眠中唤醒: ESP32 Deep Sleep with Arduino IDE and Wake Up Sources

UART

ESP32 有3个 UART ,UART1用作板载USB转串口程序一键下载, ESP32 DEVKIT V1 DOIT 板上UART0和UART2的引脚为:

UARTGPIO
UART0_TXGPIO1
UART0_RXGPIO3
UART2_TXGPIO17
UART2_RXGPIO16

I2C

ESP32 有2个 I2C 通道,任何引脚都可以设置为 SDA 或 SCL。在 Arduino IDE 中使用 ESP32 时,默认的 I2C 引脚为:

  • GPIO 21 (SDA)
  • GPIO 22 (SCL)

了解有关使用 Arduino IDE 与 ESP32 的 I2C 通信协议的更多信息:ESP32 I2C 通信(设置引脚、多总线接口和外设)

SPI

默认情况下,SPI 的引脚映射为:

在这里插入图片描述

中断(INT)

所有 GPIO 都可以配置为中断。

使能 (EN)

Enable (EN) 是 3.3V 稳压器的使能引脚。它被上拉,所以接地以禁用 3.3V 稳压器。例如,这意味着您可以使用此引脚连接到按钮来重新启动 ESP32

集成闪存(SPI flash)

GPIO 6 到 GPIO 1 暴露在一些 ESP32 开发板上。但是,这些引脚连接到 ESP-WROOM-32 芯片上的集成 SPI 闪存,不推荐用于其他用途。所以,不要在你的项目中使用这些引脚:

  • GPIO 6 (SCK/CLK)
  • GPIO 7 (SDO/SD0)
  • GPIO 8 (SDI/SD1)
  • GPIO 9 (SHD/SD2)
  • GPIO 10 (SWP/SD3)
  • GPIO 11 (CSC/CMD)

Strapping Pins

ESP32 芯片有以下捆扎引脚:

  • GPIO 0
  • GPIO 2
  • GPIO 4
  • GPIO 5(启动时必须为高电平)
  • GPIO 12(启动期间必须为低电平)
  • GPIO 15(启动时必须为高电平)

这些用于将 ESP32 置于引导加载程序或闪烁模式。在大多数带有内置 USB/Serial 的开发板上,您无需担心这些引脚的状态。该板将引脚置于正确的状态以进行闪烁或启动模式。有关ESP32 引导模式选择的更多信息,请参见此处

但是,如果您将外围设备连接到这些引脚,您可能无法尝试上传新代码、使用新固件刷新 ESP32 或重置电路板。如果您有一些外围设备连接到捆绑引脚,并且在上传代码或刷新 ESP32 时遇到问题,可能是因为这些外围设备阻止了 ESP32 进入正确模式。阅读引导模式选择文档以指导您正确的方向。重置、闪烁或启动后,这些引脚按预期工作。

Pins HIGH at Boot

一些 GPIO 在启动或复位时将其状态更改为 HIGH 或输出 PWM 信号。这意味着如果您有连接到这些 GPIO 的输出,您可能会在 ESP32 重置或启动时得到意外结果。

  • GPIO 1
  • GPIO 3
  • GPIO 5
  • GPIO 6 至 GPIO 11 (连接到 ESP32 集成 SPI 闪存 - 不推荐使用).
  • GPIO 14
  • GPIO 15

参考资料

<think>好的,用户现在问的是ESP32GPIO0引脚。之前他们问过重启引脚,也就是EN引脚,所以可能他们现在在深入学习ESP32的各个GPIO功能,或者是在做某个项目需要用到GPIO0。 首先,我需要回顾一下ESP32GPIO0的主要功能。GPIO0在ESP32中确实是一个多功能的引脚,特别是在启动模式选择方面。用户可能在使用ESP32时遇到了启动模式的问题,比如无法上传程序,或者设备启动不正常,这时候GPIO0的状态就很重要了。比如,GPIO0需要拉低才能进入下载模式,这可能在上传代码时是必须的步骤,但用户可能没有意识到这一点,导致上传失败。 接下来,用户可能想知道GPIO0在正常操作时的功能,比如作为普通IO使用的情况,输入或输出模式,以及需要注意的事项,比如内部上拉电阻的情况。用户可能在连接外部设备,比如传感器或按钮时,需要配置GPIO0的正确模式,避免意外触发进入下载模式。 另外,GPIO0还可以作为ADC输入,用于读取模拟信号,比如电位器或光敏电阻的值。这可能也是用户关心的一个点,特别是如果他们需要用到模拟输入功能的话。但需要提醒用户注意ADC的精度问题,以及输入电压范围。 还有,GPIO0可能与其他功能复用,比如触摸传感器或SPI总线,但根据ESP32的不同型号,这些复用功能可能有所不同。用户可能在设计电路时需要知道这些复用功能,以避免冲突。 用户可能遇到的问题包括:为什么按下复位后设备不启动,可能是因为GPIO0被意外拉低;或者上传代码时遇到问题,可能是因为GPIO0的状态不正确。需要给出这些常见问题的解决方法,比如检查GPIO0的连接,确保在启动时有正确的上拉电阻,或者使用自动下载电路的设计。 另外,用户可能关心如何正确使用GPIO0作为普通IO口,比如在代码中如何配置,是否需要额外的电路。需要给出具体的代码示例,比如设置输入输出模式,使用内部上拉等,以及注意事项,比如避免在启动时外部电路影响GPIO0的电平。 总结一下,用户的需求可能包括了解GPIO0的多功能用途,如何正确配置它以满足不同的应用场景,以及解决在使用过程中可能遇到的问题。需要结构清晰,分点说明,确保用户能够逐步理解GPIO0的重要性及其正确使用方法。</think>以下是关于ESP32 **GPIO0** 的详细介绍,分点说明其功能、用途及注意事项: --- ### 1. GPIO0 的核心功能 - **普通GPIO模式**: 可作为通用输入/输出引脚,支持数字信号读写(默认高电平)。 - **特殊功能复用**: - **启动模式选择**:决定芯片启动时的行为(正常启动 vs 下载模式)。 - **ADC1_CH0**:支持模拟信号输入(12位ADC,量程0-3.3V)。 - **Touch Sensor**:部分ESP32型号支持触摸检测(如ESP32-S2)。 - **SPI信号**:可复用为SPI总线功能(如`SPI_MISO`)。 --- ### 2. 关键特性:启动模式控制 GPIO0在芯片上电时的电平决定启动行为: | GPIO0电平 | 启动模式 | 典型应用场景 | |-----------|-------------------|----------------------------| | 高电平 | 正常启动 | 运行已烧录的固件 | | 低电平 | 进入下载模式 | 通过串口烧录新程序(与`EN`配合) | **操作示例**: 1. **手动进入下载模式**: - 按住开发板上的`BOOT`按钮(通常连接GPIO0) - 短按`RST`按钮(EN引脚复位) - 等待电脑识别串口后释放`BOOT`按钮 2. **自动下载电路**: 部分开发板通过CH340等USB芯片自动控制GPIO0和EN电平,实现一键烧录。 --- ### 3. 作为普通GPIO的使用方法 #### 代码示例(Arduino框架): ```cpp void setup() { pinMode(0, INPUT_PULLUP); // 启用内部上拉电阻(约45kΩ) // pinMode(0, OUTPUT); // 设置为输出模式 } void loop() { digitalWrite(0, HIGH); // 输出高电平 int val = digitalRead(0); // 读取数字输入 // analogRead(0); // 读取模拟输入(需配置ADC) } ``` --- ### 4. 重要注意事项 1. **上电时序要求**: - 系统启动时,GPIO0必须在50ms内保持稳定电平,否则可能导致启动失败。 - 避免在GPIO0上连接大电容或复杂电路,防止电平变化延迟。 2. **ADC精度限制**: - 作为ADC输入时,需注意ESP32 ADC的非线性误差(典型±6%),建议校准或外接专用ADC芯片。 3. **硬件设计建议**: - 若需固定启动模式,可添加10kΩ上拉/下拉电阻: ```plaintext GPIO0 ──┬── 10kΩ上拉电阻 ── 3.3V(强制正常启动) └── 10kΩ下拉电阻 ── GND(强制下载模式) ``` - 若需频繁切换模式,建议保留按钮控制电路。 4. **静电防护**: GPIO0未使用时,建议设置为输入模式并启用内部上拉,避免悬空引发意外复位。 --- ### 5. 常见问题解决 - **无法烧录程序**: 检查GPIO0是否在复位时被拉低,确认USB转串芯片是否支持自动下载控制。 - **误触发下载模式**: 检查GPIO0外围电路是否有意外接地(如传感器短路)。 - **ADC读数跳变**: 添加0.1μF滤波电容并联到GND,或软件端进行滑动平均滤波。 --- ### 总结 | 应用场景 | 推荐配置 | |----------------|-----------------------------------| | 常规数字IO | 启用内部上拉,避免电平悬空 | | 固件烧录 | 手动/自动控制GPIO0低电平 | | 模拟信号采集 | 配合滤波电路,软件校准 | | 低功耗设计 | 禁用未使用功能,设置为输入模式 | 合理利用GPIO0的多功能性,可显著提升ESP32项目的灵活性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naiva

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值