(包括:ESP32- d0wd、ESP32- d0wdq6、ESP32- d2wd、ESP32- s0wd)集成了Wi-Fi和双模式蓝牙。根据型号差异,ESP32包含一个或两个低功耗Xtensa®32位LX6微处理器(s),最大时钟速度240 MHz(通常是160 MHz)和Xtensa RAM / ROM,本地内存和JTAG接口。
ESP32芯片有48个引脚,具有多种功能。并不是所有的ESP32开发板的引脚都是外露的,有些引脚无法使用。
关于如何使用ESP32 gpio有很多问题。你应该用什么甄别?在你的项目中应该避免使用哪些引脚?本文旨在为ESP32 gpio提供一个简单易用的参考指南。
注意:不是所有的GPIO都可以在所有的开发板中访问,但是每个特定的GPIO都以相同的方式工作,不管你使用的是哪个开发板。如果你刚刚开始使用ESP32.其他开发板型号:
ADC(模拟到数字转换器)和DAC(数字到模拟转换器)特征被分配到特定的静态引脚。然而,您可以决定哪些引脚是UART, I2C, SPI, PWM等-您只需要在代码中分配它们。这是由于ESP32芯片的多路复用特性。
ESP32 DEVKIT V1 DOIT
板36引脚为例-引脚位置可以根据制造商而改变)。• 448 KB 的 ROM,用于程序启动和内核功能调用.
• 用于数据和指令存储的 520 KB 片上 SRAM.
• RTC 快速存储器,为 8 KB 的 SRAM,可以在 Deep-sleep 模式下 RTC 启动时用于数据存储以及被主CPU 访问.
• RTC 慢速存储器,为 8 KB 的 SRAM,可以在 Deep-sleep 模式下被协处理器访问.
• 1 Kbit 的 eFuse,其中 256 bit 为系统专用(MAC 地址和芯片设置); 其余 768 bit 保留给用户程序, 这些程序包括 flash 加密和芯片 ID.
参考文档:https://www.espressif.com.cn/sites/default/files/documentation/esp32_datasheet_cn.pdf
QSPI flash
和静态随机存储器 (SRAM
)。ESP32 可通过高速缓存访问外部 QSPI flash 和 SRAM:
• 外部 flash 可以同时映射到 CPU 指令和只读数据空间。外部 flash 最大可支持 16 MB。
当映射到 CPU 指令空间时,一次最多可映射 11 MB + 248 KB。如果一次映射超过 3 MB + 248 KB,则 cache 性能可能由于 CPU 的推测性读取而降低。
• 外部 SRAM 可映射到 CPU 数据空间。外部 SRAM 最大可支持 8 MB。一次最多可映射 4 MB。支持 8-bit、16-bit 和 32-bit 访问。
芯片内置 4 个 64-bit 通用定时器,具有 16-bit 分频器和 64-bit 可自动重载的向上/向下计时器。
定时器特性:
• 16-bit 时钟分频器,分频系数为 2 至 65536
• 64-bit 计时器
• 计时器方向可配置:递增或递减
• 软件控制计数暂停和继续
• 定时器超时自动重载
• 软件控制的即时重载
• 电平触发中断和边沿触发中断
芯片中有 3 个看门狗定时器:2 个定时器模块中各有 1 个(称作主看门狗定时器,即 MWDT),RTC 模块中也有 1 个(称作 RTC 看门狗定时器,即 RWDT)。意外的软件或硬件问题会导致应用程序工作失常,而看门狗定时器可以帮助系统从中恢复。看门狗定时器有 4 个阶段。如果当前阶段超过预定时间,但没有喂狗或关闭看门狗定时器,可能引发以下 3 到 4 种动作中的 1 种。这些动作是:中断、CPU 复位、内核复位和系统复位。其中,只有 RWDT 能够触发系统复位,将复位包括 RTC 在内的整个芯片。每个阶段的超时时间长度均可单独设置。
在 flash 启动期间,RWDT 和第一个 MWDT 会自动开启,以便检测和修复启动问题。
看门狗具有以下特性:
• 4 个阶段,每一阶段都可被单独配置或关闭.
• 各阶段时间段可被编程
如阶段超时,会采取 3 到 4 种可能动作中的 1 种(中断、CPU 复位、内核复位和系统复位)
• 32-bit 超时计数器.
• 写保护,防止 RWDT 和 MWDT 配置被误写.
• SPI flash 启动保护;如果在预定时间内,来自 SPI flash 的启动过程没有完成,看门狗会重启整个系统。
ESP32 共有 34 个 GPIO 管脚,通过配置对应的寄存器,可以为这些管脚分配不同的功能,包括如下几类 GPIO:
– 只有数字功能的 GPIO、带模拟功能的 GPIO、带电容触摸功能的 GPIO 等。带模拟功能的 GPIO 和带电容触摸功能的 GPIO 可以被配置为数字 GPIO。
大部分带数字功能的 GPIO 都可以被配置为内部上拉/下拉,或者被设置为高阻。当被配置为输入时,可通过读
– 取寄存器获取输入值。输入管脚也可以被设置为通过边缘触发或电平触发来产生 CPU 中断。大部分数字 IO 管脚都是双向、非反相和三态的,包括带有三态控制的输入和输出缓冲器。这些管脚可以复用作其他功能,例如SDIO、UART、SPI 等(更多信息请参考附录 IO_MUX)。当芯片低功耗运行时,GPIO 可被设定为保持状态。
绿色突出显示的引脚是可以使用的。用黄色突出显示的是可以使用的,但您需要注意,因为它们可能主要在引导时出现意外行为。红色突出显示的引脚不建议用作输入或输出。
GPIO 34到39是gpio -引脚。这些引脚没有内部上拉或下拉电阻。它们不能用作输出,
GPIO 34
GPIO 35
GPIO 36
GPIO 39
ESP-WROOM-32
集成SPI flash
部分ESP32开发板GPIO 6 ~ GPIO 11。但是,这些引脚连接到ESP-WROOM-32芯片上集成的SPI flash上,不建议用于其他用途。所以,不要在你的项目中使用这些引脚。
GPIO 6 (SCK/CLK)
GPIO 7 (SDO/SD0)
GPIO 8 (SDI/SD1)
GPIO 9 (SHD/SD2)
GPIO 10 (SWP/SD3)
GPIO 11 (CSC/CMD)
ESP32 提供了多达 10 个电容式传感 GPIO,能够探测由手指或其他物品直接接触或接近而产生的电容差异。这种设计的低噪声特性和电路的高灵敏度支持使用相对较小的触摸板。也可以使用触摸板阵列以探测更大区域或更多点,也可以检测到当用手指触摸gpio时产生的变化。这些引脚可以很容易地集成到电容垫和取代机械按钮。电容触针也可以用来唤醒沉睡的ESP32。表 11 列出了 10 个电容式传感 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)
ESP32 集成了 12-bit SAR ADC,共支持 18 个模拟通道输入。为了实现更低功耗,ESP32 的 ULP 协处理器也
可以在睡眠方式下测量电压,此时,可通过设置阈值或其他触发方式唤醒 CPU。
通过适当的设置,最多可配置 18 个管脚的 ADC,用于电压模数转换。ADC 特性:
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引脚没有线性行为。你可能无法区分0和0.1V,或者3.2和3.3V。在使用ADC引脚时,您需要记住这一点。您将得到一个类似于下图所示的行为。
ESP32 有 2 个 8-bit DAC 通道,将 2 路数字信号分别转化为 2 个模拟电压信号输出,两个通道可以独立地工作。DAC 电路由内置电阻串和 1 个缓冲器组成。这 2 个 DAC 可以作为参考电压使用。
DAC1 (GPIO25)
DAC2 (GPIO26)
ESP32支持RTC GPIO。当ESP32处于深度睡眠状态时,可以使用RTC低功耗模式下的gpio触发。当Ultra Low Power (ULP)协处理器运行时,这些RTC gpio可用于将ESP32从深度睡眠中唤醒。以下gpio可以作为外部唤醒源。(PS:测试发现,ESP32在低功耗上面表现并不是很优异)
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)
LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。 该控制器有 16 路通道,可以产生独立的波形来驱动 RGB LED 等设备。
LEDC 通道共有两组,分别为 8 路高速通道和 8 路低速通道。高速通道模式在硬件中实现,可以自动且无干扰地改变 PWM 占空比。低速通道模式下,PWM 占空比需要由软件中的驱动器改变。每组通道都可以使用不同的时钟源。
LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实现亮度和颜色渐变。
ESP32 LED PWM控制器有16个独立的通道,可通过配置产生不同属性的PWM信号。占空比的精度可以配置到16位分辨率,所有可以作为输出的引脚都可以用作PWM引脚(GPIOs 34到39不能产生PWM)。
int freq = 5000;//频率
int ledChannel = 0;//通道0
int resolution = 8;//分辨率,1到16位之间的分辨率
ledcSetup(ledChannel, freq, resolution);.
注意区分上面的LED PWM
PWM 控制器可以用于驱动数字马达和智能灯。该控制器包含 PWM 定时器、PWM 执行器和 1 个专用的捕捉子模组。定时器可以同步定时,也可以独立运行。每个 PWM 执行器为 1 个 PWM 通道生成波形。专用的捕捉子模组可以精确捕捉外部定时事件。
ESP32有两个I2C通道,任何引脚都可以设置为SDA或SCL。在Arduino IDE下使用ESP32时,默认I2C引脚为:
GPIO 21 (SDA)
GPIO 22 (SCL)
Wire.begin(SDA, SCL);
ESP32 共有 3 组 SPI(SPI、HSPI 和 VSPI)接口,可以在主机或从机模式,在 1-line 全双工或 1/2/4-line 半双工通信模式下工作,作为通用 SPI 支持以下特性:
4 种模式的 SPI 传输格式,模式取决于 SPI 时钟的极性 (CPOL) 和相位 (CPHA)
• 最高支持到 80 MHz(实际可支持频率还受限于所用 pad、PCB 走线、外接器件规格等)
• 最高支持 64 byte 的 FIFO
所有 SPI 接口都可以连接外部 flash/SRAM 和 LCD。每一个 SPI 控制器都可连接到 DMA 通道。
需要注意的是,HSPI和VSPI并不是认为的high-speed SPI 和Very High-speed SPI,这是SPI和HSPI、VSPI是一样的,只不过是换个名字用于区分,SPI相当于SPI0或SPI1,HSPI相当于SPI2,VSPI相当于SPI3。
默认情况下,SPI的引脚映射为:
SPI | MOSI | MISO | CLK | CS |
---|---|---|---|---|
VSPI | GPIO 23 | GPIO 19 | GPIO18 | GPIO 5 |
HSPI | GPIO 13 | GPIO 12 | GPIO 14 | GPIO 15 |
所有的引脚都可以作为中断引脚使用。
LOW 低电平触发
CHANGE 电平变化
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发
在定义中断函数后,需要在 setup 函数配置中断函数.
// interrupt=中断通道编号,function=中断函数,mode=中断触发模式
attachInterrupt(interrupt, function, mode);
// pin=中断引脚,function=中断函数,mode=中断触发模式
attachInterrupt(pin, function, mode);
如果在程序运行过程不需要使用外部中断了,可以用中断分离函数来取消这一中断设置:
detachInterrupt(interrupt);
detachInterrupt(Pin);。
GPIO 0
GPIO 2
GPIO 4
GPIO 5 (must be HIGH during boot)
GPIO 12 (must be LOW during boot)
GPIO 15 (must be HIGH during boot)
这些是用来使ESP32进入引导加载程序或闪烁模式。在大多数内置USB/Serial的开发板上,你不需要担心这些引脚的状态。单板将引脚置于正确的闪光或启动模式状态。更多关于ESP32启动模式选择的信息可以在这里找到。
然而,如果你有外设连接到这些引脚,你可能在尝试上传新代码、用新固件刷新ESP32或重置单板时遇到麻烦。如果有外设连接在捆绑引脚上,导致上传代码或ESP32闪烁出现问题,可能是这些外设导致ESP32无法进入正确模式。请阅读引导模式选择文档,以指导您找到正确的方向。在复位、闪烁或启动后,这些引脚按预期工作。
一些gpio在启动或复位时改变其状态为HIGH或输出PWM信号。这意味着如果你有输出连接到这些gpio,你可能会在ESP32重置或启动时得到意想不到的结果。
GPIO 1
GPIO 3
GPIO 5
GPIO 6 to GPIO 11 (connected to the ESP32 integrated SPI flash memory – not recommended to use).
GPIO 14
GPIO 15
EN
)引脚是3.3V稳压器的使能引脚。它是被拉上来的,所以连接到地面,使3.3V稳压器失效。例如,您可以使用连接到按钮的引脚来重启ESP32。ESP32 集成的霍尔传感器是基于空穴 (N-carrier) 电阻设计的。当芯片置于电磁场中时,霍尔传感器会在电阻上横向产生一个小电压,这个小电压可由 ADC 直接测量。
ESP32 采用了先进的电源管理技术,可以在不同的功耗模式之间切换。
• 功耗模式
– Active 模式:芯片射频处于工作状态。芯片可以接收、发射和侦听信号。
– Modemsleep 模式:CPU 可运行,时钟可被配置。Wi-Fi/蓝牙基带和射频关闭。
– Lightsleep 模式:CPU 暂停运行。RTC 存储器和外设以及 ULP 协处理器运行。任何唤醒事件
(MAC、主机、RTC 定时器或外部中断)都会唤醒芯片。
– Deepsleep 模式:CPU 和大部分外设都会掉电,只有 RTC 存储器和 RTC 外设处于工作状态。
Wi-Fi 和蓝牙连接数据存储在 RTC 中。ULP 协处理器可以工作。
– Hibernation 模式:内置的 8 MHz 振荡器和 ULP 协处理器均被禁用。RTC 内存恢复电源被切断。只
有 1 个位于低速时钟上的 RTC 时钟定时器和某些 RTC GPIO 在工作。RTC 时钟定时器或 RTC GPIO可以将芯片从 Hibernation 模式中唤醒。
设备在不同的功耗模式下有不同的电流消耗,详情请见下表。