Добрый день, уважаемый читатель!
В данной статье поговорим за выводы ESP32 классической серии – какие выводы (GPIO) можно использовать, какие нельзя, какие можно но осторожно и почему. Тот есть про все то, что в довольно узких кругах называется “распиновка esp32” или “карта выводов esp32” или “esp32 pinmap” или “esp32 pinout“.
В качестве основы для рассмотрения взята официальная и популярная плата ESP32 DevKitC V4 с установленным модулем ESP32-WROOM-32 или ESP32-WROVER-32. Но вы легко можете использовать эту статью и для других плат / модификаций, так как подход везде один и тот же, разве что некоторые GPIO могут быть уже использованы для каких-то встроенных целей. Для написания статьи использовалась информация из официальных источников.
А заодно хочу предложить вам удобный способ распределения выводов ESP32 при старте очередного проекта с помощью Excel. Скачать пример файла можно будет по ссылке в конце статьи.
Оглавление
- Таблица выводов ESP32 классической серии
- Выводы питания
- GPIO – контакты ввода/вывода общего назначения
- Шины для обмена данными
- EXCEL файл для подготовки проекта
Таблица выводов ESP32 классической серии
Стандартная версия карты выводов имеется на сайте Espressif. Обратите самое пристальное внимание на выводы, помеченные символом ❗️ или как STRAP – ниже в тексте будет рассказано почему.
Моя версия таблицы выводов для платы ESP32-DevKitC-V4 (а также ESP32-DevKit-V1, NODE32S и подобных им), где я попытался учесть все нюансы. Может быть она будет удобнее стандартной версии.
Примечания:
- Таблица составлена по тех.паспортам для новых модулей EcoV3 с индексами E, UE, IE
- В столбцах “Поведение при сбросе” указан режим работы “по умолчанию”: I – Input , O – Output, WU – Weak pull-Up, WD – Weak pull-Down, прочерк – вывод не настроен
- В столбцах “Поведение при сбросе” и “Спец.выводы” цветом указана подтяжка по умолчанию – красный к питанию; синий к земле; остальные цвета – просто обратите внимание
- GPIO 34-39 не имеют встроенной схемы “слабой” подтяжки, поэтому при необходимости используйте внешние подтягивающие резисторы
- по большому счету, для I2C можно использовать все I/O выводы; но некоторые их них нельзя подтягивать к питанию, что требуется для ее работы – поэтому считаем их недоступными для I2C
Скачать данную таблицу в формате Excel вы можете по кнопке ниже:
Если вы обнаружили в таблице какие-либо ошибки, пожалуйста сообщите мне по адресу kotyara12@yandex.ru или в чат телеграм.
Расположение выводов на “чистом” модуле ESP32-WROOM-32E
Более подробно обо всем этом читайте ниже.

