Программирование ARM ESP32-C3: GPIO и RTC GPIO Sun, May 26 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

ESP32-C3: GPIO и RTC GPIO Печать
Добавил(а) microsin   

У микроконтроллера 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.
3ESP32: GPIO и RTC GPIO.
4. ESP32-C3: справочник по выводам.
5. Выбор режима загрузки ESP32-C3.
6. ESP32-C3 Interrupt allocation site:docs.espressif.com.
7. ESP32-C3 Dedicated GPIO.

 

Добавить комментарий


Защитный код
Обновить

Top of Page