图示:ESP32 芯片、模组、开发板对比
我们在进行项目开发的时候,通常我们会习惯说使用的是 ESP32 开发。上图展示了 ESP32 从芯片到开发板的不同外观。通常情况下,我们开发项目或者是学习时,使用的更多的是开发板或模组,很少会使用到芯片。因为从 ESP32 芯片到要能运行我们的程序,还需要很多外围电路的支持,为了开发的方便,官方也才设计制作了模组。ESP32/8266 芯片由“乐鑫科技”设计,最开始模组由“安信可科技”代为设计,后面“乐鑫”自己也开始设计制作模组,所以会在市面上看到不同的模组,其核心的芯片都是“乐鑫”的 ESP32/8266 芯片。模组的不同厂家主要看模组屏蔽罩上面的激光钢印,通常情况下都会喷上厂商的 logo。
图示:乐鑫和安信可 logo 对比
ESP32 DevKit 开发板是常见的 ESP32 开发板,这里我们给出两个常见开发板型号:ESP32-DevKitC-1 和 ESP32-DevKit V1。因为是开源项目,所以市面上会出现多个版本的开发板,主要区别是 USB 接口不同、USB 转串口芯片厂商不同以及电子元件的布局不同,在使用上没有太大差异。
图示:乐鑫官方发布的 ESP32 DevKitC-1 开发板引脚分布
上图由乐鑫官方发布,作者做了简单的中文标记。ESP32-DevKitC-1 开发板引出引脚为 38 个,其中有 3 个 GND 引脚,1 个 5V 供电引脚,1 个 3.3V 电压输出引脚,1 个 EN 使能引脚以及其他 32 个 GPIO 口。
图示:38pin 的 ESP32 DevKitC-1 实物图
以上两块开发板是比较常见的两个版本的 ESP32 开发板。因为两个版本的开发板采用的 ESP32 模组为同一个型号,所以开发板资源、引脚以及功能都大致相同。仔细的你会发现,DevKit V1 开发板只有 30 个引脚,而 DevKitC-1 开发板有 38 个引脚引出。仔细核对,DevKitC-1 开发板多出和模组内部 Flash 芯片连接的 6 个 GPIO 引脚,多出 1 个 GND 引脚和 1 个 BOOT(GPIO0)引脚。
需要注意的是,多出的 6 个 GPIO 引脚,已经和模组内部的 FLASH 芯片链接,这些引脚不能再作为通用的 GPIO 口使用的。所以在实际开发中,两个开发板没有任何区别,在 Arduino 编程时,选择开发板都可以选择 ESP32 Dev Module 开发板。
开发板如上图所示,让 USB 接口向下,我们把开发板的所有引脚分为左侧和右侧两列。
| 编号 | 名称 | 引脚类型 | 功能 | 复位后状态 | 特殊功能 |
|---|---|---|---|---|---|
| 1 | 3V3 | P | 3.3 V 电源供给 | 3.3V | 输出 3.3V |
| 2 | EN | I | CHIP_PU, 芯片复位(低) | 高 | 外部上拉 |
| 3 | IO36 | I | GPIO36, ADC1_CH0, S_VP | 输入输出禁止 | 仅为输入引脚不能输出使用 |
| 4 | IO39 | I | GPIO39, ADC1_CH3, S_VN | 输入输出禁止 | |
| 5 | IO34 | I | GPIO34, ADC1_CH6, VDET_1 | 输入输出禁止 | |
| 6 | IO35 | I | GPIO35, ADC1_CH7, VDET_2 | 输入输出禁止 | |
| 7 | IO32 | I/O | GPIO32, ADC1_CH4, TOUCH_CH9, XTAL_32K_P | 输入输出禁止 | |
| 8 | IO33 | I/O | GPIO33, ADC1_CH5, TOUCH_CH8, XTAL_32K_N | 输入输出禁止 | |
| 9 | IO25 | I/O | GPIO25, ADC1_CH8, DAC_1 | 输入输出禁止 | DAC 输出 |
| 10 | IO26 | I/O | GPIO26, ADC2_CH9, DAC_2 | 输入输出禁止 | DAC 输出 |
| 11 | IO27 | I/O | GPIO27, ADC2_CH7, TOUCH_CH7 | 输入输出禁止 | |
| 12 | IO14 | I/O | GPIO14, ADC2_CH6, TOUCH_CH6, MTMS | 输入弱上拉 | |
| 13 | IO12 | I/O | GPIO12, ADC2_CH5, TOUCH_CH5, MTDI | 输入弱下拉 | |
| 14 | GND | G | Ground | 0V | |
| 15 | IO13 | I/O | GPIO13, ADC2_CH4, TOUCH_CH4, MTCK | 输入弱下拉 | |
| 16 | IO9 | I/O | GPIO9, D2 | 和 FLASF 连接,外部禁用 | |
| 17 | IO10 | I/O | GPIO10, D3 | ||
| 18 | IO11 | I/O | GPIO11, CMD | ||
| 19 | 5V0 | P | 5 V 电源输入 | 5V |
| 编号 | 名称 | 引脚类型 | 功能 | 复位后状态 | 特殊功能 |
|---|---|---|---|---|---|
| 1 | GND | G | Ground | 0V | |
| 2 | IO23 | I/O | GPIO23 | 输入 | |
| 3 | IO22 | I/O | GPIO22 | 输入 | |
| 4 | IO1 | I/O | GPIO1, U0TXD | 输入弱上拉 | 串口 |
| 5 | IO3 | I/O | GPIO3, U0RXD | 输入弱上拉 | 串口 |
| 6 | IO21 | I/O | GPIO21 | 输入 | |
| 7 | GND | G | Ground | 0V | |
| 8 | IO19 | I/O | GPIO19 | 输入 | |
| 9 | IO18 | I/O | GPIO18 | 输入 | |
| 10 | IO5 | I/O | GPIO5 | 输入弱上拉 | |
| 11 | IO17 | I/O | GPIO17 | 输入 | |
| 12 | IO16 | I/O | GPIO16 | 输入 | |
| 13 | IO4 | I/O | GPIO4, ADC2_CH0, TOUCH_CH0 | 输入弱下拉 | |
| 14 | IO0 | I/O | GPIO0, ADC2_CH1, TOUCH_CH1, Boot | 输入弱上拉 | BOOT |
| 15 | IO2 | I/O | GPIO2, ADC2_CH2, TOUCH_CH2 | 输入弱下拉 | |
| 16 | IO15 | I/O | GPIO15, ADC2_CH3, TOUCH_CH3, MTDO | 输入弱上拉 | |
| 17 | IO8 | I/O | GPIO8, D1 | 和 FLASF 连接,外部禁用 | |
| 18 | IO7 | I/O | GPIO7, D0 | ||
| 19 | IO6 | I/O | GPIO6, SCK |
注:GPIO:传统的输入输出接口,注意特殊情况;ADCx_CHx:引脚具有模数转换功能,ESP32 有 2 个 ADC、16 个通道可以选择;TOUCH_CHx:触摸功能引脚;RTC:低功耗唤醒引脚。
以上就是 ESP32 DevKitC-1 开发板的引脚功能详细表,需要注意的是,在以上表格中除了电源引脚以外,深色标识并且标记为删除符号的引脚为外部禁用引脚,日常使用是不可用;标记为浅橙色的引脚为仅有输入功能,使用时不可当作输出功能使用。由于是开源的原因,对于不同的开发板,引脚顺序有可能和以上表格不一致,具体使用请以实际使用的开发板上的丝印标识为准。
ESP32 在通电的瞬间,需要进行程序的选择,又叫引导程序。通过外部的一些 GPIO 口不同的状态,程序选择是进入上传用户程序,还是进入运行用户程序。此时这些 GPIO 口的状态决定了程序的选择,下面列出这些 GPIO 在程序引导时的状态。在需要使用到这些引脚的时候需要特别注意。
| GPIO | 默认 | 功能 | 拉起 | 下拉 |
|---|---|---|---|---|
| IO12 | 下拉 | 内部LDO的电压 (VDD_SDIO) | 1.8V | 3.3V |
| IO0 | 拉起 | 启动模式 | SPI 启动 | 下载引导 |
| IO2 | 下拉 | 启动模式 | 无所谓 | 下载引导 |
| IO15 | 拉起 | 在引导和SDIO从设备定时期间启用/禁用日志打印 | U0TXD 活动 | U0TXD 静音 |
| IO5 | 拉起 | SDIO从设备的定时 | 需要详细了解请查看 ESP32 芯片手册 |
ESP32 开发板有 32 个 GPIO 引脚,实际可用的有 26 个(部分开发板有 25 个)。可以通过编程相应的寄存器来分配不同的功能。GPIO 有多种类型:仅数字、模拟、电容触摸等。模拟 GPIO 和电容触摸 GPIO 可以配置为数字 GPIO。大多数数字 GPIO 都可以配置为内部上拉或下拉,或设置为高阻抗。
ESP32 通过功能复用的形式,在 20 多个引脚上实现了众多的功能,每个 GPIO 上有多个功能,但是其中一些引脚可能会不适合在任何情况下使用。下表将列出首选安全可用的引脚,在引脚数量不紧张时优先考虑使用这些引脚。一些特殊功能引脚,特别是在启动期间或者是上传程序期间,使用到一些特殊引脚,可能会出现致命的错误,比如上传程序失败,所以在非必要情况下不要使用。
| 引脚编号 | 输入输出 | 安全否? | 原因 |
|---|---|---|---|
| GPIO0 | 弱上拉 | OK | 启动期间必须为高电平,上传程序时必须为低电平 |
| GPIO1 | TX 引脚 | OK | 串口 TX 引脚,用于上传程序和调试 |
| GPIO2 | OK | OK | 启动期间必须为低电平,连接到板载 LED(若有的话) |
| GPIO3 | RX 引脚 | OK | 串口 RX 引脚,用于上传程序和调试 |
| GPIO4 | OK | OK | |
| GPIO5 | OK | OK | 启动期间必须为高电平 |
| GPIO6 | x | x | 连接到模组的 FLASH |
| GPIO7 | x | x | 连接到模组的 FLASH |
| GPIO8 | x | x | 连接到模组的 FLASH |
| GPIO9 | x | x | 连接到模组的 FLASH |
| GPIO10 | x | x | 连接到模组的 FLASH |
| GPIO11 | x | x | 连接到模组的 FLASH |
| GPIO12 | OK | OK | 启动期间必须为低电平 |
| GPIO13 | OK | OK | |
| GPIO14 | OK | OK | |
| GPIO15 | OK | OK | |
| GPIO16 | OK | OK | |
| GPIO17 | OK | OK | |
| GPIO18 | OK | OK | |
| GPIO19 | OK | OK | |
| GPIO21 | OK | OK | |
| GPIO22 | OK | OK | |
| GPIO23 | OK | OK | |
| GPIO24 | OK | OK | |
| GPIO25 | OK | OK | |
| GPIO26 | OK | OK | |
| GPIO27 | OK | OK | |
| GPIO32 | OK | OK | |
| GPIO33 | OK | OK | |
| GPIO34 | OK | 进作为输入,不能作为输出使用 | |
| GPIO35 | OK | 进作为输入,不能作为输出使用 | |
| GPIO36 | OK | 进作为输入,不能作为输出使用 | |
| GPIO39 | OK | 进作为输入,不能作为输出使用 |
ESP32 集成有 2 个 12 位的 ADC,支持 16(15)个通道的测量。这些引脚可以将模拟电压值转换为数字值,换句话说,这些引脚可以将 0-3.3V 的电压转换为 0-4095 之间的数字,分辨率为 0.8mV。还可以通过代码对 ADC 的分辨率和范围进行设置。2 个 ADC 分为了 2 组,ADC1 和 ADC2,如果需要使用到 ESP32 的 WiFi 功能,则此时 ADC2 不可用,只用 ADC1,这个需要注意。
ESP32 设计有两个 8 位的 DAC 通道,分别在 GPIO25 和 GPIO26 引脚,用于将数字信号转换为模拟电压值。这两个 DAC 通道具有 8 位分辨率,意味着它可以将 0-255 范围内的值转换为 0-3.3V 范围的电压。
ESP32 设计有 9 个 TOUCH 触摸功能引脚,这些引脚分布在引脚功能图中标记有 TOUCH 的引脚。当电容性负载靠近具有 TOUCH 功能的引脚时,ESP32 会检测到电容的变化。可以将导电物品连接到触摸引脚,例如铝箔、铜箔、导电涂料等。由于电路的低噪声设计和高灵敏度,可以制作相对较小的焊盘。此外,这些 TOUCH 引脚还具有 RTC 低功耗唤醒功能。
ESP32 具有 21 路的 PWM 通道(26 个 GPIO 引脚除了只有输入功能的其他引脚都具有)。PWM 输出可以用于驱动电机和 LED 等外设。
ESP32 具有 16 个 RTC 功能引脚,这些引脚可以让程序系统从低功耗模式唤醒。
ESP32 具有一个 IIC 接口总线,该 IIC 总线最多允许连接 112 个该接口的传感器和外设。默认情况下 SDA 和 SCL 引脚分配在 GPIO22(SCL)和 GPIO21(SDA)两个引脚。在程序设计时,可以通过 Wire.begin(SDA, SCL) 函数来修改 IIC 引脚。
ESP32 具有三个 SPI(SPI、HSPI、VSPI),支持从机和主机模式。需要注意的是,VSPI 和 HSPI 是可以用的接口,第三条 SPI 总线已由集成闪存芯片使用。很多时候 HSPI 被误解为硬件 SPI,VSPI 被误解为虚拟或者软件 SPI,但是实际上他们是相同的。在程序设计时可以通过 bus.begin(CLK_PIN, MISO_PIN, MOSI_PIN, SS_PIN) 函数设置 SPI 的引脚接口。
ESP32 开发板具有三个 UART 接口:UART0、UART1 和 UART2,支持异步通信。UART0 已经连接至开发板上的 USB 转串口芯片,用于上传程序和调试使用,所以不再建议使用 UART0 引脚连接其他外设。UART1 引脚已为内部集成闪存芯片保留。UART2 可以连接外设使用,UART2 引脚分配在 UART2_TXD(GPIO17)和 UART2_RXD(GPIO16)引脚。此外,UART 还提供 CTS 和 RTS 信号的硬件管理。
ESP32 开发板的电源引脚有 1 个 5V 电源引脚,1 个 3.3V 电源引脚和 3 个 GND 引脚。5V 引脚是为主板供电的接口,供电电压值不能超过 5V。3.3V 引脚是主板往外输出 3.3V 电压的接口。供电从 5V 输入,开发板上集成 5V-3.3V 转换芯片,3.3V 供给 ESP32 模组工作,并从 3.3V 引脚输出给其他外设使用。
EN 引脚是 ESP32 的使能引脚,默认拉高,当 EN 被拉高后,芯片使能工作;但 EN 被拉低后,芯片被禁止。在 ESP32 开发板上 EN 引脚还连接到一个按键,该按键可以将 EN 拉低触发 ESP 芯片复位。