Программирование ARM ESP32: GPIO и RTC GPIO Fri, October 11 2024  

Поделиться

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

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

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

В чипе 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.
4ESP32-C3: GPIO и RTC GPIO.

 

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


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

Top of Page