| 
 У микроконтроллера ESP32-C3 имеется 22 физических вывода портов (GPIO0 .. GPIO21). У других моделей чипов их может быть другое количество, например у ESP32 это 34 GPIO [3]. Каждая ножка порта ESP32-C3 может использоваться как порт ввода/вывода общего назначения (general-purpose I/O, сокращенно GPIO), или может быть подключена внутри кристалла к блокам периферийных устройств чипа. С помощью внутренней матрицы GPIO мультиплексора (IO MUX), сигналы входов и выходов внутренних периферийных устройств (SPI, I2C и т. п.) могут быть разведены на любой внешний вывод порта. Вместе матрица GPIO и IO MUX создают очень гибко конфигурируемую систему ввода/вывода. Более подробную информацию можно получить из PDF-документа "ESP32-C3 Technical Reference Manual", раздел "IO MUX and GPIO Matrix (GPIO, IO_MUX)". 
В следующей таблице предоставлена общая информация по использованию выводов портов. Существуют некоторые ограничения по использованию, см. примечания после этой таблицы. 
Таблица 1. Общая информация по выводам портов GPIO. 
| GPIO | 
Аналоговая функция | 
RTC GPIO | 
Комментарии | 
 
| GPIO0 | 
ADC1_CH0 | 
RTC(4) | 
  | 
 
| GPIO1 | 
ADC1_CH1 | 
  | 
 
| GPIO2 | 
ADC1_CH2 | 
Strapping pin(1)
  | 
 
| GPIO3 | 
ADC1_CH3 | 
  | 
 
| GPIO4 | 
ADC1_CH4 | 
  | 
 
| GPIO5 | 
ADC2_CH0 | 
  | 
 
| GPIO6 | 
  | 
  | 
  | 
 
| GPIO7 | 
  | 
  | 
  | 
 
| GPIO8 | 
  | 
  | 
Strapping pin(1)
  | 
 
| GPIO9 | 
  | 
  | 
 
| GPIO10 | 
  | 
  | 
  | 
 
| GPIO11 | 
  | 
  | 
  | 
 
| GPIO12 | 
  | 
  | 
SPI0/1(2) | 
 
| GPIO13 | 
  | 
  | 
 
| GPIO14 | 
  | 
  | 
 
| GPIO15 | 
  | 
  | 
 
| GPIO16 | 
  | 
  | 
 
| GPIO17 | 
  | 
  | 
 
| GPIO18 | 
  | 
  | 
USB-JTAG(3) | 
 
| GPIO19 | 
  | 
  | 
 
| GPIO20 | 
  | 
  | 
  | 
 
| GPIO21 | 
  | 
  | 
  | 
 
 
