ESP32-C3: режимы пониженного энергопотребления |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||
ESP32-C3 может находиться в двух режимах пониженного энергопотребления: Light-sleep и Deep-sleep. Light-sleep. В этом режиме сна цифровые периферийные устройства, большая часть RAM и CPU, не получают тактирование, и их напряжение питания снижено. При выходе из Light-sleep блоки периферийных устройств, RAM и CPU возобновляют свою работу в том состоянии, в каком они находились в момент входа Light-sleep (никакие данные не теряются). Deep-sleep. В этом режиме выключено почти все: CPU, большая часть RAM и все цифровые периферийные устройства, которые тактируются от APB_CLK. Только некоторые части чипа остаются под питанием: Контроллер RTC [2] Примечание: существует более продвинутый, двухядерный чип ESP32 с другой архитектурой, у которого есть и другие дополнительные устройства, которые также получают питание в режиме Deep-sleep: периферийные устройства RTC, сопроцессор ULP, медленная память RTC (RTC slow memory), см. [3]. Существует несколько источников пробуждения (wakeup) для выхода из режимов Deep-sleep и Light-sleep. Эти источники также можно комбинировать, чтобы чип просыпался, когда поступил сигнал пробуждения от любого сконфигурированного источника пробуждения. Источники пробуждения можно разрешить вызовом API-функций esp_sleep_enable_X_wakeup, и запретить esp_sleep_disable_wakeup_source. В следующей секции более подробно описываются эти API-вызовы. Источники пробуждения могут быть сконфигурированы в любой момент перед входом в режим Light-sleep или Deep-sleep. Дополнительно приложение может принудительно активировать определенные режимы выключения для периферийных устройств RTC и областей памяти RTC, используя API-функцию esp_sleep_pd_config. После того, как источники пробуждения сконфигурированы, приложение может войти в один из двух режимов сна, используя API-функцию esp_light_sleep_start или esp_deep_sleep_start. В этот момент аппаратура будет сконфигурирована в соответствии с запрошенными источниками пробуждения, и контроллер RTC будет делать либо power down, либо power off для ядра CPU и цифровых периферийных устройств. Если соединения Wi-Fi должны сохраняться, разрешите режим Wi-Fi Modem-sleep и функцию automatic Light-sleep (см. API-функции управления энергопотреблением [4]). Это позволит системе автоматически выйти из сна, когда сконфигурирован драйвер Wi-Fi, поддерживая тем самым соединение с точкой доступа. [Wi-Fi/Bluetooth и режимы сна] В режимах пониженного энергопотребления Deep-sleep и Light-sleep беспроводные устройства выключены (power down). Перед входом в режим Deep-sleep или Light-sleep, приложение должно запретить Wi-Fi и Bluetooth, используя для этого соответствующие вызовы API-функций (т. е. esp_bluedroid_disable, esp_bt_controller_disable, esp_wifi_stop). Соединения Wi-Fi и Bluetooth не будут поддерживаться в режимах Deep-sleep или Light-sleep, даже если эти функции не были вызваны. [Источники пробуждения] Timer. Контроллер RTC содержит встроенный таймер, который может использоваться для пробуждения чипа после предварительно определенного интервала времени. Время указывается с точностью до микросекунды, однако реальная разрешающая способность указания времени зависит от выбранного источника тактирования для RTC SLOW_CLK. В этом режиме выхода из сна периферийные устройства RTC или блоки памяти RTC во время сна включать не нужно. Для разрешения пробуждения с помощью таймера может использоваться функция esp_sleep_enable_timer_wakeup. GPIO Wakeup. Любой внешний вывод порта GPIO может использоваться для вывода ESP32-C3 из режима Light-sleep. С этим источником пробуждения каждая ножка может быть индивидуально сконфигурирована (с помощью функции gpio_wakeup_enable) для вывода чипа из сна по высокому или низкому уровню. Для разрешения этого источника пробуждения может использоваться функция esp_sleep_enable_gpio_wakeup. Дополнительно те ножки GPIO, которые получают питание от домена VDD3P3_RTC (это порты GPIO0 .. GPIO5, см. [5]), могут быть использованы для вывода чипа ESP32-C3 из Deep-sleep. Ножка для подачи сигнала пробуждения и уровень активации пробуждения может быть сконфигурирован вызовом esp_deep_sleep_enable_gpio_wakeup. Эта функция разрешит выход из Deep-sleep для выбранного вывода. UART Wakeup (только для Light-sleep). Когда ESP32 получает данные на входе UART от внешних устройств, часто необходимо разбудить чип, чтобы он мог обработать доступные данные. Периферийное устройство UART содержит функцию, которая позволяет вывести чип из режима Light-sleep, когда на ножке RX появилось определенное количество положительных перепадов. Это количество перепадов может быть установлено функцией uart_set_wakeup_threshold. Обратите внимание, что символ, который активирует пробуждение (и любые символы до него) не будет принят блоком UART после пробуждения (т. е. символ пробуждения и любые символы до него будут потеряны). Это значит, что внешнему устройству перед отправкой полезных данных обычно требуется отправить в ESP32 дополнительный символ, чтобы активировалось пробуждение. Для разрешения этого источника пробуждения может использоваться функция esp_sleep_enable_uart_wakeup. Примечание: двухядерная версия чипа ESP32 также может быть выведена из deep-sleep периферийным устройством тачпада, сопроцессором ULP, в также внешним сигналом на выводах ext0 и ext1, подробнее см. [3]. [Выключение периферийных устройств и блоков памяти RTC] По умолчанию все функции esp_deep_sleep_start и esp_light_sleep_start выключат все домены питания RTC, которые не требуются для разрешенных источников пробуждения. Для переназначения этого поведения предоставлена функция esp_sleep_pd_config. У чипа ESP32-C3 есть только быстрая память RTRC (RTC fast memory), так что если некоторые переменные в программе помечены атрибутами RTC_DATA_ATTR, RTC_SLOW_ATTR или RTC_FAST_ATTR, то все они попадут в RTC fast memory. По умолчанию эта память сохраняет питание, и значения данных в ней могут быть сохранены. Если необходимо, это можно переназначить функцией esp_sleep_pd_config. [Выключение питания памяти Flash] По умолчанию во избежание потенциальных проблем функция esp_light_sleep_start не будет выключать питание flash. Если углубляться в подробности, то выключение питания flash занимает некоторое время, и во время этого периода времени система может быть разбужена, что фактически включит питание flash прежде чем flash может быть полностью выключена. В результате есть некий шанс, что flash может не заработать правильно. Так что теоретически будет нормальным, если вы разбудите систему только после того, как flash будет полностью выключена. Однако фактически период времени выключения flash может быть сложно предсказать (например, этот период может оказаться намного больше, когда вы добавили конденсаторы фильтра в цепь питания flash), и может быть неконтролируемым (например, асинхронные внешние сигналы пробуждения делают неуправляемым реальную длительность времени сна). Предупреждение: если добавлен конденсатор фильтра на схему питания памяти flash, то по возможности избегайте выключения питания flash. Таким образом, рекомендуется не выключать питание flash, когда используется ESP-IDF. Для приложений, которые особенно критичны в плане минимизации энергопотребления, рекомендуется использовать Kconfig-опцию CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND, чтобы снизить потребление мощности во время light sleep, вместо того, чтобы выключать питание flash. Однако стоит проверить следующие механизмы для тех, кто полностью понимает риск, и все еще намерен выключать питание flash для дополнительного снижения энергопотребления: ● Установка опции CONFIG_ESP_SLEEP_POWER_DOWN_FLASH выключит питание flash только когда таймер RTC является единственным источником пробуждения, и время сна больше, чем период выключенного питания flash. Замечания: ● ESP-IDF не предоставляет какие-либо механизмы, которые могут выключить питание flash во всех условиях, когда используется режим light sleep. Вход в Light-sleep. После того, как источники пробуждения были сконфигурированы, для входа в режим Light-sleep может использоваться функция esp_light_sleep_start. Также есть возможность входа в Light-sleep, когда не было сконфигурировано ни одного источника пробуждения. В этом случае чип будет бесконечно находиться в режиме Light-sleep, пока не придет сигнал внешнего сброса. Вход в Deep-sleep. После того, как источники пробуждения были сконфигурированы, для входа в режим Deep-sleep может использоваться функция esp_deep_sleep_start. Также есть возможность в входа Deep-sleep, когда не было сконфигурировано ни одного источника пробуждения. В этом случае чип будет бесконечно находиться в режиме Deep-sleep, пока не придет сигнал внешнего сброса. [Конфигурирование IO] Некоторые ножки ввода/вывода ESP32 (IO) снабжены внутренними резисторами подтяжки pullup или pulldown, которые по умолчанию разрешены. Если внешняя схема управляет такой ножкой в режиме Deep-sleep, то может увеличиться ток потребления, который будет протекать через эти резисторы. Чтобы изолировать (переключить в третье состояние) ножку IO, и тем самым исключить лишний ток потребления, вызовите функцию rtc_gpio_isolate. В режиме Deep-sleep: ● Цифровые порты GPIO (GPIO6 .. GPIO21) находятся в состоянии высокого сопротивления. ● Ножки RTC GPIO (GPIO0 .. GPIO5) могут быть в следующих состояниях, в зависимости от того, разрешена ли на них функция удержания уровня, или нет: - Если функция удержания не разрешена, то RTC GPIO останутся в состоянии высокого сопротивления. [Обработка вывода UART] Перед входом в режим сна функция esp_deep_sleep_start сбросит (flush) содержимое всех стеков UART FIFO. Когда происходит вход в Light-sleep с помощью esp_light_sleep_start, стеки UART FIFO не будут сбрасываться. Вместо этого вывод UART будет приостановлен, и оставшиеся в FIFO символы будут отправлены после выхода из режима Light-sleep. [Проверка, от чего произошло пробуждение] Чтобы проверить, какой из источников пробуждения вывел устройство из режима сна, может использоваться функция esp_sleep_get_wakeup_cause. /**
* @brief Возможные причины пробуждения
*/
typedef enum { ESP_SLEEP_WAKEUP_UNDEFINED, //!< В случае deep sleep сброс не был вызван выходом из deep sleep. ESP_SLEEP_WAKEUP_ALL, //!< Не случай пробуждения, используется для запрета всех источников // пробуждения вызовом функции esp_sleep_disable_wakeup_source. ESP_SLEEP_WAKEUP_EXT0, //!< Пробуждение было вызвано внешним сигналом, используется RTC_IO. ESP_SLEEP_WAKEUP_EXT1, //!< Пробуждение было вызвано внешним сигналом, используется RTC_CNTL. ESP_SLEEP_WAKEUP_TIMER, //!< Пробуждение от таймера. ESP_SLEEP_WAKEUP_TOUCHPAD, //!< Пробуждение от тачпада. ESP_SLEEP_WAKEUP_ULP, //!< Пробуждение от программы ULP(*). ESP_SLEEP_WAKEUP_GPIO, //!< Пробуждение от GPIO (работает только для light sleep). ESP_SLEEP_WAKEUP_UART, //!< Пробуждение от UART (работает только для light sleep). ESP_SLEEP_WAKEUP_WIFI, //!< Пробуждение от WIFI (работает только для light sleep). ESP_SLEEP_WAKEUP_COCPU, //!< Пробуждение от прерывания COCPU. ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG, //!< Пробуждение от COCPU crash. ESP_SLEEP_WAKEUP_BT, //!< Пробуждение от BT (работает только для light sleep). } esp_sleep_source_t; /* Этот тип определен для сохранения совместимости */
typedef esp_sleep_source_t esp_sleep_wakeup_cause_t; Примечание (*): блоком ULP оборудованы не все модели процессоров ESP32, подробнее см. [6]. [Запрет источника пробуждения] Сконфигурированные ранее источники пробуждения могут быть запрещены позже с помощью API-функции esp_sleep_disable_wakeup_source. Эта функция деактивирует триггер пробуждения для указанного источника. Дополнительно можно запретить все триггеры, если передать в аргументе ESP_SLEEP_WAKEUP_ALL. [Примеры приложений] protocols/sntp: реализация базового функционала Deep-sleep, где модуль ESP периодически выводится из сна для получения времени с сервера NTP. [Справочник по API-функциям Sleep Modes] Заголовочный файл: components/esp_hw_support/include/esp_sleep.h.
Примечание: полное описание макросов, типов данных, API-функций и их параметров см. в документации [1]. [Ссылки] 1. ESP32-C3 Sleep Modes site:docs.espressif.com. |