В чипе ESP32 представлено 34 физических ножки GPIO (GPIO0 .. GPIO19, GPIO21 .. GPIO23, GPIO25 .. GPIO27 и GPIO32 .. GPIO39). Каждая из них может использоваться как ножка ввода/вывода общего назначения (general-purpose I/O, сокращенно GPIO), или может быть подсоединена к внутреннему сигналу периферийного устройства. Через блоки IO MUX, RTC IO MUX и матрицу GPIO входные сигналы периферийных устройств могут поступать с любой ножки IO, и выходные сигналы периферии могут быть выведены на любую ножку IO. Эти модули совместно предоставляют большую гибкость в конфигурировании ввода/вывода. Дополнительную информацию см. в документации ESP32 Technical Reference Manual -> IO MUX and GPIO Matrix (GPIO, IO_MUX) [PDF].
Таблица ниже предоставляет информацию по использованию выводов, также см. ниже примечания по ограничениям GPIO.
Таблица 1. Общая информация по выводам портов GPIO.
GPIO |
Аналоговая функция |
RTC GPIO |
Комментарии |
GPIO0 |
ADC2_CH1 |
RTC_GPIO11 |
Strapping pin(1) |
GPIO1 |
|
|
TXD(5) |
GPIO2 |
ADC2_CH2 |
RTC_GPIO12 |
Strapping pin(1) |
GPIO3 |
|
|
RXD(5) |
GPIO4 |
ADC2_CH0 |
RTC_GPIO10 |
|
GPIO5 |
|
|
Strapping pin(1) |
GPIO6 |
|
|
SPI0/1(2) |
GPIO7 |
|
|
GPIO8 |
|
|
GPIO9 |
|
|
GPIO10 |
|
|
GPIO11 |
|
|
GPIO12 |
ADC2_CH5 |
RTC_GPIO15 |
Strapping pin(1); JTAG(3) |
GPIO13 |
ADC2_CH4 |
RTC_GPIO14 |
JTAG(3) |
GPIO14 |
ADC2_CH6 |
RTC_GPIO16 |
JTAG(3) |
GPIO15 |
ADC2_CH3 |
RTC_GPIO13 |
Strapping pin(1); JTAG(3) |
GPIO16 |
|
|
SPI0/1(2) |
GPIO17 |
|
|
GPIO18 |
|
|
|
GPIO19 |
|
|
|
|
|
|
|
GPIO21 |
|
|
|
GPIO22 |
|
|
|
GPIO23 |
|
|
|
|
|
|
|
GPIO25 |
ADC2_CH8 |
RTC_GPIO6 |
|
GPIO26 |
ADC2_CH9 |
RTC_GPIO7 |
|
GPIO27 |
ADC2_CH7 |
RTC_GPIO17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GPIO32 |
ADC1_CH4 |
RTC_GPIO9 |
|
GPIO33 |
ADC1_CH5 |
RTC_GPIO8 |
|
GPIO34 |
ADC1_CH6 |
RTC_GPIO4 |
GPI(4) |
GPIO35 |
ADC1_CH7 |
RTC_GPIO5 |
GPIO36 |
ADC1_CH0 |
RTC_GPIO0 |
GPIO37 |
ADC1_CH1 |
RTC_GPIO1 |
GPIO38 |
ADC1_CH2 |
RTC_GPIO2 |
GPIO39 |
ADC1_CH3 |
RTC_GPIO3 |
Примечания:
(1) Strapping pin: GPIO0, GPIO2, GPIO5, GPIO12 (MTDI) и GPIO15 (MTDO) это ножки управления загрузкой (strapping). Для дополнительной информации см. даташит ESP32. (2) SPI0/1: GPIO6-GPIO11 и GPIO16-GPIO17 обычно подключаются к SPI flash и PSRAM, встроенные в модуль, и поэтому не должны использоваться для других целей. (3) JTAG: GPIO12-GPIO15 обычно используются встроенным интерфейсом отладки. (4) GPI: GPIO34-GPIO39 могут быть установлены только в режиме ввода, и у них нет программно-управляемых функций управления внутренними резисторами подтяжки (pullup или pulldown). (5) TXD и RXD обычно используются для прошивки и вывода отладочных сообщений. (6) ADC2: ножки ADC2 не могут использоваться, когда используется Wi-Fi. Таким образом, если у Вас проблемы с оцифровкой сигнала от ADC2 GPIO при использовании Wi-Fi, то рассмотрите вместо этого использование ADC1 GPIO. Для дополнительной информации ознакомьтесь с ограничениями для ADC [2].
Существует также отдельная функциональная возможность "RTC GPIO", при которой ножки GPIO маршрутизируются на блок RTC подсистемы пониженного потребления и аналоговых сигналов. Эти функции вывода могут использоваться для следующего:
• В режиме глубокого сна (Deep-sleep). Выходы могут сохранять свое настроенное состояние в режиме глубокого сна(*). • При работе сопроцессора сверхнизкого энергопотребления (Ultra Low Power, ULP). • Аналоговые функции, такие как ADC, DAC и т. д.
Примечание (*): Если вы планируете использовать аппаратную функцию удержания для создания на выводах уровней по умолчанию при переходе в deep speep, то в качестве альтернативы рассмотрите внешние подтягивающие резисторы. Это позволит экономить на энергопотреблении за счет того, что не будет использоваться модуль RTC для удержания уровней на выходах. Дополнительный бонус - при переходе ESP32 в режим глубокого сна не будут использоваться функции gpio_hold_dis, gpio_set_level, gpio_hold_en.
Пример приложения использования выходов и входов GPIO с использованием прерываний можно найти в проекте peripherals/gpio/generic_gpio среди других примеров кода ESP-IDF [3].
[Справочник по API-функциям GPIO]
Обычные GPIO. Заголовочный файл для этих функций components/driver/include/driver/gpio.h. Используемые типы, макросы и константы определены в заголовке components/hal/include/hal/gpio_types.h.
Функция |
Описание |
gpio_config |
Выполняет общее конфигурирование GPIO. |
gpio_reset_pin |
Сбросит ножку GPIO в состояние по умолчанию (выберет функцию GPIO, разрешит pullup и запретит ввод и вывод). Замечание: эта функция также конфигурирует IOMUX этого вывода для функции GPIO, и отключит от неё любой другой выход периферийного устройства, который был сконфигурирован через матрицу GPIO. |
gpio_set_intr_type |
Установит тип триггера прерывания GPIO. |
gpio_intr_enable |
Разрешит сигнал прерывания модуля GPIO. Замечание: не используйте прерывание с ножками GPIO36 и GPIO39, когда используется ADC, или Wi-Fi с разрешенным режимом сна (sleep mode), см. комментарии к функции adc1_get_raw [2]. Также см. секцию 3.11 документации "ECO and Workarounds for Bugs in ESP32" для получения описания этой проблемы. В качестве обхода этой проблемы вызовите в приложении функцию adc_power_acquire(). Это приведет к повышению потребляемого тока (на ~1mA), однако устранит выбросы на GPIO36 и GPIO39. |
gpio_intr_disable |
Запретит сигнал прерывания модуля GPIO. Этой функции разрешено выполнение, когда в контексте ISR запрещен кэш с помощью разрешения опции CONFIG_GPIO_CTRL_FUNC_IN_IRAM. |
gpio_set_level |
Установит уровень на ножке GPIO. Этой функции разрешено выполнение, когда в контексте ISR запрещен кэш с помощью разрешения опции CONFIG_GPIO_CTRL_FUNC_IN_IRAM. |
gpio_get_level |
Считывает уровень на входе GPIO. Предупреждение: если эта ножка не была сконфигурирована для входа (или для входа и выхода) то возвращаемое значение будет всегда 0. |
gpio_set_direction |
Установит направление работы GPIO: или только на выход, или только на вход, или одновременно и выход и вход. |
gpio_set_pull_mode |
Конфигурирует внутренние резисторы подтяжки GPIO (pull-up/pull-down). Это можно сконфигурировать только на тех ножках, которые имеют поддержку встроенных резисторов подтяжки. Ножки GPIO34-GPIO39, работающие только на вход, такой возможностью не обладают. |
gpio_wakeup_enable |
Разрешает функцию пробуждения (GPIO wake-up). |
gpio_wakeup_disable |
Запрещает функцию пробуждения GPIO. |
gpio_isr_register |
Регистрирует обработчик прерывания GPIO (функцию ISR). Обработчик будет подключен к тому же ядру CPU, на котором выполняется эта функция. Обработчик ISR будет выполнен, когда произойдет любое прерывание GPIO. См. альтернативные API-функции gpio_install_isr_service() и gpio_isr_handler_add(), чтобы получить поддержку драйвера для отдельных ISR по выводам GPIO. Для запрета или удаления ISR передайте в соответствующие API-функции дескриптор, возвращенный из функции выделения прерывания. |
gpio_pullup_en |
Разрешит верхнюю подтяжку на выводе GPIO. |
gpio_pullup_dis |
Запретит верхнюю подтяжку на выводе GPIO. |
gpio_pulldown_en |
Разрешит нижнюю подтяжку на выводе GPIO. |
gpio_pulldown_dis |
Запретит нижнюю подтяжку на выводе GPIO. |
gpio_install_isr_service |
Установит службу обработчика драйвера GPIO ISR, которая позволяет использовать отдельные обработчики для разных ножек GPIO. Эта функция несовместима с gpio_isr_register(), потому что она всех ножек назначает общий ISR. Служба функции gpio_install_isr_service также устанавливает такой общий обработчик, но дополнительно позволяет регистрировать отдельные обработчики для каждой ножки вызовом функции gpio_isr_handler_add(). |
gpio_uninstall_isr_service |
Деинсталлирует службу драйвера GPIO ISR и освобождает связанные с этим ресурсы. |
gpio_isr_handler_add |
Добавит отдельный обработчик прерывания для определенной ножки GPIO. Вызовите эту функцию после вызова gpio_install_isr_service() для инсталляции службы обработчика драйвера GPIO ISR на выбранную ножку GPIO. Обработчики прерывания ножки больше не надо декларировать с атрибутом IRAM_ATTR, за исключением случая, когда Вы передали флаг ESP_INTR_FLAG_IRAM при выделении ISR в функции gpio_install_isr_service(). Установленный функцией gpio_isr_handler_add обработчик будет вызван из тела общего ISR. Таким образом, имеет значение лимит размера стека, конфигурируемый параметром "ISR stack size" в menuconfig. Этот лимит следует увеличить по сравнению с использованием глобального обработчика GPIO ISR (когда используется gpio_isr_register), потому что gpio_install_isr_service требует дополнительного уровня ветвления и сохранения состояния. |
gpio_isr_handler_remove |
Удалит обработчик ISR для соответствующей ножки GPIO. |
gpio_set_drive_capability |
Установит нагрузочную способность ножки GPIO. |
gpio_get_drive_capability |
Считывает текущее установленное значение нагрузочной способности ножки GPIO. |
gpio_hold_en |
Разрешает функцию удержания (hold) для ножки GPIO. Функция hold работает в обоих режимах входа и выхода, но только на тех ножках, которые поддерживают выход. Если на ножке разрешена функция hold в режиме выхода, то уровень на выходе будет зафиксирован и не может быть изменен. Если на ножке разрешена функция hold в режиме входа, то входное значение, прочитанное с ножки, все еще будет отражать реальное значение уровня на этой ножке. Состояние цифровой ножки GPIO не может быть зафиксировано (hold не работает) в режиме Deep-sleep, и работа hold-функции возобновится после выхода чипа из Deep-sleep. Если ножка GPIO должна быть зафиксирована и в режиме Deep-sleep, то также должна быть вызвана функция gpio_deep_sleep_hold_en. Выключение питания или вызов gpio_hold_dis запретят hold-функцию. |
gpio_hold_dis |
Запретит hold-функцию ножки GPIO. Когда чип выходит из режима глубокого сна (из Deep-sleep), ножки GPIO установятся в режим по умолчанию. Поэтому GPIO будет выводить уровень по умолчанию, если вызвать эту функцию. Если Вы не хотите получить изменение уровня, то GPIO должен быть сконфигурирован в известное состояние перед вызовом этой функции. Например, если вы удерживаете в лог. 1 уровень GPIO18 во время Deep-sleep, то после пробуждения чипа и вызова gpio_hold_dis ножка GPIO18 получит уровень лог. 0 (потому что по умолчанию GPIO18 находится в режиме входа). Если Вам не нужно такое поведение, то следует сконфигурировать GPIO18 в режим выхода перед вызовом gpio_hold_dis. |
gpio_deep_sleep_hold_en |
Разрешит hold-функцию во время Deep-sleep сразу для всех цифровых ножек GPIO. Когда чип находится в режиме Deep-sleep, все цифровые ножки будут удерживать свое состояние перед сном, и когда чип выйдет из сна, состояние цифровых ножек GPIO не будет удерживаться. Обратите внимание, что функция hold работает только когда чип находится в режиме глубокого сна (Deep-sleep mode). В режиме обычного сна состояние ножек может быть изменено даже если вызвать эту функцию. Выключение питания или вызов gpio_hold_dis запретит функцию gpio_deep_sleep_hold_en, иначе hold-функция будет работать, пока чип входит в Deep-sleep. |
gpio_deep_sleep_hold_dis |
Запретит hold-функцию во время Deep-sleep для всех ножек GPIO. |
gpio_iomux_in |
Установит ножку на вход для сигнала периферийного устройства через IOMUX. |
gpio_iomux_out |
Установит ножку на выход для сигнала периферийного устройства через IOMUX. |
gpio_sleep_sel_en |
Разрешит SLP_SEL для автоматического изменения статуса GPIO в lightsleep. |
gpio_sleep_sel_dis |
Запретит SLP_SEL для автоматического изменения статуса GPIO в lightsleep. |
gpio_sleep_set_direction |
Установит направление GPIO в режиме сна, такое как только выход, только вход, или выход и вход. |
gpio_sleep_set_pull_mode |
Конфигурирует встроенные резисторы подтяжки GPIO (pull-up/pull-down) в режиме сна. Поддержка встроенных резисторов подтяжки есть только на тех ножках, которые могут работать и на вход и выход. Ножки GPIO34-GPIO39 это не поддерживают. |
RTC GPIO. Заголовочный файл для этих функций components/driver/include/driver/rtc_io.h. Используемые типы, макросы и константы определены в заголовке components/hal/include/hal/rtc_io_types.h.
Функция |
Описание |
rtc_gpio_is_valid_gpio |
Определяет, поддерживается ли на указанной ножке GPIO функционал RTC GPIO. |
rtc_io_number_get |
Получит индекс RTC IO по номеру ножки GPIO. |
rtc_gpio_init |
Инициализирует ножку как RTC GPIO. Эта функция должна быть вызвана, когда ножка инициализируется для аналоговой функции. |
rtc_gpio_deinit |
Инициализирует ножку как обычный цифровой порт GPIO. |
rtc_gpio_get_level |
Считывает входной уровень RTC IO. |
rtc_gpio_set_level |
Установит выходной уровень RTC IO. |
rtc_gpio_set_direction |
Установит направление RTC GPIO, такое как только выход, только вход, или выход и вход. |
rtc_gpio_set_direction_in_sleep |
Установит направление RTC GPIO в режиме глубокого сна (deep sleep mode), или запретит состояние сна (по умолчанию). В некоторых сценариях приложения для IO требуются другие состояния во время deep sleep. Внимание: ESP32 поддерживает режим только на вход (INPUT_ONLY), ESP32S2 поддерживает INPUT_ONLY, OUTPUT_ONLY, INPUT_OUTPUT. |
rtc_gpio_pullup_en |
Разрешение верхней подтяжки RTC GPIO (pullup). Эта функция работает только для ножек RTC IO. В общем случае вызовите gpio_pullup_en, которая будет работать и на обычных GPIO, и на RTC IO. |
rtc_gpio_pulldown_en |
Разрешение нижней подтяжки RTC GPIO (pulldown). Эта функция работает только для ножек RTC IO. В общем случае вызовите gpio_pulldown_en, которая будет работать и на обычных GPIO, и на RTC IO. |
rtc_gpio_pullup_dis |
Запрет верхней подтяжки RTC GPIO (pullup). Эта функция работает только для ножек RTC IO. В общем случае вызовите gpio_pullup_dis, которая будет работать и на обычных GPIO, и на RTC IO. |
rtc_gpio_pulldown_dis |
Запрет нижней подтяжки RTC GPIO (pulldown). Эта функция работает только для ножек RTC IO. В общем случае вызовите gpio_pulldown_dis, которая будет работать и на обычных GPIO, и на RTC IO. |
rtc_gpio_set_drive_capability |
Установит нагрузочную способность ножки RTC GPIO. |
rtc_gpio_get_drive_capability |
Считывает текущую установленную нагрузочную способность ножки RTC GPIO. |
rtc_gpio_hold_en |
Разрешит функцию удержания (hold) ножки RTC IO. Разрешение HOLD-функции приведет к защелкиванию текущих значений input enable, output enable, output value, функции, нагрузочной способности. Эта функция полезна при входе в режим легкого или глубокого сна This function is useful when going into light or deep sleep mode to prevent the pin configuration from changing. |
rtc_gpio_hold_dis |
Запретит hold-функцию на ножке RTC IO. Запрет hold-функции разрешит ножке принимать значения input enable, output enable, output value, функции, нагрузочной способности от периферийного устройства RTC_IO. |
rtc_gpio_isolate |
Вспомогательная функция для отключения внутренних схем от RTC IO. Эта функция запретит input, output, pullup, pulldown, и разрешит функцию hold для RTC IO. Используйте эту функцию, если RTC IO должен быть отключен от внутренних схем в deep sleep, чтобы минимизировать ток утечки. В частности, для модуля ESP32-WROVER вызов функции rtc_gpio_isolate(GPIO_NUM_12) перед входом в deep sleep уменьшит ток потребления во время глубокого сна. |
rtc_gpio_force_hold_all |
Разрешит сигнал принудительного hold для всех ножек RTC IO. Каждая ножка RTC имеет вход сигнала "force hold", поступающего от контроллера RTC. Если этот сигнал установлен, ножка защелкивает значения input enable, function, output enable и других сигналов, которые поступают от мультиплексора RTC. Сигнал force hold разрешается перед переходом в deep sleep для ножек, которые используются для EXT1 wakeup. |
rtc_gpio_force_hold_dis_all |
Запретит сигнал force hold для всех ножек RTC IO. |
rtc_gpio_wakeup_enable |
Разрешит сигнал wakeup для вывода чипа из sleep mode с использованием определенной ножки GPIO. |
rtc_gpio_wakeup_disable |
Запретит сигнал wakeup для вывода чипа из sleep mode с использованием определенной ножки GPIO. |
Полное описание API-функций, их параметров, макросов, констант и типов данных см. в документации [1].
[Ссылки]
1. ESP32 GPIO & RTC GPIO site:docs.espressif.com. 2. ESP32 Analog to Digital Converter (ADC) site:docs.espressif.com. 3. Установка среды разработки ESP-IDF для ESP32. 4. ESP32-C3: GPIO и RTC GPIO. |