2023-08-03 07:45:48 +00:00
|
|
|
|
时钟树
|
|
|
|
|
==========
|
|
|
|
|
|
|
|
|
|
:link_to_translation:`en:[English]`
|
|
|
|
|
|
2023-12-15 08:19:44 +00:00
|
|
|
|
{IDF_TARGET_RC_FAST_VAGUE_FREQ: default="17.5", esp32="8", esp32s2="8", esp32h2="8"}
|
2023-08-03 07:45:48 +00:00
|
|
|
|
|
2023-12-15 08:19:44 +00:00
|
|
|
|
{IDF_TARGET_RC_FAST_ADJUSTED_FREQ: default="17.5", esp32="8.5", esp32s2="8.5", esp32h2="8.5"}
|
2023-08-03 07:45:48 +00:00
|
|
|
|
|
2024-06-14 08:46:48 +00:00
|
|
|
|
{IDF_TARGET_XTAL_FREQ: default="40", esp32="2 ~ 40", esp32c2="40/26", esp32h2="32", esp32c5="48"}
|
2023-08-03 07:45:48 +00:00
|
|
|
|
|
|
|
|
|
{IDF_TARGET_RC_SLOW_VAGUE_FREQ: default="136", esp32="150", esp32s2="90"}
|
|
|
|
|
|
2023-12-15 08:19:44 +00:00
|
|
|
|
{IDF_TARGET_OSC_SLOW_PIN: default="GPIO0", esp32c2="pin0(时钟信号频率不超过 136 kHz 时)", "esp32c6="GPIO0", esp32h2="GPIO13"}
|
2023-08-03 07:45:48 +00:00
|
|
|
|
|
|
|
|
|
{IDF_TARGET_NAME} 的时钟子系统用于从一系列根时钟中提取并分配系统/模块时钟。时钟树驱动程序负责维护系统时钟的基本功能,并管理模块时钟间的复杂关系。
|
|
|
|
|
|
|
|
|
|
本文档首先介绍了根时钟和模块时钟,随后介绍了可供用户调用的时钟树 API,调用这些 API,可以监测模块时钟的运行状态。
|
|
|
|
|
|
|
|
|
|
简介
|
|
|
|
|
------------
|
|
|
|
|
|
|
|
|
|
本节列出了 {IDF_TARGET_NAME} 支持的根时钟和模块时钟的定义,这些定义通常用于驱动程序配置,有助于为外设选择合适的时钟源。
|
|
|
|
|
|
|
|
|
|
根时钟
|
|
|
|
|
^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
根时钟会产生可靠的时钟信号,经各种门、复用器、分频器或倍频器传递,这些时钟信号最终成为 CPU 内核、Wi-Fi、蓝牙、RTC 及外设等功能模块的时钟源。
|
|
|
|
|
|
|
|
|
|
{IDF_TARGET_NAME} 的根时钟列在 :cpp:type:`soc_root_clk_t` 中:
|
|
|
|
|
|
|
|
|
|
.. list::
|
|
|
|
|
|
|
|
|
|
- 内部 {IDF_TARGET_RC_FAST_VAGUE_FREQ} MHz RC 振荡器 (RC_FAST)
|
|
|
|
|
|
|
|
|
|
此 RC 振荡器可产生约 {IDF_TARGET_RC_FAST_ADJUSTED_FREQ} MHz 的时钟信号输出,标识为 ``RC_FAST_CLK``。
|
|
|
|
|
|
|
|
|
|
.. only:: SOC_CLK_RC_FAST_D256_SUPPORTED
|
|
|
|
|
|
|
|
|
|
此约 {IDF_TARGET_RC_FAST_ADJUSTED_FREQ} MHz 的信号也会传入可配置的分频器,默认情况下,该分频器会将输入的时钟频率分频 256 倍,生成信号 ``RC_FAST_D256_CLK``。
|
|
|
|
|
|
|
|
|
|
在运行时,通过在 ``RC_FAST_D256_CLK`` 上校准,可以计算 ``RC_FAST_CLK`` 的实际频率。
|
|
|
|
|
|
|
|
|
|
.. only:: not SOC_CLK_RC_FAST_D256_SUPPORTED and SOC_CLK_RC_FAST_SUPPORT_CALIBRATION
|
|
|
|
|
|
|
|
|
|
在运行时,通过校准,可以计算 ``RC_FAST_CLK`` 的实际频率。
|
|
|
|
|
|
|
|
|
|
.. only:: not SOC_CLK_RC_FAST_SUPPORT_CALIBRATION
|
|
|
|
|
|
|
|
|
|
在运行时,无法通过校准计算 ``RC_FAST_CLK`` 的实际频率,但仍可以将时钟信号引出到 GPIO 管脚,通过示波器或逻辑分析仪获取频率。
|
|
|
|
|
|
|
|
|
|
- 外部 {IDF_TARGET_XTAL_FREQ} MHz 晶振 (XTAL)
|
|
|
|
|
|
|
|
|
|
- 内部 {IDF_TARGET_RC_SLOW_VAGUE_FREQ} kHz RC 振荡器 (RC_SLOW)
|
|
|
|
|
|
|
|
|
|
此 RC 振荡器产生约 {IDF_TARGET_RC_SLOW_VAGUE_FREQ} kHz 的时钟信号输出,标识为 ``RC_SLOW_CLK``。在运行时,通过校准,可以计算该时钟信号的实际频率。
|
|
|
|
|
|
|
|
|
|
.. only:: SOC_CLK_XTAL32K_SUPPORTED
|
|
|
|
|
|
|
|
|
|
- 外部 32 kHz 晶振 - 可选 (XTAL32K)
|
|
|
|
|
|
|
|
|
|
.. only:: esp32
|
|
|
|
|
|
|
|
|
|
``XTAL32K_CLK`` 的时钟源可以是连接到 ``32K_XP`` 和 ``32K_XN`` 管脚的 32 kHz 晶振,也可以是外部电路生成的 32 kHz 时钟信号。如果使用外部电路生成的时钟信号,该信号必须连接到 ``32K_XN`` 管脚,并且在 ``32K_XP`` 管脚和地之间连接一个 1 nF 的电容。此时,``32K_XP`` 管脚不能用作 GPIO 管脚。
|
|
|
|
|
|
2023-12-15 08:19:44 +00:00
|
|
|
|
.. only:: esp32p4
|
|
|
|
|
|
|
|
|
|
``XTAL32K_CLK`` 的时钟源是连接到 ``XTAL_32K_P`` 和 ``XTAL_32K_N`` 管脚的 32 kHz 晶振。
|
|
|
|
|
|
|
|
|
|
.. only:: not esp32 and not esp32p4
|
2023-08-03 07:45:48 +00:00
|
|
|
|
|
|
|
|
|
``XTAL32K_CLK`` 的时钟源可以是连接到 ``XTAL_32K_P`` 和 ``XTAL_32K_N`` 管脚的 32 kHz 晶振,也可以是外部电路生成的 32 kHZ 时钟信号。如果使用外部电路生成的时钟信号,该信号必须连接到 ``XTAL_32K_P`` 管脚。
|
|
|
|
|
|
|
|
|
|
通过校准,可以计算 ``XTAL32K_CLK`` 的实际频率。
|
|
|
|
|
|
|
|
|
|
.. only:: SOC_CLK_OSC_SLOW_SUPPORTED
|
|
|
|
|
|
|
|
|
|
- 外部慢速时钟 - 可选 (OSC_SLOW)
|
|
|
|
|
|
2023-12-15 08:19:44 +00:00
|
|
|
|
将外部电路生成的时钟信号连接到 {IDF_TARGET_OSC_SLOW_PIN},可作为 ``RTC_SLOW_CLK`` 的时钟源。通过校准,可以计算该时钟信号的实际频率。
|
2023-08-03 07:45:48 +00:00
|
|
|
|
|
|
|
|
|
.. only:: SOC_CLK_RC32K_SUPPORTED
|
|
|
|
|
|
|
|
|
|
- 内部 32 kHz RC 振荡器 (RC32K)
|
|
|
|
|
|
|
|
|
|
在运行时,通过校准,可以计算该时钟信号的实际频率。
|
|
|
|
|
|
|
|
|
|
与晶振产生的信号相比,从 RC 振荡器电路产生的信号通常精度较低,且容易受环境影响。因此,{IDF_TARGET_NAME} 为 ``RTC_SLOW_CLK`` 提供了几种时钟源选项,可以根据对系统时间精度和对功耗的要求选择。更多详情,请参阅 :ref:`rtc-clock-source-choice`。
|
|
|
|
|
|
|
|
|
|
模块时钟
|
|
|
|
|
^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
{IDF_TARGET_NAME} 的可用模块时钟在 :cpp:type:`soc_module_clk_t` 中列出,每个模块时钟都有其唯一 ID。查阅文档中的枚举值,即可获取各模块时钟的详细信息。
|
|
|
|
|
|
|
|
|
|
使用 API
|
|
|
|
|
---------
|
|
|
|
|
|
|
|
|
|
时钟树驱动程序提供了一个一体化接口,可以获取模块时钟的频率,即 :cpp:func:`esp_clk_tree_src_get_freq_hz`。通过该函数,你可以在任何时刻,通过提供时钟名称 :cpp:enum:`soc_module_clk_t` 和指定返回频率值的精度级别 :cpp:enum:`esp_clk_tree_src_freq_precision_t`,获取时钟频率。
|
|
|
|
|
|
|
|
|
|
API 参考
|
|
|
|
|
-------------
|
|
|
|
|
|
|
|
|
|
.. include-build-file:: inc/clk_tree_defs.inc
|
|
|
|
|
.. include-build-file:: inc/esp_clk_tree.inc
|