Таблица выводов SoC, то есть чипа, а не модуля. В ней вы можете увидеть функции, маршрутизируемые через IO MUX.
Начнем с контактов питания.
Выводы питания
⚠️ Этот абзац имеет смысл только для плат ESP32-DevKitC-V4 (а также ESP32-DevKit-V1, NODE32S и т.д.) – на “чистом” модуле ESP32-WROOM-32 нет стабилизатора – на него нужно подавать питание только 3.3В!
VIN — контакт для подключения внешнего источника питания 5V.
На плате ESP32-DevKit или NODE32S установлен стандартный линейный стабилизатор AMS1117-3.3, который позволяет подавать на плату питание в достаточно широком диапазоне от 5 до 10 V. Он рассчитан на ток до 0,8А, из которых большую часть “отожрёт” сама ESP32. Поэтому при повышенном напряжении и дополниельной нагрузке возможен его значительный перегрев, так что не увлекайтесь
Этот же контакт соединен с выводом питания USB-порта через диод Шоттки (катодом к VIN), что позволяет получать питание платы от USB-порта в случае отсутствия напряжения на данном выводе.
3.3V – контакт, на который подается выходное напряжение описанного выше внутрисхемного стабилизатора. Его можно использовать для питания подключаемых к плате датчиков, но сильно мощную нагрузку лучше запитать от отдельного стабилизатора. На него же можно подать и 3.3 В от внешнего источника, при необходимости.
GPIO – контакты ввода/вывода общего назначения
GPIO (General Purpose Input & Output) — контакты ввода/вывода общего назначения. Могут быть сконфигурированы как входы или выходы и программно назначены на различные периферийные функции с помощью встроенных в чип подсистем IO MUX и GPIO Matrix. Здесь необходимо немного пояснить, что это такое.
Что такое IO MUX и матрица GPIO и чем они отличаются?
IO MUX (Input/Output Multiplexer) и матрица GPIO (GPIO Matrix) — это две ключевые аппаратные подсистемы в микроконтроллерах Espressif, которые обеспечивают гибкую маршрутизацию сигналов между внутренними периферийными устройствами и выводами чипа.
IO MUX или Мультиплексор предоставляет каждому выводу (GPIO) отдельный регистр конфигурации, с помощью которого можно выбрать, будет ли этот вывод работать как обычный GPIO или будет напрямую подключён к определённой периферии (JTAG, SDIO, UART, SPI, Ethernet). Для этих высокоскоростных цифровых сигналов (SPI, JTAG, UART) предусмотрена возможность обхода матрицы GPIO для улучшения характеристик на высоких частотах — в этом случае IO MUX соединяет вывод напрямую с периферией, минуя матрицу GPIO.
GPIO Matrix или Матрица GPIO — это аппаратная коммутационная матрица, которая позволяет маршрутизировать входные и выходные сигналы периферийных устройств на любые доступные GPIO. Например, любой из множества внутренних периферийных сигналов может быть направлен на любой вывод, и наоборот. Это обеспечивает большую гибкость при проектировании схем и программировании микроконтроллера.
Таким образом: IO MUX обеспечивает прямое высокоскоростное подключение некоторых периферийных функций к заранее определенным выводам, что важно для высокоскоростных интерфейсов. GPIO Matrix, наоборот, позволяет свободно маршрутизировать большинство периферийных сигналов на любые GPIO, но может не обеспечивать такую же производительность для высокочастотных сигналов, как прямое подключение через IO MUX.
Цифровые GPIO
Чисто теоретически, почти все выводы (кроме земли, питания и сброса, разумеется), могут быть сконфигурированы как GPIO через IO_MUX (например режим 2 в таблице ниже).
Большинство выводов GPIO имеют возможность работать как вход или выход, а также имеют коммутируемые встроенные резисторы слабой подтяжки около 50 кОм.
Все выводы GPIO могут быть настроены для генерации прерываний. Об этом я уже писал в другой статье [Обработка прерываний GPIO на ESP32].
Максимальный ток, который вы можете пропустить через GPIO, составляет 40 мА при высоком уровне и 28 мА при низком уровне, но при сбросе контроллера по умолчанию настроено ограничение на более низкий ток ~20 мА.
Ограничения для GPIO
Но не все йогурты выводы одинаково полезны: часть выводов модуля ESP32 имеют ограниченные возможности, либо уже занята под служебные надобности. Их нельзя использовать в проектах, или нужно это делать с особой осторожностью.
Выводы для работы только на вход
GPIO 34-39 являются GPI – “только вход”. Эти контакты не имеют внутренних подтягивающих резисторов, а также не могут быть использованы как выходы.
Выводы, которые нельзя использовать в проектах
GPIO 1иGPIO 3заняты основным ( programable ) портом UART0GPIO 6-11(D0, D1, D2, D3, SCK, CMD) заняты внешней FLASH-памятью, подключенной внутри модуля к чипу.GPIO 16иGPIO 17на модулях WROVER заняты под интерфейс внешней оперативной памяти PSRAM. Но на платах с WROOM вы можете использовать их совершенно свободно.
Использование UART0 возможно только в тех случаях, когда на плате нет встроенного преобразователя интерфейса TTL <-> USB. Выводы GPIO6-11 нельзя использовать вообще (кроме случаев самостоятельного подключения PSRAM, например).
Strapping pins или “выводы обвязки”, которые следует использовать с особой осторожностью
Некоторые выводы используются как так называемые “Пины обвязки” или Stapping pins. Что это означает. При сбросе микроконтроллера процессор считывает логические уровни на этих выводах и по ним определяет некоторые режимы работы.
Поэтому физическая подтяжка этих выводов к земле или питанию (в том числе и через переходы транзисторов, светодиодов и оптронов) настоятельно не рекомендуется. В частности поэтому иногда платы “не прошиваются” автоматически и требуется удерживать кнопку прошивки на плате. Только после выхода микроконтроллера “в режим” вы можете использовать их как вам заблагорассудится.
Давайте ещё раз перечислим эти выводы:
GPIO 0– при низком уровне на этом выводе при старте MCU процессор “понимает”, что нужно ждать на UART0 поток двоичных данных для записи прошивки на FLASH. То есть низкий уровень переводит плату в режим прошивки через UART0. При высоком уровне (по умолчанию) плата стартует как обычно. Поэтому отсюда вывод, как перевести любую плату в режим прошивки (даже без автоматической схемы с DTR) – зажимаете одновременно RESET (EN) и PROG, а затем отпускаете вначале RESET и только после этого PROG. Если вы подтяните этот вывод к “земле” резистором или оптроном, то ваш контроллер просто не сможет нормально запуститься, не делайте этого.GPIO 2– для входа в режим прошивки, кроме низкого уровня на GPIO0, необходимо обеспечить ещё и низкий уровень на GPIO2. По умолчанию на нем и так уже низкий уровень, так что просто не подтягивайте его к питанию.GPIO 5вместе сGPIO 15используется для управления таймингами SDIO slave режима “Timing of SDIO Slave” – режим эмуляции SD-карты. По умолчанию на них высокий уровень. Если вы не собираетесь использовать этот режим, то можно не обращать на них внимания.GPIO 12(MTDI) управляет напряжением питания внешней flash-памяти. Это очень важный Strapping pin. Если при сбросе MCU на нём установлен высокий уровень, напряжение флэш-памяти (VDD_SDIO) составляет 1,8 В вместо 3,3 В по умолчанию. Это может привести к физическому отключению флэш-памяти по питанию, так как большинство микросхем памяти, которые использует Espressif, имеют напряжение 3.3В. И наоборот, при использовании низковольтной памяти можно её сжечь установкой неправильного уровня при старте. На ESP32 DevKit v4 имеет внутреннюю слабую подтяжку к земле, то есть делаем вывод что используется память с напряжением питания 3.3В. Если вы используете “чистый” модуль (не плату) – подтяните этот вывод к земле.GPIO 15(MTDO) управляет отладочными сообщениями при запуске микроконтроллера. Если задано значение “0“, отключаются загрузочные сообщения, распечатываемые загрузчиком. Имеет внутреннюю слабую подтяжку к питанию, поэтому по умолчанию на данном выводе будет высокий уровень. Не сильно критично для запуска, так что этот вывод вполне можно использовать в своих целях, но нужно учитывать, что “по умолчанию” он подтянут к питанию с помощью внутренней слабой подтяжки (~50kOm).
В связи с этим может возникнуть вопрос: можно ли использовать перечисленные выше GPIO в своих проектах?
Ответ: можно, если осторожно.
Правило использования Strapping pins очень простое: необходимо подключать их в вашей схеме таким образом, чтобы она не нарушала подтяжку “по умолчанию”.
Например:
- вывод
GPIO0по умолчанию подтянут к питанию, поэтому его легко можно использовать как одну из линий I2C; но не желательно использовать в качестве выхода, управляющего внешним транзистором, так как он будет подтягивать вывод к земле. - вывод
GPIO12по умолчанию должен быть подтянут к земле, поэтому мы его не можем использовать в качестве линий I2C или OneWire (так как требуется подтяжка к питанию), но легко можно использовать как вход кнопки, или как выход для управления нагрузкой.
Пример разумного использования данных GPIO можно найти в этом проекте.
Выводы, которые могут изменять уровень при загрузке
Некоторые GPIO изменяют свое состояние или выводят различные импульсы при загрузке или сбросе:
GPIO 1,GPIO 3– на них выведен UART0, в который в момент запуска могут выводится диагностические сообщения. Отключается подтяжкой GPIO 15 к земле.GPIO 36,GPIO 39– эти входы подтягиваются к земле примерно на 80 нс в момент включения питания блока RTC (АЦП и усилителя). Но это “только входы”.GPIO 14– но только в случае использования интерфейса JTAG, в остальных случаях поведение этого вывода не документировано
Кроме того, все выше упомянутые Strapping pins имеют подтяжки по умолчанию:
GPIO 0,GPIO 5,GPIO 6–11,GPIO 15по умолчанию подтянуты к питанию.GPIO 2,GPIO 4,GPIO 12по умолчанию подтянуты к земле.
Это означает, что если у вас есть нагрузка, подключенная к этим GPIO, вы можете получить неожиданные включения / отключения нагрузки при перезагрузке или загрузке ESP32.
ADC / Аналого-цифровой преобразователь
ESP32 имеет на борту два независимых блока АЦП с разрядностью до 12 бит, связанных с заранее определенными GPIO через IO MUX.
Вроде бы входов ADC и много, но тут есть довольно большая засада: блок ADC2 нельзя использовать при работе Wi-Fi – ADC2 физически работает в паре с радиомодулем. А поскольку WiFi – это то, из-за чего этот чип, собственно, обычно и используется, то канала ADC2 мы лишены “по умолчанию”.
| Блок | GPIO имеющие функцию ADC | Доступно пользователю | Работает с Wi-Fi |
|---|---|---|---|
ADC1 |
32, 33, 34, 35, 36, 37, 38, 39 | 32, 33, 34, 35, 36, 39 | Да |
ADC2 |
0, 2, 4, 12, 13, 14, 15, 25, 26, 27 | Все | Нет |
Названия 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)
Входные каналы АЦП имеют разрешение 12 бит. Это означает, что вы можете преобразовать аналоговое напряжение в цифровое в диапазоне от 0 до 4095, в которых 0 соответствует 0 В, а 4095 – максимальному напряжению, определяемому аттенюатором, который имеет 4 значения:
ADC_ATTEN_DB_0– входное ослабление отсутствует, АЦП может измерять приблизительно до 800 мВADC_ATTEN_DB_2_5– входное напряжение АЦП будет ослаблено на 2,5 дБ, диапазон измерения примерно до 1,33 ВADC_ATTEN_DB_6– входное напряжение АЦП будет ослаблено на 6 дБ, диапазон измерения примерно до 2 ВADC_ATTEN_DB_11– входное напряжение АЦП будет ослаблено на 11 дБ, диапазон измерения примерно до 3,55 В
К сожалению АЦП ESP32 работают довольно не линейно, особенно на краях диапазона, и это следует учитывать. По сети “гуляет” примерный график получаемых значений в зависимости от напряжения:
Так что если вам требуется большая точность и линейность – используйте внешние I2C преобразователи.
DAC / Цифро-аналоговый преобразователь (ЦАП)
На классическом ESP32 имеются два 8-битных канала ЦАП для преобразования цифровых данных в аналоговые выходные сигналы напряжения. Это не ШИМ, а аналоговый сигнал с управлением напряжением на выходе.
DAC1(GPIO25)DAC2(GPIO26)
Как и в предыдущем случае, они маршрутизируются через IO MUX, поэтому переназначить их на другие GPIO вы не сможете.
RTC / Выводы ядра низкого энергопотребления
ESP32 имеет сопроцессор с ультранизким энергопотреблением (Ultra Low Power — ULP). Выводы RTC GPIO, перенаправленные с помощью IO MUX в подсистему с низким энергопотреблением, могут использоваться при работе сопроцессора ULP, когда обычная цифровая периферия отключена.
В качестве RTC могут быть использованы большинство GPIO общего назначения после соответствующей программной настройки. Для классического ESP32 функцией RTC GPIO (RTC IO) обладают:
GPIO0GPIO2GPIO4GPIO12–GPIO15GPIO25–GPIO27GPIO32–GPIO39
Основные возможности:
- использование в качестве входов или выходов RTC;
- пробуждение ESP32 из Deep-sleep по внешнему уровню через EXT0/EXT1;
- контроль GPIO со стороны ULP-сопроцессора во время сна;
- фиксация конфигурации и уровня функцией HOLD;
- внутренние подтяжки при сохранённом питании RTC-периферии.
TOUCH / Сенсорные контакты
Некоторые GPIO можно использовать как контакты ёмкостных сенсорных датчиков. Реагируют не изменение ёмкости в электрической цепи вывода, вызванное прикосновением пальца к соответствующему контакту. Эти контакты могут заменять механические кнопки. TOUCH-контакты также могут служить источником пробуждения ESP32 из энергосберегающих режимов.
TOUCH0– GPIO4TOUCH1– GPIO0TOUCH2– GPIO2TOUCH3– GPIO15TOUCH4– GPIO13TOUCH5– GPIO12TOUCH6– GPIO14TOUCH7– GPIO27TOUCH8– GPIO33TOUCH9– GPIO32
Учтите, что GPIO0, GPIO2, GPIO12 и GPIO15 также являются загрузочными strapping-выводами, поэтому подключённая вами сенсорная схема не должна нарушать требуемые уровни при сбросе CPU.
LED PWM / ШИМ модулятор
ESP32 имеет 16 независимых каналов LED PWM-контроллеров, которые можно настроить для генерации ШИМ-сигналов с различными свойствами. Эта функция маршрутизируется с помощью GPIO Matrix, поэтому все GPIO, которые могут выступать в качестве выходов, могут использоваться в качестве выходов PWM (то есть GPIO с 34 по 39 не могут генерировать ШИМ).
Например с помощью PWM можно легко заставить звучать обычный пассивный зуммер или динамик. Для генерации ШИМ-сигнала необходимо в программе задать частоту сигнала, скважность, выбрать ШИМ-канал, а также GPIO, на котором вы хотите вывести сигнал. Более подробно об этом вы можете прочитать в другой статье: [ESP32 LEDC PWM-контроллер].
Шины для обмена данными
ESP32 имеет несколько встроенных аппаратных контроллеров для обмена данными между различными периферийными цифровыми устройствами:
- UART / RS232 / RS485 – до трех экземпляров одновременно с маршрутизацией через GPIO Matrix
- I2C – до двух экземпляров одновременно с маршрутизацией через GPIO Matrix (на любых выводах GPIO)
- SPI – до четырех экземпляров одновременно с маршрутизацией через GPIO Matrix или IO Mux
UART
У ESP32 есть три аппаратных UART-контроллера:
UART0– системный контроллер, который по умолчанию используется для прошивки и отладки, обычно связан с UART-USB мостом. Теоретически его можно использовать для собственного протокола, но тогда загрузочные сообщения могут попасть в подключённое устройство, а логи приложения смешаются с пользовательскими данными.UART1иUART2– пользовательские контроллеры, их вы можете использовать по своему усмотрению:- GPS/GNSS;
- GSM/LTE-модема;
- другого микроконтроллера;
- дисплея с последовательным интерфейсом;
- RS485-трансивера;
- другого UART-устройства.
Это именно аппаратная периферия, а не программная эмуляция. Передачей и приёмом управляет аппаратный контроллер; драйвер работает с аппаратными FIFO, прерываниями и программными кольцевыми буферами. Для больших объёмов данных также предусмотрена работа UART с DMA через UHCI.
При этом конкретные GPIO можно выбрать через GPIO Matrix. В официальных ESP-AT-конфигурациях и Arduino core встречаются такие назначения:
UART0– GPIO1, GPIO3UART1– GPIO17, GPIO16, GPIO14, GPIO15, иногда GPIO22, GPIO19
Однако это не означает, что UART1 обязан работать именно на этих GPIO: это назначения конкретных прошивок и модулей, а GPIO Matrix позволяет их изменить.
I2C
I²C — синхронная последовательная полудуплексная шина. Она использует две двунаправленные линии: SDA — данные; SCL — тактовый сигнал. На одной паре проводов могут находиться несколько устройств. Обычно каждое ведомое имеет уникальный 7-битный или 10-битный адрес. Инициатор обмена — ведущий: он формирует SCL, посылает адрес и выполняет чтение либо запись.
В классическом ESP32 есть два аппаратных I²C-контроллера: I2C_NUM_0 и I2C_NUM_1. Это аппаратная периферия, а не программная эмуляция. Выводы I2C маршрутизируются через GPIO Matrix, поэтому вы можете выбрать любые свободные GPIO.
Для Generic ESP32 в Arduino приняты стандартные выводы:
SDA– GPIO21SCL– GPIO22
Это удобный и распространённый выбор, но не жёстко закреплённый – можно выбрать другую свободную подходящую пару GPIO. Arduino core также позволяет назначить их через setPins(sda, scl) перед begin() ESP-Arduino.
При выборе других GPIO учитывайте:
- SDA и SCL — двунаправленные линии, поэтому выводы должны поддерживать и вход, и выход;
- GPIO34–GPIO39 не подходят: это только входы;
- нельзя использовать контакты Flash;
- нужно проверить, не заняты ли выводы PSRAM или периферией конкретного модуля/платы;
- лучше исключить загрузочные strapping-выводы;
- выбранные контакты не должны одновременно использоваться другой периферией.
Подробнее обо всем этом вы можете прочитать в следующих статьях: [Шина I2C: принципы функционирования или зачем ещё тут нужны какие-то резисторы?], [Новое API I2C для ESP-IDF 5.2.0 и выше].
SPI
У классического ESP32 четыре аппаратных SPI-контроллера: — SPI0…SPI3. Поддерживаются режимы передачи — обычный SPI, Dual SPI, Quad SPI (это не разные контроллеры, а варианты ширины фазы данных). При этом поддерживаются два варианта маршрутизации до GPIO — прямой и быстрый через IO_MUX или более гибкий, но медленный GPIO Matrix.
SPI0— используется для доступа к основной Flash/PSRAM через кэш — выполнение кода и доступ к данным во Flash/PSRAM;SPI1— операции с той же шиной памяти, включая команды Flash — выполняет непосредственные команды чтения, записи и стирания Flash;SPI2— пользовательская HSPI-шинаSPI3— пользовательская VSPI-шина
SPI0 и SPI1 образуют системную шину памяти, она занимает те самые GPIO 6-11, а иногда и GPIO 16-17. Обсуждать её нет особого практического смысла.
Для обычных внешних устройств следует выбирать SPI2 / HSPI или SPI3 / VSPI. В Arduino доступны обе шины; стандартный объект SPI обычно использует VSPI, а HSPI можно создать отдельным объектом SPIClass ESP-Arduino.
Обычный SPI
Имеет основные сигналы:
SCLK— тактовый сигнал;MOSI— данные от ведущего к ведомому;MISO— данные от ведомого к ведущему;CS— выбор устройства.
MOSI и MISO представляют отдельные однонаправленные линии данных.
Dual SPI
В этом варианте используются уже две двунаправленные линии для данных:
SCLK— тактовый сигнал;D0, она же обычная MOSI;D1, она же обычная MISO;CS— выбор устройства.
Таким образом, используется то же самое количество GPIO, но обе линии участвуют в передаче и в приеме.
Quad SPI, QSPI
Здесь используются уже четыре линии данных:
D0– MOSI;D1– MISO;D2– QUADWP / WP;D3– QUADHD / HOLD;SCLK— тактовый сигнал;CS— выбор устройства.
Теперь поговорим за GPIO, на которых это можно использовать. Как я уже написал, сигналы SPI можно коммутировать двумя способами:
- через IO_MUX — SPI сможет работать на тактовой частоте до 80 МГц;
- через GPIO Matrix — SPI сможет работать на тактовой частоте до 40 МГц;
GPIO Matrix добавляет к каждому входу примерно 25 нс задержки, особенно критичной для сигнала MISO. Поэтому для высокой частоты чтения данных с периферии желательно использовать полный штатный набор IO_MUX. При произвольных GPIO рекомендуется исходить из предела 40 МГц и при проблемах снижать тактовую частоту.
Штатные GPIO через IO_MUX
У пользовательских SPI2 и SPI3 есть фиксированные наборы контактов прямого подключения через IO MUX.
| Сигнал | SPI2 / HSPI | SPI3 / VSPI |
|---|---|---|
CS0 |
GPIO15 | GPIO5 |
SCLK |
GPIO14 | GPIO18 |
MISO / D1 |
GPIO12 | GPIO19 |
MOSI / D0 |
GPIO13 | GPIO23 |
QUADWP / D2 |
GPIO2 | GPIO22 |
QUADHD / D3 |
GPIO4 | GPIO21 |
На этих полных наборах драйвер сможет использовать IO_MUX, то есть непосредственное соединение контроллера SPI с GPIO. Любое нестандартное назначение GPIO переводит всю шину через GPIO Matrix, с максимальной скоростью передачи до 40 МГц.
GPIO Matrix
SPI2 и SPI3 также можно вывести на другие доступные GPIO. В этом случае сигналы проходят через GPIO Matrix и скорость передачи данных будет снижена как минимум вдвое.
Через Matrix можно назначать свободные доступные GPIO, но направление сигналов SPI накладывает дополнительные ограничения:
- SCLK, MOSI и CS ведущего требуют GPIO с режимом “выход”;
- MISO требует режима “вход”;
- линии D0–D3 в Dual/Quad-режимах должны поддерживать двойное направление (вход + выход);
- GPIO34–GPIO39 являются только входами, поэтому могут использоваться для MISO, но не подходят для SCLK, MOSI, CS или двунаправленных Quad-линий;
- GPIO6–GPIO11 и GPIO16–GPIO17 обычно заняты Flash/PSRAM;
- GPIO0, GPIO2, GPIO5, GPIO12 и GPIO15 являются strapping-выводами;
- GPIO12–GPIO15 также связаны с JTAG.
Более подробно обо всем этом можно почитать из перевода технического паспорта ESP32 SoC.
Таблица выводов ESP32 классической серии
Сведем все указанные выше сведения о выводах ESP32 в таблицу:
Примечания:
- таблица составлена для новых модулей EcoV3 с индексами E, UE, IE
- в столбцах “Поведение при сбросе” указан режим работы “по умолчанию”: I – Input , O – Output, WU – Weak pull-Up, WD – Weak pull-Down, прочерк – вывод не настроен
- в столбцах “Поведение при сбросе” и “Спец.выводы” цветом указана подтяжка по умолчанию – красный к питанию; синий к земле; остальные цвета – просто обратите внимание
- GPIO 34-39 не имеют встроенной схемы “слабой” подтяжки, поэтому при необходимости используйте внешние подтягивающие резисторы
- в принципе, для I2C можно использовать все I/O выводы; но некоторые их них нельзя подтягивать к питанию, что требуется для ее работы – поэтому считаем их недоступными для I2C
EXCEL файл для подготовки проекта
Теперь мы с вами подошли к самой главной цели статьи. Когда периферии (входов, реле, датчиков) к микроконтроллеру подключается много – запутаться очень легко, особенно поначалу. Конечно, есть множество картинок pinout-ов, но постоянно переключаться между Sprint Layout и рисунком – то ещё удовольствие.
Дабы не держать в голове все эти детали и номера выводов, я уже давно сделал себе простенький excel-файлик, в котором отразил все самые существенные моменты. Используя этот файл, легко и непринужденно можно учесть все “тонкие моменты.
Однако в последнее время я усовершенствовал этот файл, добавил “учёт” Strapping pins и он стал ещё удобнее:
Скачать его вы можете с моего GitHub. Он рассчитан под плату ESP32 DevKitC V4 ( NodeMCU ), так как чаще всего я использую именно их, но вы можете переделать его под свои нужды.
Как этим файлом пользоваться?
- Столбец “№ вывода” (ближайший к рисунку платы) обозначает номер вывода модуля, а не номер GPIO. Это удобно, если в дальнейшем вы будете использовать “чистый” модуль
- Столбец “Обозначение” – это и есть собственно обозначение вывода на плате. Ничего особенного.
- Столбец “ADC” сообщает, можно ли использовать этот вывод для измерения аналогового напряжения и номер канала ADC.
- Столбец “Pull EXT” содержит информацию о том, можно ли подтягивать вывод к питанию или земле внешними резисторами или другими деталями (не забывайте о том, что светодиод, оптрон и переход биполярного транзистора для MCU по сути та же самая подтяжка). Если стоит “+”, то можно. Если стоит “x”, то нельзя. Если указано “D” – можно подтянуть к земле, но не к питанию.
- Столбец “Pull INТ” обозначает, можно ли настроить внутреннюю слабую подтяжку ESP32. Если вместо “+” – то можно, и по умолчанию подтяжки нет. Если указано “х” – то нельзя (для выводов GIO 34-39). В случае, если указана буква, то это означает, что по умолчанию подтяжка уже включена – “D” (Weak Pull Down) или “U” (Weak Pull Up).
- Столбец “Выход” содержит информацию о том, можно ли использовать этот вывод “на выход”, то есть для управления устройствами. В случае зеленого “+” вы можете делать это произвольным образом (с учетом тока до 40мА). В случае “х” вывод на выход использовать никак невозможно. Если в данной ячейке стоит “!”, то в принципе можно, но только если осторожно. То есть нельзя изменять нагрузкой логический уровень на выводе в момент его сброса. В случае красного “+” следует учитывать, что в момент сброса состояние выхода может измениться, и нагрузка будет переключена.
- Столбец “Вход” – то же самое, но для считывания логических уровней со входа. То есть для кнопок и различных датчиков. Принципы обозначения те же самые, что и в предыдущем случае.
- В столбце “Функция” указана типовая функция вывода в Arduino.
- Столбец “Назначение в проекте” вы можете использовать для обозначения того, что будет подключено к плате или модулю в вашем проекте.
-= Каталог статей (список по разделам) =- -= Архив статей (плитки, все подряд) =-




















