ESP32¶
ESP32 是乐鑫(Espressif)推出的高性能低成本 WiFi + 蓝牙 SoC,凭借==双核处理器、丰富的外设和无线连接能力==,已成为 IoT 和嵌入式开发的首选芯片之一。
一、ESP32 是什么?¶
ESP32 是一款集成 ==WiFi + 蓝牙==的微控制器 SoC(System on Chip),由国产半导体公司乐鑫信息科技开发。
graph TB
A[ESP32 SoC] --> B[处理器]
A --> C[无线通信]
A --> D[外设接口]
A --> E[安全特性]
B --> B1[双核 Xtensa LX6<br>最高 240MHz]
B --> B2[ULP 超低功耗协处理器]
C --> C1[WiFi 802.11 b/g/n<br>2.4GHz]
C --> C2[Bluetooth 4.2<br>经典 + BLE]
D --> D1[34 个 GPIO]
D --> D2[12 位 ADC / 8 位 DAC]
D --> D3[SPI / I2C / UART / I2S]
D --> D4[10 个触摸传感器]
D --> D5[LEDC PWM / MCPWM]
E --> E1[Flash 加密]
E --> E2[安全启动]
二、芯片型号对比¶
| 型号 | CPU | 主频 | WiFi | 蓝牙 | GPIO | Flash | SRAM | 特点 |
|---|---|---|---|---|---|---|---|---|
| ESP32 | 双核 Xtensa LX6 | 240MHz | ✅ | BT 4.2 + BLE | 34 | 外置 4~16MB | 520KB | 最经典,资料最多 |
| ESP32-S2 | 单核 Xtensa LX7 | 240MHz | ✅ | ❌ | 43 | 外置 | 320KB | USB OTG,去掉蓝牙 |
| ESP32-S3 | 双核 Xtensa LX7 | 240MHz | ✅ | BLE 5.0 | 45 | 外置 | 512KB | AI 加速(SIMD),USB OTG |
| ESP32-C3 | 单核 RISC-V | 160MHz | ✅ | BLE 5.0 | 22 | 外置 | 400KB | 低成本 RISC-V,替代 ESP8266 |
| ESP32-C6 | 单核 RISC-V | 160MHz | ✅ WiFi 6 | BLE 5.0 + 802.15.4 | 30 | 外置 | 512KB | WiFi 6 + Thread/Zigbee |
| ESP32-H2 | 单核 RISC-V | 96MHz | ❌ | BLE 5.0 + 802.15.4 | 22 | 外置 | 320KB | Thread/Zigbee/Matter |
选型建议
- 通用 IoT 项目(WiFi + BLE):ESP32 或 ESP32-S3
- AI / 边缘计算(TensorFlow Lite):ESP32-S3(有向量指令加速)
- 低成本替代 ESP8266:ESP32-C3
- Matter / Thread 智能家居:ESP32-C6 或 ESP32-H2
- USB 设备开发(HID、CDC):ESP32-S2 或 ESP32-S3
三、常见开发板¶
| 开发板 | 芯片 | Flash | 特点 | 参考价 |
|---|---|---|---|---|
| ESP32-DevKitC V4 | ESP32-WROOM-32E | 4MB | 官方开发板,30 引脚 | ~15 元 |
| ESP32-S3-DevKitC-1 | ESP32-S3-WROOM-1 | 8~16MB | 双 USB-C,AI 推理 | ~30 元 |
| NodeMCU-32S | ESP32-WROOM-32 | 4MB | 窄体设计,适合面包板 | ~12 元 |
| ESP32-C3-DevKitM-1 | ESP32-C3-MINI-1 | 4MB | 小巧,RISC-V | ~10 元 |
| ESP32-CAM | ESP32-S | 4MB + PSRAM | OV2640 摄像头 | ~20 元 |
四、核心架构(ESP32)¶
graph TB
subgraph "ESP32 内部架构"
CPU0[PRO_CPU<br>Xtensa LX6<br>240MHz]
CPU1[APP_CPU<br>Xtensa LX6<br>240MHz]
ULP[ULP 协处理器<br>超低功耗]
BUS[总线矩阵]
SRAM[SRAM 520KB]
ROM[ROM 448KB]
RTC_M[RTC 内存 16KB]
WIFI[WiFi MAC/BB<br>802.11 b/g/n]
BT[蓝牙 4.2<br>BR/EDR + BLE]
GPIO_M[GPIO 矩阵<br>34 个 GPIO]
ADC_M[ADC 18CH<br>12 位 SAR]
DAC_M[DAC 2CH<br>8 位]
TOUCH_M[触摸传感器<br>10 通道]
LEDC[LEDC PWM<br>16 通道]
SPI_M[SPI × 3]
I2C_M[I2C × 2]
UART_M[UART × 3]
end
CPU0 --> BUS
CPU1 --> BUS
ULP --> RTC_M
BUS --> SRAM
BUS --> ROM
BUS --> WIFI
BUS --> BT
BUS --> GPIO_M
BUS --> ADC_M
BUS --> DAC_M
BUS --> TOUCH_M
双核说明
- PRO_CPU(CPU 0):默认运行 WiFi/BLE 协议栈
- APP_CPU(CPU 1):默认运行用户的
setup()和loop() - 使用 FreeRTOS 可以在两个核上自由分配任务
- Arduino 框架下,用户代码默认运行在 CPU 1
五、开发框架对比¶
使用熟悉的 Arduino API,上手最快:
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.begin("SSID", "password");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 连接成功!");
Serial.println(WiFi.localIP());
}
void loop() {
// ...
}
优点:
- 与 Arduino UNO 代码高度兼容
- 大量 Arduino 库可直接使用
- 社区资源丰富
缺点:
- 无法完全发挥 ESP32 所有特性
- 部分底层功能需要直接调用 ESP-IDF API
乐鑫官方的 C 语言开发框架,功能最完整:
#include <stdio.h>
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
void app_main(void) {
// NVS 初始化
esp_err_t ret = nvs_flash_init();
// WiFi 初始化
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
// ...
}
优点:
- 完整访问所有硬件特性
- 更精细的内存和性能控制
- 官方长期支持,文档完善
缺点:
- 学习曲线陡峭
- 代码量大,API 较复杂
六、开发环境搭建¶
- 打开 Arduino IDE → File → Preferences
- 在 Additional Boards Manager URLs 中添加:
- Tools → Board → Boards Manager → 搜索 "esp32" → 安装
- 选择板型:Tools → Board → ESP32 Arduino → ESP32 Dev Module
- 选择端口 → Upload
七、ESP32 与 Arduino 的关键差异¶
| 特性 | Arduino UNO | ESP32 |
|---|---|---|
| 工作电压 | 5V | 3.3V |
| GPIO 电压 | 5V 容忍 | 3.3V(不能接 5V!) |
| ADC | 10 位,6 通道 | 12 位,18 通道(非线性) |
| PWM | 硬件 Timer,6 引脚 | LEDC 16 通道,任意 GPIO |
| 中断 | 2 个外部中断 | 所有 GPIO 支持中断 |
| 串口 | 1 个 | 3 个硬件 UART |
| WiFi | ❌ | ✅ 802.11 b/g/n |
| 蓝牙 | ❌ | ✅ Classic + BLE |
| 多核 | 单核 8 位 | 双核 32 位 |
| FreeRTOS | 需要额外库 | 内置 |
| Flash | 32KB | 4~16MB(外置) |
ESP32 GPIO 注意事项
- 不可用引脚:GPIO 6~11 连接内部 Flash,不能使用
- 仅输入引脚:GPIO 34、35、36、39 只能作为输入(无内部上拉)
- 启动时状态:GPIO 0、2、5、12、15 影响启动模式,使用时注意
- ADC2 限制:WiFi 开启时 ADC2 不可用(GPIO 0、2、4、1215、2527)
八、内容导航¶
| 章节 | 核心内容 | 学习要点 |
|---|---|---|
| GPIO 与模拟外设 | 数字 IO、LEDC PWM、ADC、DAC、触摸传感器 | 引脚约束、PWM 任意映射、ADC 校准、触摸唤醒 |
| WiFi 网络 | STA/AP 模式、HTTP 服务器/客户端、OTA 升级 | 连接管理、WebServer、远程更新 |
| 蓝牙通信 | 经典蓝牙 SPP、BLE GATT | 串口透传、BLE 服务与特征值、手机通信 |
| 通信协议 | UART、SPI、I2C 在 ESP32 上的使用 | 引脚映射、多 UART、硬件 SPI |
| 多核与任务管理 | FreeRTOS 任务、双核分配、同步机制 | 任务创建、核心绑定、队列、互斥量 |
| 低功耗模式 | Deep Sleep、Light Sleep、唤醒源 | 功耗优化、定时唤醒、触摸唤醒、GPIO 唤醒 |
ESP32 和 STM32 怎么选?
- 需要 WiFi / 蓝牙 → ESP32(内置无线,成本低)
- 工业级可靠性、丰富 ADC/DAC → STM32
- 实时性要求极高(电机控制、确定性响应) → STM32
- IoT / 智能家居 → ESP32
- 学习嵌入式底层原理 → STM32(资料更系统、更底层)
- 快速原型、Maker 项目 → ESP32 + Arduino 框架