Распиновка ESP32-C3: пины Super Mini, strapping и отличия от ESP32
ESP32-C3 Super Mini размером с ноготь приехал из посылки за двести рублей, и я по привычке повесил кнопку на «первый свободный пин» GPIO2. Плата перестала стартовать: GPIO2 оказался strapping-пином, который чип опрашивает при каждом включении. На квадрате в два сантиметра здесь уместились WiFi, BLE и USB, но почти у каждого вывода есть вторая работа, о которой молчат карточки товара.
Ниже — таблица всех 16 выводов колодки с расшифровкой, разбор strapping-тройки GPIO2, GPIO8, GPIO9, честный разговор про АЦП (ADC1 работает при WiFi, ADC2 замирает), мигалка на бортовом светодиоде и сравнение с классическим ESP32 и Nano Every.
Классическую старшую модель я уже разбирал в распиновке ESP32 — от неё постоянно отталкиваюсь, чтобы было видно, что у младшей отняли. Базовые приёмы общие для всех плат: скетчи можно прогнать в симуляторе, а как поставить ядро ESP32 в IDE — в уроке про первый запуск.
Что за чип: одно ядро RISC-V и 22 GPIO
ESP32-C3 — одиночное 32-битное ядро RISC-V до 160 МГц с 400 КБ SRAM, радиомодулем WiFi 2.4 ГГц (b/g/n) и BLE 5.0. Программируемых GPIO у чипа 22, но добраться можно не до всех: GPIO11–17 отданы внутренней флеш-памяти (на Super Mini её обычно 4 МБ), GPIO18 и GPIO19 заняты USB — это линии D- и D+ разъёма. На колодку Super Mini выведено 13 ножек: GPIO0–10 плюс GPIO20 (RX) и GPIO21 (TX), рядом питание 5V, 3V3 и GND — всего 16 выводов с шагом 2.54 мм.
На DevKitM-1 тот же чип упакован в металлический модуль ESP32-C3-WROOM-02 с антенной внутри, у Super Mini кристалл распаян прямо на плате — распиновка от упаковки не меняется. Второй сюрприз — USB: COM-порт поднимает сам чип через встроенную периферию USB Serial/JTAG, поэтому конвертер CH340 или CP2102 на плате не нужен. В Arduino IDE за это отвечает опция USB CDC On Boot: включена — Serial пишет в USB, выключена — молчит.
Таблица пинов Super Mini: все 16 выводов
| Выводы | GPIO | Что умеют | Оговорки |
|---|---|---|---|
| 5V, 3V3, GND | — | Питание: 5 В на вход стабилизатора, 3.3 В с его выхода | Логика 3.3 В: 5-вольтовые сигналы на пины подавать нельзя |
| GPIO0–GPIO4 | 0–4 | Цифровой вход/выход плюс вход ADC1 (5 каналов) | Единственная группа АЦП, работающая при включённом WiFi |
| GPIO5, GPIO6 | 5–6 | Цифровой вход/выход плюс вход ADC2 (2 канала) | ADC2 замирает при активном WiFi |
| GPIO2, GPIO8, GPIO9 | 2, 8, 9 | Обычные пины после загрузки | Strapping: их уровень при сбросе выбирает режим загрузки |
| GPIO8 | 8 | Бортовой синий светодиод (инверсный), SDA по умолчанию | Делить с шиной I2C или переносить шину на другие пины |
| GPIO9 | 9 | Кнопка BOOT, SCL по умолчанию | Прижатый к земле при сбросе GPIO9 отправляет плату в прошивку |
| GPIO10 | 10 | Просто цифровой вход/выход | Вход умеют читать только GPIO0–10 |
| GPIO20, GPIO21 | 20–21 | UART0: RX и TX | При USB CDC On Boot свободны для внешних модулей |
Strapping-пины GPIO2, GPIO8 и GPIO9: что нельзя грузить на старте
При подаче питания и каждом сбросе чип сначала опрашивает GPIO2, GPIO8 и GPIO9 — по их уровню решает, откуда загружаться. GPIO9 обязан стоять в единице (у него внутренняя подтяжка): на Super Mini к нему приделана кнопка BOOT, и её нажатие при сбросе прижимает пин к земле — плата уходит в режим прошивки вместо запуска скетча. GPIO8 тоже должен быть в единице (подтяжка там есть), а GPIO2 не должен лежать в нуле в момент старта. После загрузки все три становятся обычными пинами.
Грабля в том, что периферия на этих пинах в момент подачи питания выбирает режим загрузки за вас. Кнопка на GPIO2 в отжатом состоянии безобидна, а вот датчик, чей выход при включении держит ноль, уводит плату не туда — со стороны это выглядит как брак. Правило простое: всё, что тянет GPIO2, GPIO8 или GPIO9, подключайте так, чтобы при сбросе на пине стояла единица, и проверяйте плату с полной обвязкой, а не с голым чипом.
АЦП: пять каналов ADC1 и ADC2, который замирает при WiFi
Аналоговых входов по документации шесть: ADC1 занимает GPIO0–GPIO4 — это пять каналов, ADC2 — GPIO5 и GPIO6, ещё два. Оба АЦП 12-битные, шкала 0–4095. У ADC2 жёсткое условие: при работающем WiFi он недоступен, чтение возвращает мусор. Отсюда раскладка: датчики с аналоговым выходом — на GPIO0–4, если в скетче есть WiFi. И помните про диапазон: логика 3.3 В, выше питания на вход лезть нельзя, а при аттенюации по умолчанию линейный участок шкалы заканчивается около 2.5–2.8 В — крайние единицы приглушены.
Мигалка на GPIO8 и кнопка BOOT
// ESP32-C3 Super Mini: бортовой LED на GPIO8 (инверсный),// кнопка BOOT на GPIO9 с подтяжкой к единице const int LED = 8;const int BOOT_BTN = 9; void setup() { pinMode(LED, OUTPUT); pinMode(BOOT_BTN, INPUT_PULLUP); Serial.begin(115200);} void loop() { digitalWrite(LED, LOW); // зажгли: пин прижат к земле delay(100); digitalWrite(LED, HIGH); // погасили delay(400); if (digitalRead(BOOT_BTN) == LOW) { // BOOT прижата — пин в нуле Serial.println("boot=1"); digitalWrite(LED, LOW); // короткая вспышка-квитанция delay(50); digitalWrite(LED, HIGH); }}- Аналоговые датчики — GPIO0–4: единственная пятёрка ADC1, которая работает при включённом WiFi
- I2C — SDA на GPIO8, SCL на GPIO9 по умолчанию; Wire.begin(sda, scl) переносит шину, например на GPIO4 и GPIO5
- UART — GPIO20 (RX) и GPIO21 (TX): GPS, другие платы и serial-модули; при USB CDC On Boot они свободны
- Кнопки и цифровые входы — любой из GPIO0–10: только эта группа умеет читать после загрузки
- Strapping-тройка GPIO2, GPIO8, GPIO9 — в последнюю очередь: сначала убедитесь, что их уровень при сбросе не мешает загрузке
ESP32-C3 против классического ESP32 и Nano Every
| Параметр | ESP32-C3 | Классический ESP32 | Nano Every |
|---|---|---|---|
| Ядро | 1× RISC-V, до 160 МГц | 2× Xtensa LX6, до 240 МГц | 1× AVR ATmega4809, 20 МГц |
| SRAM | 400 КБ | 520 КБ | 6 КБ |
| GPIO | 22, на Super Mini выведено 13 | 34, на DevKit V1 выведено 25 | 22 на колодке: D0–D13 и A0–A7 |
| АЦП | 12 бит; ADC1 на GPIO0–4, ADC2 на GPIO5–6 | 12 бит; 18 каналов, ADC2 тоже замирает при WiFi | 10 бит; A0–A7 |
| ЦАП и touch | Нет ни того, ни другого | ЦАП 2×8 бит (GPIO25/26), 10 touch-сенсоров | Нет |
| Радио | WiFi 2.4 ГГц b/g/n + BLE 5 | WiFi 2.4 ГГц + BT классический и BLE | Нет, нужен внешний модуль |
| Логика | 3.3 В | 3.3 В | 5 В |
Мой расклад: C3 — для дешёвых WiFi-узлов, где пару датчиков надо выкинуть в сеть и уснуть; классический ESP32 — когда нужны ЦАП на GPIO25/26, десяток touch-кнопок или второе ядро под тяжёлый скетч; Nano Every — когда 5-вольтовая логика и шилды от Uno важнее беспроводности, а памяти 328P уже мало. Про питание обеих 3.3-вольтовых плат — гайд по питанию, сосед по колодке разобран в распиновке Arduino Nano, а прямой родственник по чипу 4809 — в распиновке Nano Every.