Примечания: 
(1) Вывод для управления загрузкой (strapping pin), к ним относятся порты GPIO2, GPIO8 и GPIO9. Для дополнительной информации см. даташит ESP32-C3 и [5]. (2) SPI0/SPI1: GPIO12-GPIO17 обычно используются для подлючения микросхем SPI flash и PSRAM, и эти выводы не рекомендуется использовать для других целей. (3) USB-JTAG: GPIO18 и GPIO19 по умолчанию используются для USB-JTAG. Чтобы использовать их как обычные порты GPIO, аппаратура USB-JTAG будет запрещена драйверами. (4) RTC: GPIO0-GPIO5 можно использовать в режиме самого низкого энергопотребления, или глубокого сна (Deep-sleep mode). 
Пример приложения по использованию GPIO см. в peripherals/gpio/generic_gpio среди других примеров кода ESP-IDF [2]. 
[GPIO Glitch Filter] 
Кристалл ESP32-C3 оборудован аппаратными фильтрами (glitch filter), которые подавляют нежелательные короткие импульсы на входах GPIO, которые могли бы вызвать ошибочное срабатывание прерывания, и предотвращают передачу лишнего шума на входы периферийных устройств. 
На каждом выводе GPIO можно сконфигурировать glitch filter, который может использоваться для устранения влияния входных импульсов, которые по длительности короче 2 периодов тактов выборки (sample clock). Такты выборки это частота тактирования IO_MUX. В драйвере мы можем вызвать этот вид фильтра как pin glitch filter. Вы можете создать дескриптор фильтра (filter handle) вызовом gpio_new_pin_glitch_filter(). Конфигурация для pin glitch filter перечислена в структуре gpio_pin_glitch_filter_config_t. Функция gpio_pin_glitch_filter_config_t(gpio_num) установит фильтр на указанный вывод порта GPIO по его номеру gpio_num. 
По умолчанию glitch filter запрещен, и может быть разрешен вызовом gpio_glitch_filter_enable(). Чтобы отменить фильтр, вы можете вызвать gpio_del_glitch_filter(). Обратите внимание, что перед удалением фильтра вы должны сначала его запретить вызовом gpio_glitch_filter_disable(). 
[Справочник по 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(1). | 
 
| gpio_intr_disable | 
Запретит сигнал прерывания модуля GPIO(2). | 
 
| gpio_set_level | 
Установит уровень на ножке GPIO(2). | 
 
| gpio_get_level | 
Считывает уровень на входе GPIO. Предупреждение: если эта ножка не была сконфигурирована для входа (или для входа и выхода) то возвращаемое значение будет всегда 0. | 
 
| gpio_set_direction | 
Установит направление работы GPIO: или только на выход, или только на вход, или одновременно и выход и вход. | 
 
| gpio_set_pull_mode | 
Конфигурирует внутренние резисторы подтяжки GPIO (pull-up/pull-down)(3). | 
 
| gpio_wakeup_enable | 
Разрешает функцию пробуждения (GPIO wake-up). | 
 
| gpio_wakeup_disable | 
Запрещает функцию пробуждения GPIO. | 
 
| gpio_isr_register | 
Регистрирует обработчик прерывания GPIO (функцию ISR)(4). Обработчик ISR будет выполнен, когда произойдет любое прерывание GPIO. См. альтернативные API-функции gpio_install_isr_service() и gpio_isr_handler_add(), чтобы получить поддержку драйвера для отдельных ISR по выводам GPIO. Запрета или удаления ISR передайте возвращенный дескриптор в функции выделения прерывания [6]. | 
 
| 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. Когда вывод GPIO установлен на hold, его состояние в этот момент защелкивается, и не изменяется при изменении внутреннего сигнала или изменении конфигурации IO MUX/GPIO (включая конфигурацию разрешения входа, разрешения выхода, значения, функции и нагрузочной способности). Функция hold может использоваться для сохранения состояния GPIO, когда кристалл или система сбрасывается, например по сигналу сторожевого таймера (watchdog), или при событии выхода из режима низкого энергопотребления (Deep-sleep). Функция hold работает в обоих режимах входа и выхода, но только на тех ножках, которые поддерживают выход. Если на ножке разрешена функция hold в режиме выхода, то уровень на выходе будет зафиксирован и не может быть изменен. Если на ножке разрешена функция hold в режиме входа, то входное значение, прочитанное с ножки, все еще будет отражать реальное значение уровня на этой ножке. Для цифровых GPIO имеется специальное ограничение для функции hold(5). Выключение питания или вызов 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. Состояние каждого вывода хранит свою активную конфигурацию (не конфигурацию сна!). Обратите внимание, что функция hold работает только когда чип находится в режиме глубокого сна (Deep-sleep mode). Когда чип перешел в активный режим, состояние цифрового порта может быть свободно изменено, даже если была вызвана функция gpio_deep_sleep_hold_en. После вызова этой функции функция удержания (Deep-sleep hold) будет работать вовремя каждого процесса сна. Для запрета этого функционала необходимо вызвать gpio_deep_sleep_hold_dis. | 
 
| gpio_deep_sleep_hold_dis | 
Запретит hold-функцию во время Deep-sleep для всех ножек GPIO. | 
 
| gpio_iomux_in | 
Установит ножку на вход для сигнала периферийного устройства через IO_MUX (SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP). | 
 
| gpio_iomux_out | 
Установит ножку на выход для сигнала периферийного устройства через IO_MUX. | 
 
| gpio_force_hold_all | 
Принудительное удержание всех выводов цифровых портов GPIO и выводов портов RTC GPIO. GPIO принудительно защелкиваются, независимо от того, находится ли чип в активном режиме (active mode) или в одном из режимов сна (sleep mode). Эта функия немедленно приведет к тому, что будут защелкнуты все текущие значения разрешения входа (input enable), резрешения выхода (output enable), значения вывода (output value), конфигурации функции и нагрузочной способности вывода. Предупреждение: этот функционал также будет удерживать состояние выводов SPI flash и выводов UART. Таким образом функция gpio_force_hold_all и весь последующий после её вызова код (до момента вызова gpio_force_unhold_all, отменяющего удержание), ДОЛЖНЫ находиться в внутреннем ОЗУ (IRAM), поскольку выводы SPI flash не работают, и код программы не может быть извлечен из SPI flash. Также во время удержания вывод в лог через UART также перестает работать. | 
 
| gpio_force_unhold_all | 
Отмена принудительного удержания всех выводов цифровых портов GPIO и выводов портов RTC GPIO (см. gpio_force_hold_all). | 
 
| 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) в режиме сна(6). | 
 
