refactor(gpio): public some IO configuration functions

This allows different peripheral drivers to act on the same IO.
This commit is contained in:
Song Ruo Jing
2024-08-28 18:31:32 +08:00
parent 1b6a829e81
commit e1d3d830ce
28 changed files with 349 additions and 88 deletions
+14 -2
View File
@@ -29,8 +29,20 @@ GPIO 汇总
- 使用 ADC/DAC 等模拟功能时
:SOC_LP_PERIPHERALS_SUPPORTED: - 使用低功耗外设时,例如: LP_UART , LP_I2C 等
IO 管脚配置
-----------
IO 可以有两种使用方式:
- 作为简单的 GPIO 输入读取引脚上的电平,或作为简单的 GPIO 输出以输出所需的电平。
- 作为外设信号的输入/输出。
IDF 外设驱动内部会处理需要应用到引脚上的必要 IO 配置,以便它们可以用作外设信号的输入或输出。这意味着用户通常自己只需负责将 IO 配置为简单的输入或输出。:cpp:func:`gpio_config` 是一个一体化的 API,可用于配置 I/O 模式、内部上拉/下拉电阻等管脚设置。
在一些应用中,IO 管脚可以同时发挥双重作用。例如,输出 LEDC PWM 信号的 IO 也可以作为 GPIO 输入生成中断或 GPIO ETM 事件。这种双重用途的 IO 管脚在配置时需要特别注意。由于 :cpp:func:`gpio_config` 是一个会覆盖所有当前配置的 API ,因此必须先调用它将管脚模式设置为 :cpp:enumerator:`gpio_mode_t::GPIO_MODE_INPUT`,然后才能调用 LEDC 驱动 API 将输出信号连接到引脚上。作为替代方案,如果除了使管脚输入启用之外不需要其他额外配置,可以随时调用 :cpp:func:`gpio_input_enable` 以实现相同的目的。
获取 IO 管脚实时配置状态
--------------------------------------------
------------------------
GPIO 驱动提供了一个函数 :cpp:func:`gpio_dump_io_configuration` 用来输出指定管脚的实时配置状态,包括上下拉、输入输出使能、管脚映射等。例如,以下命令可用于输出 GPIO4,GPIO8 与 GPIO26 的配置状态:
@@ -75,7 +87,7 @@ GPIO 驱动提供了一个函数 :cpp:func:`gpio_dump_io_configuration` 用来
请不要依赖技术参考手册中记录的 GPIO 默认配置状态,因为特殊用途的 GPIO 可能会在 app_main 之前被引导程序或应用程序启动阶段的代码更改。
.. only:: esp32c3 or esp32c6 or esp32h2 or esp32p4 or esp32s2 or esp32s3 or esp32c5
.. only:: esp32c3 or esp32c6 or esp32h2 or esp32p4 or esp32s2 or esp32s3 or esp32c5 or esp32c61
配置 USB PHY 管脚 为普通 GPIO 管脚
---------------------------------------
@@ -134,7 +134,7 @@
.. note::
- 其中一些管脚被用作 Strapping 管脚,可用于选择加载芯片的启动模式等。详细信息可以在 `ESP32-C61 技术规格书 <{IDF_TARGET_DATASHEET_CN_URL}>`_ > ``Strapping 管脚`` 章节中找到
- 其中一些管脚被用作 Strapping 管脚,可用于选择加载芯片的启动模式等。详细信息请见 `ESP32-C61 技术规格书 <{IDF_TARGET_DATASHEET_CN_URL}>`_ > ``Strapping 管脚``
- SPI0/1GPIO14 ~ GPIO17 GPIO19 ~ GPIO21 通常用于 SPI flash,不推荐用于其他用途。
- USB-JTAGGPIO12 GPIO13 默认用于 USB-JTAG。如果将它们配置为普通 GPIO,驱动程序将禁用 USB-JTAG 功能。
@@ -87,7 +87,6 @@ PCNT 单元和通道分别用 :cpp:type:`pcnt_unit_handle_t` 与 :cpp:type:`pcnt
- :cpp:member:`pcnt_chan_config_t::edge_gpio_num`:cpp:member:`pcnt_chan_config_t::level_gpio_num` 用于指定 **边沿** 信号和 **电平** 信号对应的 GPIO 编号。请注意,这两个参数未被使用时,可以设置为 `-1`,即成为 **虚拟 IO** 。对于一些简单的脉冲计数应用,电平信号或边沿信号是固定的(即不会发生改变),可将其设置为虚拟 IO,然后该信号会被连接到一个固定的高/低逻辑电平,这样就可以在通道分配时回收一个 GPIO,节省一个 GPIO 管脚资源。
- :cpp:member:`pcnt_chan_config_t::virt_edge_io_level`:cpp:member:`pcnt_chan_config_t::virt_level_io_level` 用于指定 **边沿** 信号和 **电平** 信号的虚拟 IO 电平,以保证这些控制信号处于确定状态。请注意,只有在 :cpp:member:`pcnt_chan_config_t::edge_gpio_num`:cpp:member:`pcnt_chan_config_t::level_gpio_num` 设置为 `-1` 时,这两个参数才有效。
- :cpp:member:`pcnt_chan_config_t::invert_edge_input`:cpp:member:`pcnt_chan_config_t::invert_level_input` 用于确定信号在输入 PCNT 之前是否需要被翻转,信号翻转由 GPIO 矩阵(不是 PCNT 单元)执行。
- :cpp:member:`pcnt_chan_config_t::io_loop_back` 仅用于调试,它可以使能 GPIO 的输入和输出路径。这样,就可以通过调用位于同一 GPIO 上的函数 :cpp:func:`gpio_set_level` 来模拟脉冲信号。
调用函数 :cpp:func:`pcnt_new_channel`,将 :cpp:type:`pcnt_chan_config_t` 作为输入值并调用 :cpp:func:`pcnt_new_unit` 返回的 PCNT 单元句柄,可对 PCNT 通道进行分配和初始化。如果该函数正常运行,会返回一个 PCNT 通道句柄。如果没有可用的 PCNT 通道(PCNT 通道资源全部被占用),该函数会返回错误 :c:macro:`ESP_ERR_NOT_FOUND`。可用的 PCNT 通道总数记录在 :c:macro:`SOC_PCNT_CHANNELS_PER_UNIT`,以供参考。注意,为某个单元安装 PCNT 通道时,应确保该单元处于初始状态,否则函数 :cpp:func:`pcnt_new_channel` 会返回错误 :c:macro:`ESP_ERR_INVALID_STATE`
@@ -247,7 +246,6 @@ PCNT 单元的滤波器可滤除信号中的短时毛刺,:cpp:type:`pcnt_glitc
- :cpp:member:`pcnt_clear_signal_config_t::clear_signal_gpio_num` 用于指定 **清零** 信号对应的 GPIO 编号。默认有效电平为高,使能下拉输入。
- :cpp:member:`pcnt_clear_signal_config_t::invert_clear_signal` 用于确定信号在输入 PCNT 之前是否需要被翻转,信号翻转由 GPIO 矩阵 (不是 PCNT 单元) 执行。驱动会使能上拉输入,以确保信号在未连接时保持高电平。
- :cpp:member:`pcnt_clear_signal_config_t::io_loop_back` 仅用于调试,它可以使能 GPIO 的输入和输出路径。这样,就可以通过 :cpp:func:`gpio_set_level` 函数来模拟外部输入的清零信号。
该输入信号的作用与调用 :cpp:func:`pcnt_unit_clear_count` 函数相同,但它不受软件延迟的限制,更适用于需要低延迟的场合。请注意,该信号的翻转频率不能太高。