mirror of
https://github.com/espressif/esp-idf.git
synced 2025-09-30 19:19:21 +00:00
Merge branch 'doc/power_management_esp32s2' into 'master'
docs: describe power management logic for ESP32-S2, fix translation See merge request espressif/esp-idf!10525
This commit is contained in:
@@ -1,9 +1,3 @@
|
||||
ESP32 Power Management Algorithm
|
||||
--------------------------------
|
||||
|
||||
The table below shows how CPU and APB frequencies will be switched if dynamic frequency scaling is enabled. You can specify the maximum CPU frequency with either :cpp:func:`esp_pm_configure` or :ref:`CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ`.
|
||||
|
||||
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
||||
| Max CPU | Lock Acquisition | CPU and APB Frequncies |
|
||||
| Frequency Set | | |
|
||||
@@ -18,8 +12,8 @@ The table below shows how CPU and APB frequencies will be switched if dynamic fr
|
||||
| 160 | ``ESP_PM_CPU_FREQ_MAX`` acquired | | CPU: 160 MHz |
|
||||
| | | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | ``ESP_PM_CPU_FREQ_MAX`` acquired, | | CPU: 80 MHz |
|
||||
| | ``ESP_PM_APB_FREQ_MAX`` not acquired | | APB: 80 MHz |
|
||||
| | ``ESP_PM_APB_FREQ_MAX`` acquired, | | CPU: 80 MHz |
|
||||
| | ``ESP_PM_CPU_FREQ_MAX`` not acquired | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | None | Min values for both frequencies set |
|
||||
| | | with :cpp:func:`esp_pm_configure` |
|
||||
@@ -30,11 +24,3 @@ The table below shows how CPU and APB frequencies will be switched if dynamic fr
|
||||
| | None | Min values for both frequencies set |
|
||||
| | | with :cpp:func:`esp_pm_configure` |
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
||||
|
||||
|
||||
If none of the locks are acquired, and light sleep is enabled in a call to :cpp:func:`esp_pm_configure`, the system will go into light sleep mode. The duration of light sleep will be determined by:
|
||||
|
||||
- FreeRTOS tasks blocked with finite timeouts
|
||||
- Timers registered with :doc:`High resolution timer <esp_timer>` APIs
|
||||
|
||||
Light sleep duration will be chosen to wake up the chip before the nearest event (task being unblocked, or timer elapses).
|
||||
|
@@ -0,0 +1,28 @@
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
||||
| Max CPU | Lock Acquisition | CPU and APB Frequncies |
|
||||
| Frequency Set | | |
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
||||
| 240 | ``ESP_PM_CPU_FREQ_MAX`` acquired | | CPU: 240 MHz |
|
||||
| | | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | ``ESP_PM_APB_FREQ_MAX`` acquired, | | CPU: 80 MHz |
|
||||
| | ``ESP_PM_CPU_FREQ_MAX`` not acquired | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | None | Min values for both frequencies set |
|
||||
| | | with :cpp:func:`esp_pm_configure` |
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
||||
| 160 | ``ESP_PM_CPU_FREQ_MAX`` acquired | | CPU: 160 MHz |
|
||||
| | | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | ``ESP_PM_APB_FREQ_MAX`` acquired, | | CPU: 80 MHz |
|
||||
| | ``ESP_PM_CPU_FREQ_MAX`` not acquired | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | None | Min values for both frequencies set |
|
||||
| | | with :cpp:func:`esp_pm_configure` |
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
||||
| 80 | | Any of ``ESP_PM_CPU_FREQ_MAX`` | | CPU: 80 MHz |
|
||||
| | | or ``ESP_PM_APB_FREQ_MAX`` acquired | | APB: 80 MHz |
|
||||
+ +---------------------------------------+-------------------------------------+
|
||||
| | None | Min values for both frequencies set |
|
||||
| | | with :cpp:func:`esp_pm_configure` |
|
||||
+---------------+---------------------------------------+-------------------------------------+
|
@@ -25,7 +25,7 @@ Power management can be enabled at compile time, using the option :ref:`CONFIG_P
|
||||
|
||||
Enabling power management features comes at the cost of increased interrupt latency. Extra latency depends on a number of factors, such as the CPU frequency, single/dual core mode, whether or not frequency switch needs to be done. Minimum extra latency is 0.2 us (when the CPU frequency is 240 MHz and frequency scaling is not enabled). Maximum extra latency is 40 us (when frequency scaling is enabled, and a switch from 40 MHz to 80 MHz is performed on interrupt entry).
|
||||
|
||||
Dynamic frequency scaling (DFS) and automatic light sleep can be enabled in an application by calling the function :cpp:func:`esp_pm_configure`. Its argument is a structure defining the frequency scaling settings, :cpp:class:`esp_pm_config_esp32_t`. In this structure, three fields need to be initialized:
|
||||
Dynamic frequency scaling (DFS) and automatic light sleep can be enabled in an application by calling the function :cpp:func:`esp_pm_configure`. Its argument is a structure defining the frequency scaling settings, :cpp:class:`esp_pm_config_{IDF_TARGET_PATH_NAME}_t`. In this structure, three fields need to be initialized:
|
||||
|
||||
- ``max_freq_mhz``: Maximum CPU frequency in MHz, i.e., the frequency used when the ``ESP_PM_CPU_FREQ_MAX`` lock is acquired. This field will usually be set to the default CPU frequency.
|
||||
- ``min_freq_mhz``: Minimum CPU frequency in MHz, i.e., the frequency used when only the ``ESP_PM_APB_FREQ_MAX`` lock is acquired. This field can be set to the XTAL frequency value, or the XTAL frequency divided by an integer. Note that 10 MHz is the lowest frequency at which the default REF_TICK clock of 1 MHz can be generated.
|
||||
@@ -62,11 +62,27 @@ Lock Description
|
||||
``ESP_PM_NO_LIGHT_SLEEP`` Disables automatic switching to light sleep.
|
||||
============================ ======================================================
|
||||
|
||||
{IDF_TARGET_NAME} Power Management Algorithm
|
||||
---------------------------------------
|
||||
|
||||
The table below shows how CPU and APB frequencies will be switched if dynamic frequency scaling is enabled. You can specify the maximum CPU frequency with either :cpp:func:`esp_pm_configure` or :ref:`CONFIG_{IDF_TARGET_CFG_PREFIX}_DEFAULT_CPU_FREQ_MHZ`.
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
.. include:: inc/power_management_esp32.rst
|
||||
|
||||
.. only:: not esp32
|
||||
|
||||
.. include:: inc/power_management_esp32s2_and_later.rst
|
||||
|
||||
|
||||
If none of the locks are acquired, and light sleep is enabled in a call to :cpp:func:`esp_pm_configure`, the system will go into light sleep mode. The duration of light sleep will be determined by:
|
||||
|
||||
- FreeRTOS tasks blocked with finite timeouts
|
||||
- Timers registered with :doc:`High resolution timer <esp_timer>` APIs
|
||||
|
||||
Light sleep duration will be chosen to wake up the chip before the nearest event (task being unblocked, or timer elapses).
|
||||
|
||||
|
||||
Dynamic Frequency Scaling and Peripheral Drivers
|
||||
------------------------------------------------
|
||||
@@ -88,30 +104,22 @@ Currently, the following peripheral drivers are aware of DFS and will use the ``
|
||||
|
||||
The following drivers will hold the ``ESP_PM_APB_FREQ_MAX`` lock while the driver is enabled:
|
||||
|
||||
- **SPI slave**: between calls to :cpp:func:`spi_slave_initialize` and :cpp:func:`spi_slave_free`.
|
||||
- **Ethernet**: between calls to :cpp:func:`esp_eth_driver_install` and :cpp:func:`esp_eth_driver_uninstall`.
|
||||
- **WiFi**: between calls to :cpp:func:`esp_wifi_start` and :cpp:func:`esp_wifi_stop`. If modem sleep is enabled, the lock will be released for the periods of time when radio is disabled.
|
||||
- **TWAI**: between calls to :cpp:func:`twai_driver_install` and :cpp:func:`twai_driver_uninstall`.
|
||||
.. list::
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
- **Bluetooth**: between calls to :cpp:func:`esp_bt_controller_enable` and :cpp:func:`esp_bt_controller_disable`. If Bluetooth modem sleep is enabled, the ``ESP_PM_APB_FREQ_MAX`` lock will be released for the periods of time when radio is disabled. However the ``ESP_PM_NO_LIGHT_SLEEP`` lock will still be held, unless :ref:`CONFIG_BTDM_LOW_POWER_CLOCK` option is set to "External 32kHz crystal".
|
||||
- **SPI slave**: between calls to :cpp:func:`spi_slave_initialize` and :cpp:func:`spi_slave_free`.
|
||||
- **Ethernet**: between calls to :cpp:func:`esp_eth_driver_install` and :cpp:func:`esp_eth_driver_uninstall`.
|
||||
- **WiFi**: between calls to :cpp:func:`esp_wifi_start` and :cpp:func:`esp_wifi_stop`. If modem sleep is enabled, the lock will be released for the periods of time when radio is disabled.
|
||||
- **TWAI**: between calls to :cpp:func:`twai_driver_install` and :cpp:func:`twai_driver_uninstall`.
|
||||
:SOC_BT_SUPPORTED: - **Bluetooth**: between calls to :cpp:func:`esp_bt_controller_enable` and :cpp:func:`esp_bt_controller_disable`. If Bluetooth modem sleep is enabled, the ``ESP_PM_APB_FREQ_MAX`` lock will be released for the periods of time when radio is disabled. However the ``ESP_PM_NO_LIGHT_SLEEP`` lock will still be held, unless :ref:`CONFIG_BTDM_LOW_POWER_CLOCK` option is set to "External 32kHz crystal".
|
||||
|
||||
The following peripheral drivers are not aware of DFS yet. Applications need to acquire/release locks themselves, when necessary:
|
||||
|
||||
.. only:: esp32
|
||||
.. list::
|
||||
|
||||
- PCNT
|
||||
- Sigma-delta
|
||||
- Timer group
|
||||
- MCPWM
|
||||
|
||||
.. only:: esp32s2
|
||||
|
||||
- PCNT
|
||||
- Sigma-delta
|
||||
- Timer group
|
||||
|
||||
:esp32: - MCPWM
|
||||
|
||||
API Reference
|
||||
-------------
|
||||
|
Reference in New Issue
Block a user