Добрый день.
Разрабатываем проект на базе ESR32.
Нужна консультация специалиста по ним, как можно с Вами связаться?
Напишите на почту)
Добрый! Контакты есть на главной странице в самом низу.
на картинке pull ext, в описании pull out.
Спасибо за внимательность, текст поправил!
Только вот на GitHub файл выглядит чуть иначе и в нём уже заполнены “Назначение в проекте” функциями в какой-то сигнализации.
Именно так! Ведь файл выложен в проекте сигнализации и телеметрии для дачи. И в качестве примера для использования.
А что мешает Вам очистить нужные поля и заполнить своими данными?
Ничего не мешает. 🙂 Просто нашёл поиском, увидел картинку, перешёл по ссылке на GitHub…
Спасибо за реализацию! 🙂
Добрый день. Делаю проект Ё-радио (строго по схемам, ибо нет знаний в этом деле, поэтому повторяю). Вопрос от ламера:
На схеме подключения дисплея к плате Wrover есть такие пины, под названием MISO и MOSI. Если на модуле vs1053b они присутствуют и я просто “тупо” соединю их с пинами платы, то на дисплее 1.88″ ST7735 нет таких пинов (MISO и MOSI).
Есть только (исключая питание) BL, SC,RES, SDA, SCK. И вот тут я зависаю, ибо не понию, что такое MISO и MOSI, поэтому не понимаю, какие куда.
Подскажите?
Поиск выдает следующее:
MOSI (Master Out Slave In) – это линия, по которой микроконтроллер отправляет данные на периферийное устройство.
MISO (Master In Slave Out) – это линия, по которой периферийное устройство отправляет данные микроконтроллеру.
SCK (Serial Clock) – это линия, по которой генерируется тактовый сигнал для синхронизации передачи данных.
Назначение выводов модуля ST7735
• SCK, MOSI, MISO – линии протокола SPI. Альтернативные названия – DO/DI, SCL/SDA. Вывод MISO отсутствует.
• CS – выбор чипа. Активный уровень низкий.
• DC – выбор типа записываемого в модуль слова – данные или команда. Возможны и иные обозначения этого вывода – A0, RS.
• RESET – аппаратный сброс. В состав команд ST7735 входит команда программного сброса, так что на этом выводе можно сэкономить. Однако, следует иметь в виду, что для некоторых регистров контроллера значения по аппаратному и программному сбросу не совпадают.
• VCC, GND – линии питания контроллера. Диапазон напряжения – от 3.3В до 5В.
• LED (или BL) – питание дисплея. Максимально допустимое значение подаваемого на этот вывод напряжения – 3.3 В. В последних модификациях обычно имеется преобразователь 5В –> 3.3 В. Если вы обнаружили его на оборотной стороне своего модуля, можно соединить между собой выводы LED и VCC и подавать любое из указанного диапазона удобное для вас напряжение.
Обобщая все сказанное, можно сделать вывод, что
SCL ESP == SCL ST7735
MOSI ESP == SDA ST7735
MISO ESP -> не подключен
Наверное как-то так
Спасибо, очень пригодилось!
А почему номера выводов начинаются со 2-го, а у питания 5В номера нет совсем?
Очепятка или в этом какой то смысл?
См. https://wiki.iarduino.ru/file/esp32-en.pdf, раздел 2.1
Котяра! Респект и уважуха! Это лучший русскоязычный(да и мировой) ресурс по esp32! Спасибо тебе! Ты экономишь кучу времени, и гору седых волос на голове)))
Здравствуйте. Мне не понятно каким алгоритмом Вы пользуетесь для того, что бы понять можно ли использовать определённый GPIO для входа или выхода. Можете пояснить? Необходимо ведь учитывать ещё подключения на плате, которые нигде не описаны
Очень просто: есть изначально “запрещенные” GPIO, есть “только входы” 4 шт., остальные – универсальные. Из универсальных часть можно использовать с оговорками. Но можно. Все это как раз и описано в статье.
В моем последнем проекте как раз использованы абсолютно все не запрещенные GPIO.
Спасибо за материалы, реально помогает понять некоторые аспекты.
Небольшое дополнение – AMS1117-3.3 – выдает на выходе именно 3.3. С него питается сама ESPшка.
Если я верно понял даташит, есть разные AMS1117, от 1.2 до по моему 5 вольт. Есть настраиваемые (adjustable), которые на соответствующей ноге выдают напряжение, которое задаётся обвязкой. В даташите эта информация есть.
Я просто уже столкнулся с проблемой по AMS1117-3.3, потому и решил прокомментировать.
Мне пришла плата (esp32-c6), у которой вместо 3.3 выдается 4.12.
Что удивительно – еспшка работает и шьётся (на простые демки, без периферии, т.к. боюсь ее пожечь), Исходно она грелась (да и сейчас), только поэтому внимание и обратил. При том на плате именно AMS1117-3.3 (а не AMS1117 adj)
Я не знаю, что там в чипе теперь (сгорело или не сгорело), куплю нормальный AMS1117-3.3 в sot-89, проверю. Пока на пины боязно что-то вешать, лежит без дела. Продавец просто вернул деньги и не стал требовать возврата, так что плата кинута в дальний ящик (на озоне AMS1117-3.3 в sot-89 по 100 штук продается, буду ждать пока партии поменьше появятся)
Добрый день!
AMS1117-3.3 по техпаспорту должен выдавать именно 3,3В. И если у вас почему-то по другому – значит он просто неисправен. Или перемаркирован. Про другие модификации я знаю.
У меня недавно LM2596S-5.0 тоже выдавал 2,5 вместо 5,0. Заменил на другой – заработало. Бывает.
Он исправен. С платой проблемы. С землёй. Толи с разводкой что-то не то, толи какой-то элемент по пути от земли к 1му контакту 1117 мёртвый. Честно – искать лень, я пока в электронике так себе, решил вопрос проще.
Сдул 1117, подключил отдельно от esp32, выдает 3.3
Запаял обратно, кинул на 1ю ногу 1117й принудительно землю, на проце стало 3.3 (но встроенный на плату диод 3528 похоже уже сгорел от 4.12, во всяком случае я не смог зажечь встроенный ргб, который вроде как на 8 пине, никакими примерами и стандартными библиотеками, включая адафруктовский неопиксель).
Запустить посторонние диоды на разных выводах получилось, подключить 1309 олед экран – тоже, как и динамик. Вайфай и блютуз также оказались рабочими. Похоже, сама esp32c6 смогла пережить 4.12. Насчёт флеша и оперативки не уверен (у меня версия с 8 флеша, а не 4), но простыми примерами шьётся и работает.
Если дадите какой-то совет по поводу встроенного ргб диода – буду признателен (как именно его зажечь).
А я всё о своём, о наболевшем.
Если Вы (уважаемый автор заметок) когда-нибудь доберетесь до esp32-c6 (в моем случае с маркировкой nanoESP32-C6 v1.0) и сможете подключить SPI дисплей 128×160 TFT/ST7735 SPI (тот что с кардридером и 8 пинами дисплея), и выложите howto процесса, я буду счастлив.
Мне так и не удалось это сделать. Равно как и не получилось диод запустить (он, возможно, сгорел от 4+ вольт?)
Выше сообщением я ошибся, подключал I2C ssd1306 (а не 09). Вполне заработало.
Сделать это удалось, поменяв в настроечном файле платы в ардуине sck на пин 7, а sda на пин 6. Адафруктовский пример после этого отработал без проблем.
А вот на ST7735 уже кучу пинов перебрал, ничего не выходит. Вот последняя распиновка (в конфиге платы):
sck 7
sda 6
a0 13
reset -1
cs 12
Названия с пинов экрана, в файле конфига например a0 – это DC.
Сам экран заведомо рабочий (на классическом esp32 я его включал)
И если для классической ESP32 можно найти схемы и понять, к каким пинам что тыкать, то с C6 в сети совсем грустно, материалов по ней считай нет, ни на русском, ни на английском.
Александр, не в курсе, какой ток держит шина USB – VIN? Хочу запитать от USB и на VIN повесить дисплей 1602 (токи 30-100 мА)