| gpio_deep_sleep_wakeup_enable | 
Разрешает функционал вывода GPIO для вывода чипа из состояния глубокого сна (deep-sleep wake-up)(7). | 
 
| gpio_deep_sleep_wakeup_disable | 
Запретит функционал вывода GPIO для вывода чипа из состояния глубокого сна (deep-sleep wake-up). | 
 
 
Примечания: 
(1) Для ESP32: не используйте прерывание с ножками GPIO36 и GPIO39, когда используется ADC, или Wi-Fi с разрешенным режимом сна (sleep mode), см. комментарии к функции adc1_get_raw. Также см. секцию 3.11 документации "ECO and Workarounds for Bugs in ESP32" для получения описания проблемы. В качестве обхода этой проблемы вызовите в приложении функцию adc_power_acquire(). Это приведет к повышению потребляемого тока (на ~1mA), однако устранит выбросы на GPIO36 и GPIO39. (2)  Этой функции разрешено выполнение, когда в контексте ISR запрещен кэш с помощью разрешения опции CONFIG_GPIO_CTRL_FUNC_IN_IRAM. (3) Для ESP32: это можно сконфигурировать только на тех ножках, которые имеют поддержку встроенных резисторов подтяжки. Ножки GPIO34-GPIO39, работающие только на вход, такой возможностью не обладают. (4) Для двухядерного ESP32: обработчик прерывания будет подключен к тому же ядру CPU, на котором выполняется эта функция. (5) Для чипов ESP32, ESP32-S2, ESP32-C3, ESP32-S3, ESP32-C2 функция hold не может использоваться для удеражния состояния цифровых портов (digital GPIO) во время режима Deep-sleep. Даже если функция hold разрешена, digital GPIO будет сброшен в свое состояние по умолчанию, когда кристалл будет разбужен и выйдет из Deep-sleep. Если вы хотите удерживать состояние digital GPIO во время Deep-sleep, то используйте функцию gpio_deep_sleep_hold_en. (6) Для ESP32: поддержка встроенных резисторов подтяжки есть только на тех ножках, которые могут работать и на вход и выход. Ножки GPIO34-GPIO39 это не поддерживают. (7) Эта функция вызывается из SDK, пользователи не должны вызывать её напрямую. 
GPIO Glitch Filter. Заголовочный файл components/driver/gpio/include/driver/gpio_filter.h. 
| Функция | 
Описание | 
 
| gpio_new_pin_glitch_filter | 
Создает для ножки порта фильтр импульсов помех (glitch filter). Параметры длительности фильруемых импульсов фиксированные, будут вырезаны только те импульсы, длительность которых меньше 2 периодов выборки (периодов тактов IO_MUX). Этот фильтр не зависит от "гибкого" (flex) фильтра импульсов, см. также gpio_new_flex_glitch_filter. Дескриптор фильтра, созданный вызовом gpio_new_pin_glitch_filter, может быть позже удален вызовом gpio_del_glitch_filter. | 
 
| gpio_new_flex_glitch_filter | 
Выделяет flex glitch filter. Здесь "flex" означает, что параметры фильтра (окно, порог) настраиваются. Этот фильтр не зависит от glitch filter (см. gpio_new_pin_glitch_filter). Созданный дескриптор фильтра может быть позже удален вызовом gpio_del_glitch_filter. | 
 
| gpio_del_glitch_filter | 
Удалит фильтр помех. | 
 
| gpio_glitch_filter_enable | 
Разрешит фильтр помех. | 
 
| gpio_glitch_filter_disable | 
Запретит фильтр помех. | 
 
 
RTC GPIO. Заголовочный файл для этих функций components/driver/include/driver/rtc_io.h. Используемые типы, макросы и константы определены в заголовке components/hal/include/hal/rtc_io_types.h. 
Полное описание API-функций, их параметров, макросов, констант и типов данных см. в документации [1]. 
[Ссылки] 
1. ESP32-C3 GPIO & RTC GPIO site:docs.espressif.com. 2. Установка среды разработки ESP-IDF для ESP32. 3. ESP32: GPIO и RTC GPIO. 4. ESP32-C3: справочник по выводам. 5. Выбор режима загрузки ESP32-C3. 6. ESP32-C3 Interrupt allocation site:docs.espressif.com. 7. ESP32-C3 Dedicated GPIO.  |