feat(ana_cmpr): support analog comparator on esp32h21

This commit is contained in:
morris
2026-03-20 12:06:19 +08:00
parent ed7c90c8aa
commit 9cad94e697
39 changed files with 211 additions and 178 deletions
+9 -9
View File
@@ -42,11 +42,11 @@ do { \
} \
} while(0)
#define ANA_CMPR_UNIT_CHECK(unit) ESP_RETURN_ON_FALSE((unit) >= 0 && (unit) < SOC_ANA_CMPR_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid unit number")
#define ANA_CMPR_UNIT_CHECK(unit) ESP_RETURN_ON_FALSE((unit) >= 0 && (unit) < ANALOG_CMPR_LL_GET(INST_NUM), ESP_ERR_INVALID_ARG, TAG, "invalid unit number")
/* Global static object of the Analog Comparator unit */
static ana_cmpr_handle_t s_ana_cmpr[SOC_ANA_CMPR_NUM] = {
[0 ...(SOC_ANA_CMPR_NUM - 1)] = NULL,
static ana_cmpr_handle_t s_ana_cmpr[ANALOG_CMPR_LL_GET(INST_NUM)] = {
[0 ...(ANALOG_CMPR_LL_GET(INST_NUM) - 1)] = NULL,
};
/* Global spin lock */
@@ -64,13 +64,13 @@ void ana_cmpr_default_intr_handler(void *usr_data)
/* Call the user callback function if it is specified and the corresponding event triggers*/
if (cmpr_handle->cbs.on_cross && (status & cmpr_handle->intr_mask)) {
// some chip can distinguish the edge of the cross event
#if SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
#if ANALOG_CMPR_LL_SUPPORT(EDGE_TYPE)
if (status & ANALOG_CMPR_LL_POS_CROSS_MASK(cmpr_handle->unit)) {
evt_data.cross_type = ANA_CMPR_CROSS_POS;
} else if (status & ANALOG_CMPR_LL_NEG_CROSS_MASK(cmpr_handle->unit)) {
evt_data.cross_type = ANA_CMPR_CROSS_NEG;
}
#endif // SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
#endif // ANALOG_CMPR_LL_SUPPORT(EDGE_TYPE)
need_yield = cmpr_handle->cbs.on_cross(cmpr_handle, &evt_data, cmpr_handle->user_data);
}
if (need_yield) {
@@ -140,10 +140,10 @@ esp_err_t ana_cmpr_new_unit(const ana_cmpr_config_t *config, ana_cmpr_handle_t *
/* Configure the register */
analog_cmpr_ll_set_ref_source(ana_cmpr_hdl->dev, config->ref_src);
ana_cmpr_hdl->ref_src = config->ref_src;
#if !SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
#if !ANALOG_CMPR_LL_SUPPORT(EDGE_TYPE)
// set which cross type can trigger the interrupt
analog_cmpr_ll_set_intr_cross_type(ana_cmpr_hdl->dev, config->cross_type);
#endif // SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
#endif // !ANALOG_CMPR_LL_SUPPORT(EDGE_TYPE)
// record the interrupt mask, the interrupt will be lazy installed when register user callbacks
// different cross type means different interrupt mask
ana_cmpr_hdl->intr_mask = analog_cmpr_ll_get_intr_mask_by_type(ana_cmpr_hdl->dev, config->cross_type);
@@ -182,7 +182,7 @@ esp_err_t ana_cmpr_del_unit(ana_cmpr_handle_t cmpr)
ANA_CMPR_NULL_POINTER_CHECK(cmpr);
/* Search the global object array to check if the input handle is valid */
int unit = -1;
for (int i = 0; i < SOC_ANA_CMPR_NUM; i++) {
for (int i = 0; i < ANALOG_CMPR_LL_GET(INST_NUM); i++) {
if (s_ana_cmpr[i] == cmpr) {
unit = i;
break;
@@ -233,7 +233,7 @@ esp_err_t ana_cmpr_set_debounce(ana_cmpr_handle_t cmpr, const ana_cmpr_debounce_
esp_err_t ana_cmpr_set_cross_type(ana_cmpr_handle_t cmpr, ana_cmpr_cross_type_t cross_type)
{
#if SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
#if ANALOG_CMPR_LL_SUPPORT(EDGE_TYPE)
/* Not support to set the cross type after initialized, because it relies on the interrupt types to distinguish the edge,
* i.e. have to re-allocate the interrupt to change the cross type */
(void)cmpr;
@@ -1,2 +1,2 @@
| Supported Targets | ESP32-C5 | ESP32-C61 | ESP32-H2 | ESP32-P4 |
| ----------------- | -------- | --------- | -------- | -------- |
| Supported Targets | ESP32-C5 | ESP32-C61 | ESP32-H2 | ESP32-H21 | ESP32-P4 |
| ----------------- | -------- | --------- | -------- | --------- | -------- |
@@ -10,7 +10,7 @@ TEST_CASE("ana_cmpr unit install/uninstall", "[ana_cmpr]")
{
ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = {
.unit = SOC_ANA_CMPR_NUM, // Set a wrong unit
.unit = 100, // Set a wrong unit
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT,
.ref_src = ANA_CMPR_REF_SRC_INTERNAL,
.cross_type = ANA_CMPR_CROSS_ANY,
+2 -1
View File
@@ -20,6 +20,7 @@
#include "esp_log.h"
#include "esp_check.h"
#include "hal/gpio_hal.h"
#include "hal/gpio_caps.h"
#include "esp_private/esp_gpio_reserve.h"
#include "esp_private/io_mux.h"
#include "esp_private/periph_ctrl.h"
@@ -651,7 +652,7 @@ esp_err_t gpio_isr_register(void (*fn)(void *), void *arg, int intr_alloc_flags,
gpio_isr_alloc_t p;
p.source = GPIO_LL_INTR_SOURCE0;
p.intr_alloc_flags = intr_alloc_flags;
#if SOC_ANA_CMPR_INTR_SHARE_WITH_GPIO
#if GPIO_CAPS_GET(INTR_SHARED)
p.intr_alloc_flags |= ESP_INTR_FLAG_SHARED;
#endif
p.fn = fn;
@@ -7,7 +7,7 @@
#include "hal/ana_cmpr_periph.h"
#include "soc/ana_cmpr_struct.h"
const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
const ana_cmpr_periph_t ana_cmpr_periph[1] = {
[0] = {
.src_gpio = ANA_CMPR0_SRC_GPIO,
.ext_ref_gpio = ANA_CMPR0_EXT_REF_GPIO,
@@ -16,7 +16,7 @@ const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
},
};
analog_cmpr_dev_t ANALOG_CMPR[SOC_ANA_CMPR_NUM] = {
analog_cmpr_dev_t ANALOG_CMPR[1] = {
[0] = {
.pad_comp_config = &GPIO_EXT.pad_comp_config_0,
.pad_comp_filter = &GPIO_EXT.pad_comp_filter_0,
@@ -17,6 +17,15 @@
extern "C" {
#endif
#define ANALOG_CMPR_LL_GET(_attr) ANALOG_CMPR_LL_ ## _attr
#define ANALOG_CMPR_LL_SUPPORT(_feat) ANALOG_CMPR_LL_SUPPORT_ ## _feat
// Number of Analog Comparator instances
#define ANALOG_CMPR_LL_INST_NUM 1
// Can detect positive/negative/any cross type
#define ANALOG_CMPR_LL_SUPPORT_EDGE_TYPE 1
#define ANALOG_CMPR_LL_GET_HW(unit) (&ANALOG_CMPR[unit])
#define ANALOG_CMPR_LL_GET_UNIT(hw) (0)
@@ -7,7 +7,7 @@
#include "hal/ana_cmpr_periph.h"
#include "soc/ana_cmpr_struct.h"
const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
const ana_cmpr_periph_t ana_cmpr_periph[1] = {
[0] = {
.src_gpio = ANA_CMPR0_SRC_GPIO,
.ext_ref_gpio = ANA_CMPR0_EXT_REF_GPIO,
@@ -16,7 +16,7 @@ const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
},
};
analog_cmpr_dev_t ANALOG_CMPR[SOC_ANA_CMPR_NUM] = {
analog_cmpr_dev_t ANALOG_CMPR[1] = {
[0] = {
.pad_comp_config = &GPIO_EXT.pad_comp_config_0,
.pad_comp_filter = &GPIO_EXT.pad_comp_filter_0,
@@ -17,6 +17,15 @@
extern "C" {
#endif
#define ANALOG_CMPR_LL_GET(_attr) ANALOG_CMPR_LL_ ## _attr
#define ANALOG_CMPR_LL_SUPPORT(_feat) ANALOG_CMPR_LL_SUPPORT_ ## _feat
// Number of Analog Comparator instances
#define ANALOG_CMPR_LL_INST_NUM 1
// Can detect positive/negative/any cross type
#define ANALOG_CMPR_LL_SUPPORT_EDGE_TYPE 1
#define ANALOG_CMPR_LL_GET_HW(unit) (&ANALOG_CMPR[unit])
#define ANALOG_CMPR_LL_GET_UNIT(hw) (0)
@@ -7,7 +7,7 @@
#include "hal/ana_cmpr_periph.h"
#include "soc/ana_cmpr_struct.h"
const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
const ana_cmpr_periph_t ana_cmpr_periph[1] = {
[0] = {
.src_gpio = ANA_CMPR0_SRC_GPIO,
.ext_ref_gpio = ANA_CMPR0_EXT_REF_GPIO,
@@ -16,7 +16,7 @@ const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
},
};
analog_cmpr_dev_t ANALOG_CMPR[SOC_ANA_CMPR_NUM] = {
analog_cmpr_dev_t ANALOG_CMPR[1] = {
[0] = {
.pad_comp_config = &GPIO_EXT.pad_comp_config,
.pad_comp_filter = &GPIO_EXT.pad_comp_filter,
@@ -12,6 +12,12 @@
#include "hal/ana_cmpr_types.h"
#include "soc/ana_cmpr_struct.h"
#define ANALOG_CMPR_LL_GET(_attr) ANALOG_CMPR_LL_ ## _attr
#define ANALOG_CMPR_LL_SUPPORT(_feat) ANALOG_CMPR_LL_SUPPORT_ ## _feat
// Number of Analog Comparator instances
#define ANALOG_CMPR_LL_INST_NUM 1
#define ANALOG_CMPR_LL_GET_HW(unit) (&ANALOG_CMPR[unit])
#define ANALOG_CMPR_LL_EVENT_CROSS (1 << 0)
@@ -0,0 +1,27 @@
/*
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "hal/ana_cmpr_periph.h"
#include "soc/ana_cmpr_struct.h"
const ana_cmpr_periph_t ana_cmpr_periph[1] = {
[0] = {
.src_gpio = ANA_CMPR0_SRC_GPIO,
.ext_ref_gpio = ANA_CMPR0_EXT_REF_GPIO,
.intr_src = ETS_GPIO_INTERRUPT_PRO_SOURCE,
.module_name = "ANA_CMPR_U0",
},
};
analog_cmpr_dev_t ANALOG_CMPR[1] = {
[0] = {
.pad_comp_config = &GPIO_EXT.pad_comp_config,
.pad_comp_filter = &GPIO_EXT.pad_comp_filter,
.int_st = &GPIO_EXT.int_st,
.int_ena = &GPIO_EXT.int_ena,
.int_clr = &GPIO_EXT.int_clr,
},
};
@@ -16,6 +16,15 @@
extern "C" {
#endif
#define ANALOG_CMPR_LL_GET(_attr) ANALOG_CMPR_LL_ ## _attr
#define ANALOG_CMPR_LL_SUPPORT(_feat) ANALOG_CMPR_LL_SUPPORT_ ## _feat
// Number of Analog Comparator instances
#define ANALOG_CMPR_LL_INST_NUM 1
// Can detect positive/negative/any cross type
#define ANALOG_CMPR_LL_SUPPORT_EDGE_TYPE 1
#define ANALOG_CMPR_LL_GET_HW(unit) (&ANALOG_CMPR[unit])
#define ANALOG_CMPR_LL_GET_UNIT(hw) (0)
@@ -7,7 +7,7 @@
#include "hal/ana_cmpr_periph.h"
#include "soc/ana_cmpr_struct.h"
const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
const ana_cmpr_periph_t ana_cmpr_periph[2] = {
[0] = {
.src_gpio = ANA_CMPR0_SRC_GPIO,
.ext_ref_gpio = ANA_CMPR0_EXT_REF_GPIO,
@@ -22,7 +22,7 @@ const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM] = {
},
};
analog_cmpr_dev_t ANALOG_CMPR[SOC_ANA_CMPR_NUM] = {
analog_cmpr_dev_t ANALOG_CMPR[2] = {
[0] = {
.pad_comp_config = &LP_SYS.pad_comp[0],
.pad_comp_filter = &GPIO.zero_det_filter_cnt[0],
@@ -17,6 +17,15 @@
extern "C" {
#endif
#define ANALOG_CMPR_LL_GET(_attr) ANALOG_CMPR_LL_ ## _attr
#define ANALOG_CMPR_LL_SUPPORT(_feat) ANALOG_CMPR_LL_SUPPORT_ ## _feat
// Number of Analog Comparator instances
#define ANALOG_CMPR_LL_INST_NUM 2
// Can detect positive/negative/any cross type
#define ANALOG_CMPR_LL_SUPPORT_EDGE_TYPE 1
#define ANALOG_CMPR_LL_GET_HW(unit) (&ANALOG_CMPR[unit])
#define ANALOG_CMPR_LL_GET_UNIT(hw) ((hw) == (&ANALOG_CMPR[0]) ? 0 : 1)
@@ -11,6 +11,7 @@
#include "soc/interrupts.h"
#if SOC_ANA_CMPR_SUPPORTED
#include "soc/ana_cmpr_pins.h"
#include "hal/ana_cmpr_ll.h"
#endif
#ifdef __cplusplus
@@ -25,7 +26,7 @@ typedef struct {
const char *module_name;
} ana_cmpr_periph_t;
extern const ana_cmpr_periph_t ana_cmpr_periph[SOC_ANA_CMPR_NUM];
extern const ana_cmpr_periph_t ana_cmpr_periph[ANALOG_CMPR_LL_GET(INST_NUM)];
#endif
#ifdef __cplusplus
@@ -10,3 +10,6 @@
#define _GPIO_ETM_EVENT_CHANNELS_PER_GROUP 8
#define _GPIO_ETM_TASK_CHANNELS_PER_GROUP 8
// The GPIO interrupt is shared with the Analog Comparator unit
#define _GPIO_INTR_SHARED 1
@@ -10,3 +10,6 @@
#define _GPIO_ETM_EVENT_CHANNELS_PER_GROUP 8
#define _GPIO_ETM_TASK_CHANNELS_PER_GROUP 8
// The GPIO interrupt is shared with the Analog Comparator unit
#define _GPIO_INTR_SHARED 1
@@ -639,14 +639,6 @@ config SOC_ETM_SUPPORT_SLEEP_RETENTION
bool
default y
config SOC_ANA_CMPR_NUM
int
default 1
config SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
bool
default y
config SOC_ANA_CMPR_SUPPORT_ETM
bool
default y
@@ -266,8 +266,6 @@
#define SOC_ETM_SUPPORT_SLEEP_RETENTION 1
/*------------------------- Analog Comparator CAPS ---------------------------*/
#define SOC_ANA_CMPR_NUM (1U)
#define SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE (1) // Support positive/negative/any cross interrupt
#define SOC_ANA_CMPR_SUPPORT_ETM (1)
/*-------------------------- I2C CAPS ----------------------------------------*/
@@ -503,14 +503,6 @@ config SOC_RTCIO_WAKE_SUPPORTED
bool
default y
config SOC_ANA_CMPR_NUM
int
default 1
config SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
bool
default y
config SOC_ANA_CMPR_SUPPORT_ETM
bool
default y
@@ -216,8 +216,6 @@
#define SOC_RTCIO_WAKE_SUPPORTED 1
/*------------------------- Analog Comparator CAPS ---------------------------*/
#define SOC_ANA_CMPR_NUM (1U)
#define SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE (1) // Support positive/negative/any cross interrupt
#define SOC_ANA_CMPR_SUPPORT_ETM (1)
/*-------------------------- I2C CAPS ----------------------------------------*/
@@ -563,14 +563,6 @@ config SOC_ETM_SUPPORT_SLEEP_RETENTION
bool
default y
config SOC_ANA_CMPR_NUM
int
default 1
config SOC_ANA_CMPR_INTR_SHARE_WITH_GPIO
bool
default y
config SOC_I2C_NUM
int
default 2
@@ -382,7 +382,7 @@ typedef enum {
#define SOC_ANA_CMPR_CLKS {SOC_MOD_CLK_PLL_F48M, SOC_MOD_CLK_XTAL}
/**
* @brief Sigma Delta Modulator clock source
* @brief Analog Comparator clock source
*/
typedef enum {
ANA_CMPR_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL clock as the source clock */
@@ -258,10 +258,6 @@
/*-------------------------- ETM CAPS -----------------------------------*/
#define SOC_ETM_SUPPORT_SLEEP_RETENTION 1
/*------------------------- Analog Comparator CAPS ---------------------------*/
#define SOC_ANA_CMPR_NUM (1U)
#define SOC_ANA_CMPR_INTR_SHARE_WITH_GPIO (1)
/*-------------------------- I2C CAPS ----------------------------------------*/
#define SOC_I2C_NUM (2U)
#define SOC_HP_I2C_NUM (2U)
@@ -3,6 +3,10 @@
# using gen_soc_caps_kconfig.py, do not edit manually
#####################################################
config SOC_ANA_CMPR_SUPPORTED
bool
default y
config SOC_DEDICATED_GPIO_SUPPORTED
bool
default y
@@ -443,14 +447,6 @@ config SOC_RTCIO_HOLD_SUPPORTED
bool
default y
config SOC_ANA_CMPR_NUM
int
default 1
config SOC_ANA_CMPR_INTR_SHARE_WITH_GPIO
bool
default y
config SOC_I2C_NUM
int
default 2
@@ -0,0 +1,10 @@
/*
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*/
#pragma once
#define ANA_CMPR0_EXT_REF_GPIO 6 /*!< The GPIO that can be used as external reference voltage */
#define ANA_CMPR0_SRC_GPIO 7 /*!< The GPIO that used for inputting the source signal to compare */
@@ -204,6 +204,22 @@ typedef enum {
SDM_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F48M, /*!< Select PLL_F48M as the default clock choice */
} soc_periph_sdm_clk_src_t;
///////////////////////////////////////////////////Analog Comparator////////////////////////////////////////////////////
/**
* @brief Array initializer for all supported clock sources of Analog Comparator
*/
#define SOC_ANA_CMPR_CLKS {SOC_MOD_CLK_PLL_F48M, SOC_MOD_CLK_XTAL}
/**
* @brief Analog Comparator clock source
*/
typedef enum {
ANA_CMPR_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL clock as the source clock */
ANA_CMPR_CLK_SRC_PLL_F48M = SOC_MOD_CLK_PLL_F48M, /*!< Select PLL_F48M clock as the source clock */
ANA_CMPR_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F48M, /*!< Select PLL_F48M as the default clock choice */
} soc_periph_ana_cmpr_clk_src_t;
//////////////////////////////////////////////////GPIO Glitch Filter////////////////////////////////////////////////////
/**
@@ -24,7 +24,7 @@
/*-------------------------- COMMON CAPS ---------------------------------------*/
// #define SOC_ADC_SUPPORTED 1 //TODO: [ESP32H21] IDF-11589, IDF-11592
// #define SOC_ANA_CMPR_SUPPORTED 1
#define SOC_ANA_CMPR_SUPPORTED 1
#define SOC_DEDICATED_GPIO_SUPPORTED 1
#define SOC_UART_SUPPORTED 1
#define SOC_GDMA_SUPPORTED 1
@@ -237,10 +237,6 @@
#define SOC_RTCIO_PIN_COUNT (7U)
#define SOC_RTCIO_HOLD_SUPPORTED (1)
/*------------------------- Analog Comparator CAPS ---------------------------*/
#define SOC_ANA_CMPR_NUM (1U)
#define SOC_ANA_CMPR_INTR_SHARE_WITH_GPIO (1)
/*-------------------------- I2C CAPS ----------------------------------------*/
#define SOC_I2C_NUM (2U)
#define SOC_HP_I2C_NUM (2U)
@@ -575,20 +575,20 @@ typedef struct {
uint32_t reserved_000;
volatile gpio_sd_dev_t sigma_delta;
uint32_t reserved_018[16];
volatile gpio_ext_pad_comp_config_0_reg_t ext_pad_comp_config_0;
volatile gpio_ext_pad_comp_filter_0_reg_t ext_pad_comp_filter_0;
volatile gpio_ext_pad_comp_config_0_reg_t pad_comp_config;
volatile gpio_ext_pad_comp_filter_0_reg_t pad_comp_filter;
uint32_t reserved_060[30];
volatile gpio_glitch_filter_dev_t glitch_filter;
uint32_t reserved_0f8[8];
volatile gpio_etm_dev_t etm;
uint32_t reserved_170[24];
volatile gpio_ext_int_raw_reg_t ext_int_raw;
volatile gpio_ext_int_st_reg_t ext_int_st;
volatile gpio_ext_int_ena_reg_t ext_int_ena;
volatile gpio_ext_int_clr_reg_t ext_int_clr;
volatile gpio_ext_pin_ctrl_reg_t ext_pin_ctrl;
volatile gpio_ext_int_raw_reg_t int_raw;
volatile gpio_ext_int_st_reg_t int_st;
volatile gpio_ext_int_ena_reg_t int_ena;
volatile gpio_ext_int_clr_reg_t int_clr;
volatile gpio_ext_pin_ctrl_reg_t pin_ctrl;
uint32_t reserved_1e4[6];
volatile gpio_ext_version_reg_t ext_version;
volatile gpio_ext_version_reg_t version;
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
@@ -771,14 +771,6 @@ config SOC_ETM_SUPPORT_SLEEP_RETENTION
bool
default y
config SOC_ANA_CMPR_NUM
int
default 2
config SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE
bool
default y
config SOC_ANA_CMPR_SUPPORT_ETM
bool
default y
@@ -303,8 +303,6 @@
#define SOC_ETM_SUPPORT_SLEEP_RETENTION 1
/*------------------------- Analog Comparator CAPS ---------------------------*/
#define SOC_ANA_CMPR_NUM (2)
#define SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE (1) // Support positive/negative/any cross interrupt
#define SOC_ANA_CMPR_SUPPORT_ETM (1)
/*-------------------------- I2C CAPS ----------------------------------------*/
+10
View File
@@ -200,6 +200,14 @@ I3C_DOCS = [
'api-reference/peripherals/i3c_master.rst',
]
LEDC_DOCS = [
'api-reference/peripherals/ledc.rst',
]
GPTIMER_DOCS = [
'api-reference/peripherals/gptimer.rst',
]
CORDIC_DOCS = ['api-reference/peripherals/cordic.rst']
SPI_DOCS = [
@@ -376,6 +384,8 @@ conditional_include_dict = {
'SOC_TWAI_SUPPORTED': TWAI_DOCS,
'SOC_I2C_SUPPORTED': I2C_DOCS,
'SOC_I3C_MASTER_SUPPORTED': I3C_DOCS,
'SOC_LEDC_SUPPORTED': LEDC_DOCS,
'SOC_GPTIMER_SUPPORTED': GPTIMER_DOCS,
'SOC_GPSPI_SUPPORTED': SPI_DOCS,
'SOC_I2S_SUPPORTED': I2S_DOCS,
'SOC_LP_I2S_SUPPORTED': LP_I2S_DOCS,
-4
View File
@@ -102,20 +102,16 @@ api-reference/bluetooth/classic_bt.rst
api-reference/bluetooth/esp_a2dp.rst
api-reference/bluetooth/esp_hf_defs.rst
api-reference/peripherals/cap_touch_sens.rst
api-reference/peripherals/index.rst
api-reference/peripherals/sdio_slave.rst
api-reference/peripherals/temp_sensor.rst
api-reference/peripherals/camera_driver.rst
api-reference/peripherals/adc_oneshot.rst
api-reference/peripherals/sdspi_share.rst
api-reference/peripherals/ana_cmpr.rst
api-reference/peripherals/adc_continuous.rst
api-reference/peripherals/sdspi_host.rst
api-reference/peripherals/vad.rst
api-reference/peripherals/isp.rst
api-reference/peripherals/parlio.rst
api-reference/peripherals/adc_calibration.rst
api-reference/peripherals/lp_i2s.rst
api-reference/peripherals/spi_flash/index.rst
api-reference/peripherals/spi_flash/spi_flash_concurrency.rst
api-reference/peripherals/spi_flash/spi_flash_override_driver.rst
@@ -3,8 +3,9 @@ Analog Comparator
:link_to_translation:`zh_CN:[中文]`
{IDF_TARGET_ANA_CMPR_SRC_CHAN0: default="NOT UPDATED", esp32h2="GPIO11", esp32p4="GPIO52", esp32c5="GPIO9", esp32c61="GPIO9"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN0: default="NOT UPDATED", esp32h2="GPIO10", esp32p4="GPIO51", esp32c5="GPIO8", esp32c61="GPIO8"}
{IDF_TARGET_ANA_CMPR_UNITS: default="1", esp32p4="2"}
{IDF_TARGET_ANA_CMPR_SRC_CHAN0: default="NOT UPDATED", esp32h2="GPIO11", esp32p4="GPIO52", esp32c5="GPIO9", esp32c61="GPIO9", esp32h21="GPIO7"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN0: default="NOT UPDATED", esp32h2="GPIO10", esp32p4="GPIO51", esp32c5="GPIO8", esp32c61="GPIO8", esp32h21="GPIO6"}
{IDF_TARGET_ANA_CMPR_SRC_CHAN1: default="NOT UPDATED", esp32p4="GPIO54"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN1: default="NOT UPDATED", esp32p4="GPIO53"}
@@ -15,7 +16,7 @@ Analog comparator is a peripheral that can be used to compare a source signal wi
Under the scenario of comparing the analog signals, the integrated analog comparator is a cost effective scheme to replace an operational amplifier. But unlike the continuous comparing of the operational amplifier, ESP analog comparator is driven by a source clock, which decides the sampling frequency.
Analog comparator on {IDF_TARGET_NAME} has {IDF_TARGET_SOC_ANA_CMPR_NUM} unit(s), the channels in the unit(s) are:
Analog comparator on {IDF_TARGET_NAME} has {IDF_TARGET_ANA_CMPR_UNITS} unit(s), the channels in the unit(s) are:
**UNIT0**
+3 -3
View File
@@ -18,7 +18,7 @@ Peripherals API
:SOC_ECDSA_SUPPORTED: ecdsa
:SOC_ETM_SUPPORTED: etm
gpio
gptimer
:SOC_GPTIMER_SUPPORTED: gptimer
:SOC_DEDICATED_GPIO_SUPPORTED: dedic_gpio
:SOC_HMAC_SUPPORTED: hmac
:SOC_DIG_SIGN_SUPPORTED: ds
@@ -30,7 +30,7 @@ Peripherals API
:SOC_KEY_MANAGER_SUPPORTED: key_manager
lcd/index
:SOC_GP_LDO_SUPPORTED: ldo_regulator
ledc
:SOC_LEDC_SUPPORTED: ledc
:SOC_MCPWM_SUPPORTED: mcpwm
:SOC_PARLIO_SUPPORTED: parlio/index
:SOC_PCNT_SUPPORTED: pcnt
@@ -50,7 +50,7 @@ Peripherals API
:SOC_TEMP_SENSOR_SUPPORTED: temp_sensor
:SOC_TOUCH_SENSOR_SUPPORTED: cap_touch_sens
:SOC_TWAI_SUPPORTED: twai
uart
:SOC_UART_SUPPORTED: uart
:SOC_USB_OTG_SUPPORTED: USB Device Stack <https://docs.espressif.com/projects/esp-usb/en/latest/{IDF_TARGET_PATH_NAME}/usb_device.html>
:SOC_USB_OTG_SUPPORTED: USB Host <https://docs.espressif.com/projects/esp-usb/en/latest/{IDF_TARGET_PATH_NAME}/usb_host.html>
@@ -3,10 +3,11 @@
:link_to_translation:`en:[English]`
{IDF_TARGET_ANA_CMPR_SRC_CHAN0: default="未更新", esp32h2="GPIO11", esp32p4="GPIO52", esp32c5="GPIO9", esp32c61="GPIO9"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN0: default="未更新", esp32h2="GPIO10", esp32p4="GPIO51", esp32c5="GPIO8", esp32c61="GPIO8"}
{IDF_TARGET_ANA_CMPR_SRC_CHAN1: default="未更新", esp32p4="GPIO54"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN1: default="未更新", esp32p4="GPIO53"}
{IDF_TARGET_ANA_CMPR_UNITS: default="1", esp32p4="2"}
{IDF_TARGET_ANA_CMPR_SRC_CHAN0: default="NOT UPDATED", esp32h2="GPIO11", esp32p4="GPIO52", esp32c5="GPIO9", esp32c61="GPIO9", esp32h21="GPIO7"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN0: default="NOT UPDATED", esp32h2="GPIO10", esp32p4="GPIO51", esp32c5="GPIO8", esp32c61="GPIO8", esp32h21="GPIO6"}
{IDF_TARGET_ANA_CMPR_SRC_CHAN1: default="NOT UPDATED", esp32p4="GPIO54"}
{IDF_TARGET_ANA_CMPR_EXT_REF_CHAN1: default="NOT UPDATED", esp32p4="GPIO53"}
简介
----
@@ -15,7 +16,7 @@
当用于比较模拟信号时,集成模拟比较器可以低成本替代运算放大器。不同于运算放大器的连续比较,ESP 模拟比较器由时钟源驱动,其采样频率取决于时钟的频率。
{IDF_TARGET_NAME} 上的模拟比较器有 {IDF_TARGET_SOC_ANA_CMPR_NUM} 个单元,单元中的通道如下:
{IDF_TARGET_NAME} 上的模拟比较器有 {IDF_TARGET_ANA_CMPR_UNITS} 个单元,单元中的通道如下:
**UNIT0**
@@ -18,7 +18,7 @@
:SOC_ECDSA_SUPPORTED: ecdsa
:SOC_ETM_SUPPORTED: etm
gpio
gptimer
:SOC_GPTIMER_SUPPORTED: gptimer
:SOC_DEDICATED_GPIO_SUPPORTED: dedic_gpio
:SOC_HMAC_SUPPORTED: hmac
:SOC_DIG_SIGN_SUPPORTED: ds
@@ -30,7 +30,7 @@
:SOC_KEY_MANAGER_SUPPORTED: key_manager
lcd/index
:SOC_GP_LDO_SUPPORTED: ldo_regulator
ledc
:SOC_LEDC_SUPPORTED: ledc
:SOC_MCPWM_SUPPORTED: mcpwm
:SOC_PARLIO_SUPPORTED: parlio/index
:SOC_PCNT_SUPPORTED: pcnt
@@ -50,7 +50,7 @@
:SOC_TEMP_SENSOR_SUPPORTED: temp_sensor
:SOC_TOUCH_SENSOR_SUPPORTED: cap_touch_sens
:SOC_TWAI_SUPPORTED: twai
uart
:SOC_UART_SUPPORTED: uart
:SOC_USB_OTG_SUPPORTED: USB 设备栈 <https://docs.espressif.com/projects/esp-usb/zh_CN/latest/{IDF_TARGET_PATH_NAME}/usb_device.html>
:SOC_USB_OTG_SUPPORTED: USB 主机 <https://docs.espressif.com/projects/esp-usb/zh_CN/latest/{IDF_TARGET_PATH_NAME}/usb_host.html>
@@ -1,5 +1,5 @@
| Supported Targets | ESP32-C5 | ESP32-C61 | ESP32-H2 | ESP32-P4 |
| ----------------- | -------- | --------- | -------- | -------- |
| Supported Targets | ESP32-C5 | ESP32-C61 | ESP32-H2 | ESP32-H21 | ESP32-P4 |
| ----------------- | -------- | --------- | -------- | --------- | -------- |
# Analog Comparator Example
@@ -19,7 +19,7 @@ This example is going to show how to use the Analog Comparator. The example togg
* A development board with any supported Espressif SOC chip (see `Supported Targets` table above)
* A USB cable for power supply and programming
* A device to generate the source signal. For example, you can use a ESP SoC that support DAC peripheral (like ESP32 or ESP32S2) to generate source signal, or just use a signal generator.
* A signal generator for generating the source signal
#### Required Additionally for External Reference
@@ -27,30 +27,26 @@ This example is going to show how to use the Analog Comparator. The example togg
### Example Connection
Let's take ESP32-H2 and ESP32 for example, and we use the DAC on ESP32 as the signal generator (you can use a real signal generator instead if you have one).
#### Internal Reference
Download this example into ESP32-H2 and any DAC examples in `examples/peripherals/dac` directory into ESP32.
```
┌──────────────┐ ┌──────────────┐
ESP32-H2 │ ESP32
source signal
┌────┤GPIO0 GPIO11│◄────┬──────────┤GPIO25
│ │ │ │ │ │
GND├─────┼────┬─────┤GND
│ │ │ │ │ │ │
│ └──────────────┘ │ │ └──────────────┘
│ │ │
│ ┌──────────────┐ │ │
Oscilloscope
│ │ │ │ │
└───►│Probe1 Probe2│◄────┘
│ │ │
GND├──────────┘
│ │
└──────────────┘
+--------------+ +--------------+
| ESP Board | | Signal Gen |
| | source signal | |
+----+GPIO Src In|<----+----------+OUT |
| | | | | |
| | GND+-----+----+-----+GND |
| | | | | | |
| +--------------+ | | +--------------+
| | |
| +--------------+ | |
| | Oscilloscope | | |
| | | | |
+--->|Probe1 Probe2|<----+ |
| | |
| GND+----------+
| |
+--------------+
```
#### External Reference
@@ -58,55 +54,29 @@ Download this example into ESP32-H2 and any DAC examples in `examples/peripheral
For the static external reference, we can use resistor divider to get the static voltage.
```
┌──────────────┐ ┌──────────────┐
ESP32-H2 │ ESP32
source signal
┌────┤GPIO0 GPIO11│◄────┬──────────┤GPIO25
refsignal
GPIO10│◄────┼──────┐ ┌─┤GND
│ │ │ │ │ │ │ │
GND├─────┼─┬────┼─┘ └──────────────┘
│ │ VDD
│ └──────────────┘ │ │ │ ─┬─
│ │ │ │ │
│ │ │ │ ├┐
┌──────────────┐ │ │ ││R1
Oscilloscope │ │ ├┘
│ │ │ │ │ └──────────┤
└───►│Probe1 Probe2│◄────┘ │
│ │ │ ├┐
GND├───────┤ ││R2
│ │ │ ├┘
└──────────────┘ │ │
└───────────────┤
─┴─
GND
```
Also, we can generate a different signal on another DAC channel on ESP32, you can customize your DAC wave using `examples/peripherals/dac/dac_continuous/signal_generator` example.
```
┌──────────────┐ ┌──────────────┐
│ ESP32-H2 │ │ ESP32 │
│ │ source signal │ │
┌────┤GPIO0 GPIO11│◄────┬──────────┤GPIO25 │
│ │ │ ref│signal │ │
│ │ GPIO10│◄────┼──────────┤GPIO26 │
│ │ │ │ │ │
│ │ GND├─────┼───┬──────┤GND │
│ │ │ │ │ │ │
│ └──────────────┘ │ │ └──────────────┘
│ │ │
│ │ │
│ ┌──────────────┐ │ │
│ │ Oscilloscope │ │ │
│ │ │ │ │
└───►│Probe1 Probe2│◄────┘ │
│ │ │
│ GND├─────────┘
│ │
└──────────────┘
+--------------+ +--------------+
| ESP Board | | Signal Gen |
| | source signal | |
+----+GPIO Src In|<----+----------+OUT |
| | | ref|signal | |
| | Ref In|<----+------+ +-+GND |
| | | | | | | |
| | GND+-----+-+----+-+ +--------------+
| | | | | | VDD
| +--------------+ | | | -+-
| | | | |
| | | | ++
| +--------------+ | | | ||R1
| | Oscilloscope | | | | ++
| | | | | +----------+
+--->|Probe1 Probe2|<----+ | |
| | | ++
| GND+-------+ ||R2
| | | ++
+--------------+ | |
+---------------+
|
-+-
```
### Configure the Project
@@ -34,7 +34,8 @@ void example_init_monitor_gpio(void);
* CPU won't be involved by using Event Task Matrix, so it can achieve relatively higher interrupt frequency
*/
void example_analog_comparator_etm_app(void);
#endif
#else
/**
* @brief Set or clear the monitor GPIO in the cross interrupt callback.
@@ -43,6 +44,7 @@ void example_analog_comparator_etm_app(void);
* But as the operations are done in callback, CPU is involved, so it can only achieve a low interrupt frequency
*/
void example_analog_comparator_intr_app(void);
#endif
#ifdef __cplusplus
}