У микроконтроллера 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. |