From 5a3eda65df06b79d0134661377c5c549f1506f3c Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Wed, 27 Aug 2025 19:47:04 +0800 Subject: [PATCH 1/4] fix(uart): fix -Wunused-parameter warning with uart.h --- components/esp_driver_uart/include/driver/uart.h | 1 + 1 file changed, 1 insertion(+) diff --git a/components/esp_driver_uart/include/driver/uart.h b/components/esp_driver_uart/include/driver/uart.h index 17f2aa13858..f13ca653c84 100644 --- a/components/esp_driver_uart/include/driver/uart.h +++ b/components/esp_driver_uart/include/driver/uart.h @@ -397,6 +397,7 @@ static inline esp_err_t _uart_set_pin4(uart_port_t uart_num, int tx_io_num, int // Error function for invalid argument count static inline esp_err_t __uart_set_pin_invalid_args__(int dummy, ...) { + (void)dummy; ESP_RETURN_ON_FALSE(false, ESP_FAIL, "uart", "Invalid number of arguments to uart_set_pin(). Expected 5 or 7 arguments."); return ESP_OK; } From 4fb40fa91a3e0fd973d9f1827471bc9452ce1f16 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Wed, 27 Aug 2025 19:55:25 +0800 Subject: [PATCH 2/4] fix(console): wrong uart console pin info when UART console is not used --- components/esp_system/port/cpu_start.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index 66f07141ee0..2f8e202e8c9 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -793,7 +793,6 @@ NOINLINE_ATTR static void system_early_init(const soc_reset_reason_t *rst_reas) esp_rom_output_tx_wait_idle(CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM); _uart_ll_set_baudrate(UART_LL_GET_HW(CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM), CONFIG_ESP_CONSOLE_UART_BAUDRATE, clock_hz); -#endif int console_uart_tx_pin = U0TXD_GPIO_NUM; int console_uart_rx_pin = U0RXD_GPIO_NUM; #if CONFIG_ESP_CONSOLE_UART_CUSTOM @@ -801,7 +800,8 @@ NOINLINE_ATTR static void system_early_init(const soc_reset_reason_t *rst_reas) console_uart_rx_pin = (CONFIG_ESP_CONSOLE_UART_RX_GPIO >= 0) ? CONFIG_ESP_CONSOLE_UART_RX_GPIO : U0RXD_GPIO_NUM; #endif ESP_EARLY_LOGI(TAG, "GPIO %d and %d are used as console UART I/O pins", console_uart_rx_pin, console_uart_tx_pin); -#endif +#endif // CONFIG_ESP_CONSOLE_UART +#endif // !CONFIG_IDF_ENV_FPGA #if SOC_DEEP_SLEEP_SUPPORTED // Need to unhold the IOs that were hold right before entering deep sleep, which are used as wakeup pins From 21237012e6ad7954b55aa4678122f616f8f4d23c Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Wed, 24 Sep 2025 20:46:05 +0800 Subject: [PATCH 3/4] change(example/ledc): add power management support for the example Closes https://github.com/espressif/esp-idf/issues/17517 --- .../ledc/ledc_basic/main/CMakeLists.txt | 2 +- .../ledc_basic/main/ledc_basic_example_main.c | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt b/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt index df8f8fae0c9..b8004437868 100644 --- a/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt +++ b/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt @@ -1,3 +1,3 @@ idf_component_register(SRCS "ledc_basic_example_main.c" - PRIV_REQUIRES esp_driver_ledc esp_driver_gpio + PRIV_REQUIRES esp_driver_ledc esp_driver_gpio esp_pm INCLUDE_DIRS ".") diff --git a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c index 02cdebccad6..3ad8c473e2c 100644 --- a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c +++ b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c @@ -9,6 +9,8 @@ #include #include "driver/ledc.h" #include "esp_err.h" +#include "sdkconfig.h" +#include "esp_pm.h" #define LEDC_TIMER LEDC_TIMER_0 #define LEDC_MODE LEDC_LOW_SPEED_MODE @@ -16,7 +18,13 @@ #define LEDC_CHANNEL LEDC_CHANNEL_0 #define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits #define LEDC_DUTY (4096) // Set duty to 50%. (2 ** 13) * 50% = 4096 +#if CONFIG_PM_ENABLE +#define LEDC_CLK_SRC LEDC_USE_RC_FAST_CLK // choose a clock source that can maintain during light sleep +#define LEDC_FREQUENCY (400) // Frequency in Hertz. Set frequency at 400 Hz +#else +#define LEDC_CLK_SRC LEDC_AUTO_CLK #define LEDC_FREQUENCY (4000) // Frequency in Hertz. Set frequency at 4 kHz +#endif /* Warning: * For ESP32, ESP32S2, ESP32S3, ESP32C3, ESP32C2, ESP32C6, ESP32H2 (rev < 1.2), ESP32P4 (rev < 3.0) targets, @@ -32,7 +40,7 @@ static void example_ledc_init(void) .duty_resolution = LEDC_DUTY_RES, .timer_num = LEDC_TIMER, .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz - .clk_cfg = LEDC_AUTO_CLK + .clk_cfg = LEDC_CLK_SRC, }; ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); @@ -44,13 +52,26 @@ static void example_ledc_init(void) .intr_type = LEDC_INTR_DISABLE, .gpio_num = LEDC_OUTPUT_IO, .duty = 0, // Set duty to 0% - .hpoint = 0 + .hpoint = 0, +#if CONFIG_PM_ENABLE + .sleep_mode = LEDC_SLEEP_MODE_KEEP_ALIVE, +#endif }; ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); } void app_main(void) { +#if CONFIG_PM_ENABLE + esp_pm_config_t pm_config = { + .max_freq_mhz = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ, + .min_freq_mhz = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ, +#if CONFIG_FREERTOS_USE_TICKLESS_IDLE + .light_sleep_enable = true +#endif + }; + ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); +#endif // Set the LEDC peripheral configuration example_ledc_init(); // Set duty to 50% From cc3577e31a332c2e5b13b958d5148111f7ad2329 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Tue, 26 Aug 2025 20:11:16 +0800 Subject: [PATCH 4/4] feat(ledc): add ETM support for LEDC peripheral Closes https://github.com/espressif/esp-idf/issues/11855 --- components/esp_driver_ledc/CMakeLists.txt | 4 + .../esp_driver_ledc/include/driver/ledc.h | 20 ++ .../esp_driver_ledc/include/driver/ledc_etm.h | 115 +++++++++++ components/esp_driver_ledc/src/ledc.c | 16 ++ components/esp_driver_ledc/src/ledc_etm.c | 154 ++++++++++++++ .../test_apps/ledc/main/CMakeLists.txt | 4 + .../test_apps/ledc/main/test_ledc_etm.cpp | 72 +++++++ .../etm/include/esp_private/etm_interface.h | 1 + components/hal/esp32c2/include/hal/ledc_ll.h | 48 +++++ components/hal/esp32c3/include/hal/ledc_ll.h | 48 +++++ components/hal/esp32c5/include/hal/ledc_ll.h | 155 ++++++++++++++ components/hal/esp32c6/include/hal/ledc_ll.h | 155 ++++++++++++++ components/hal/esp32c61/include/hal/ledc_ll.h | 157 +++++++++++++++ components/hal/esp32h2/include/hal/ledc_ll.h | 155 ++++++++++++++ components/hal/esp32h21/include/hal/ledc_ll.h | 157 +++++++++++++++ components/hal/esp32h4/include/hal/ledc_ll.h | 157 +++++++++++++++ components/hal/esp32p4/include/hal/ledc_ll.h | 189 ++++++++++++++++-- components/hal/esp32s2/include/hal/ledc_ll.h | 48 +++++ components/hal/esp32s3/include/hal/ledc_ll.h | 48 +++++ components/hal/include/hal/ledc_hal.h | 15 +- components/hal/include/hal/ledc_types.h | 52 ++++- components/hal/ledc_hal.c | 15 +- .../esp32c5/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32c5/include/soc/soc_caps.h | 1 + .../esp32c6/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32c6/include/soc/soc_caps.h | 1 + .../esp32c61/include/soc/Kconfig.soc_caps.in | 4 + .../soc/esp32c61/include/soc/soc_caps.h | 1 + .../esp32h2/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32h2/include/soc/soc_caps.h | 1 + .../esp32h21/include/soc/Kconfig.soc_caps.in | 4 + .../soc/esp32h21/include/soc/soc_caps.h | 1 + .../esp32h4/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32h4/include/soc/soc_caps.h | 1 + .../esp32p4/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32p4/include/soc/soc_caps.h | 1 + docs/doxygen/Doxyfile | 1 + docs/en/api-reference/peripherals/etm.rst | 2 + docs/en/api-reference/peripherals/ledc.rst | 20 ++ docs/zh_CN/api-reference/peripherals/etm.rst | 2 + docs/zh_CN/api-reference/peripherals/ledc.rst | 20 ++ examples/peripherals/.build-test-rules.yml | 6 + .../ledc_basic/main/ledc_basic_example_main.c | 1 - .../ledc/ledc_dimmer/CMakeLists.txt | 8 + .../peripherals/ledc/ledc_dimmer/README.md | 63 ++++++ .../image/ac_lamp_dimmer_triac.png | Bin 0 -> 87682 bytes .../ledc/ledc_dimmer/image/timing_diagram.png | Bin 0 -> 156045 bytes .../ledc/ledc_dimmer/main/CMakeLists.txt | 3 + .../main/ledc_dimmer_example_main.c | 145 ++++++++++++++ 49 files changed, 2070 insertions(+), 21 deletions(-) create mode 100644 components/esp_driver_ledc/include/driver/ledc_etm.h create mode 100644 components/esp_driver_ledc/src/ledc_etm.c create mode 100644 components/esp_driver_ledc/test_apps/ledc/main/test_ledc_etm.cpp create mode 100644 examples/peripherals/ledc/ledc_dimmer/CMakeLists.txt create mode 100644 examples/peripherals/ledc/ledc_dimmer/README.md create mode 100644 examples/peripherals/ledc/ledc_dimmer/image/ac_lamp_dimmer_triac.png create mode 100644 examples/peripherals/ledc/ledc_dimmer/image/timing_diagram.png create mode 100644 examples/peripherals/ledc/ledc_dimmer/main/CMakeLists.txt create mode 100644 examples/peripherals/ledc/ledc_dimmer/main/ledc_dimmer_example_main.c diff --git a/components/esp_driver_ledc/CMakeLists.txt b/components/esp_driver_ledc/CMakeLists.txt index e16690efab4..41b3ca9a9df 100644 --- a/components/esp_driver_ledc/CMakeLists.txt +++ b/components/esp_driver_ledc/CMakeLists.txt @@ -5,6 +5,10 @@ set(public_include "include") if(CONFIG_SOC_LEDC_SUPPORTED) list(APPEND srcs "src/ledc.c") + + if(CONFIG_SOC_ETM_SUPPORTED AND CONFIG_SOC_LEDC_SUPPORT_ETM) + list(APPEND srcs "src/ledc_etm.c") + endif() endif() if(${target} STREQUAL "linux") diff --git a/components/esp_driver_ledc/include/driver/ledc.h b/components/esp_driver_ledc/include/driver/ledc.h index 07d12116843..4ce85c0f50d 100644 --- a/components/esp_driver_ledc/include/driver/ledc.h +++ b/components/esp_driver_ledc/include/driver/ledc.h @@ -8,6 +8,7 @@ #include "esp_err.h" #include "esp_intr_alloc.h" +#include "driver/ledc_etm.h" #include "hal/ledc_types.h" #ifdef __cplusplus @@ -385,6 +386,25 @@ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, ledc_timer_t timer_sel); */ esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_timer_t timer_sel); +#if SOC_LEDC_SUPPORT_ETM +/** + * @brief Configure the maximum timer overflow times for the LEDC channel to be used to trigger `LEDC_ETM_EVENT_CHANNEL_REACH_MAX_OVF_CNT` ETM event + * + * When the overflow counter maximum value is re-configured, the counter will also be reset. + * Timer can be paused before calling this API by calling `ledc_timer_pause()`, and resumed afterwards by calling `ledc_timer_resume()`. + * + * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param max_ovf_cnt The timer overflow counter maximum value. To disable the timer overflow count, set this parameter to 0. + * + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE Channel not initialized + * - ESP_OK Success + */ +esp_err_t ledc_channel_configure_maximum_timer_ovf_cnt(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt); +#endif + /** * @brief Set LEDC fade function. * diff --git a/components/esp_driver_ledc/include/driver/ledc_etm.h b/components/esp_driver_ledc/include/driver/ledc_etm.h new file mode 100644 index 00000000000..2aa72521aaa --- /dev/null +++ b/components/esp_driver_ledc/include/driver/ledc_etm.h @@ -0,0 +1,115 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_err.h" +#include "esp_etm.h" +#include "hal/ledc_types.h" +#include "soc/soc_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if SOC_LEDC_SUPPORT_ETM + +/** + * @brief LEDC timer ETM event configuration + */ +typedef struct { + ledc_timer_etm_event_type_t event_type; /*!< LEDC timer ETM event type */ +} ledc_timer_etm_event_config_t; + +/** + * @brief LEDC channel ETM event configuration + */ +typedef struct { + ledc_channel_etm_event_type_t event_type; /*!< LEDC channel ETM event type */ +} ledc_channel_etm_event_config_t; + +/** + * @brief Get the ETM timer event for LEDC + * + * @note The created ETM event object can be deleted later by calling `esp_etm_del_event` + * + * @param[in] speed_mode Select the LEDC channel group with specified speed mode + * @param[in] timer_sel LEDC timer index, select from ledc_timer_t + * @param[in] config LEDC timer ETM event configuration + * @param[out] out_event Returned ETM event handle + * @return + * - ESP_OK: Get ETM event successfully + * - ESP_ERR_INVALID_ARG: Get ETM event failed because of invalid argument + * - ESP_ERR_NO_MEM: Get ETM event failed because of no memory + */ +esp_err_t ledc_timer_new_etm_event(ledc_mode_t speed_mode, ledc_timer_t timer_sel, const ledc_timer_etm_event_config_t *config, esp_etm_event_handle_t *out_event); + +/** + * @brief Get the ETM channel event for LEDC + * + * @note The created ETM event object can be deleted later by calling `esp_etm_del_event` + * + * @param[in] speed_mode Select the LEDC channel group with specified speed mode + * @param[in] channel LEDC channel index, select from ledc_channel_t + * @param[in] config LEDC channel ETM event configuration + * @param[out] out_event Returned ETM event handle + * @return + * - ESP_OK: Get ETM event successfully + * - ESP_ERR_INVALID_ARG: Get ETM event failed because of invalid argument + * - ESP_ERR_NO_MEM: Get ETM event failed because of no memory + */ +esp_err_t ledc_channel_new_etm_event(ledc_mode_t speed_mode, ledc_channel_t channel, const ledc_channel_etm_event_config_t *config, esp_etm_event_handle_t *out_event); + +/** + * @brief LEDC timer ETM task configuration + */ +typedef struct { + ledc_timer_etm_task_type_t task_type; /*!< LEDC timer ETM task type */ +} ledc_timer_etm_task_config_t; + +/** + * @brief LEDC channel ETM task configuration + */ +typedef struct { + ledc_channel_etm_task_type_t task_type; /*!< LEDC channel ETM task type */ +} ledc_channel_etm_task_config_t; + +/** + * @brief Get the ETM timer task for LEDC + * + * @note The created ETM task object can be deleted later by calling `esp_etm_del_task` + * + * @param[in] speed_mode Select the LEDC channel group with specified speed mode + * @param[in] timer_sel LEDC timer index, select from ledc_timer_t + * @param[in] config LEDC timer ETM task configuration + * @param[out] out_task Returned ETM task handle + * @return + * - ESP_OK: Get ETM task successfully + * - ESP_ERR_INVALID_ARG: Get ETM task failed because of invalid argument + * - ESP_ERR_NO_MEM: Get ETM task failed because of no memory + */ +esp_err_t ledc_timer_new_etm_task(ledc_mode_t speed_mode, ledc_timer_t timer_sel, const ledc_timer_etm_task_config_t *config, esp_etm_task_handle_t *out_task); + +/** + * @brief Get the ETM channel task for LEDC + * + * @note The created ETM task object can be deleted later by calling `esp_etm_del_task` + * + * @param[in] speed_mode Select the LEDC channel group with specified speed mode + * @param[in] channel LEDC channel index, select from ledc_channel_t + * @param[in] config LEDC channel ETM task configuration + * @param[out] out_task Returned ETM task handle + * @return + * - ESP_OK: Get ETM task successfully + * - ESP_ERR_INVALID_ARG: Get ETM task failed because of invalid argument + * - ESP_ERR_NO_MEM: Get ETM task failed because of no memory + */ +esp_err_t ledc_channel_new_etm_task(ledc_mode_t speed_mode, ledc_channel_t channel, const ledc_channel_etm_task_config_t *config, esp_etm_task_handle_t *out_task); + +#endif // SOC_LEDC_SUPPORT_ETM +#ifdef __cplusplus +} +#endif diff --git a/components/esp_driver_ledc/src/ledc.c b/components/esp_driver_ledc/src/ledc.c index 04bada46c87..4f72be70c94 100644 --- a/components/esp_driver_ledc/src/ledc.c +++ b/components/esp_driver_ledc/src/ledc.c @@ -277,6 +277,7 @@ static IRAM_ATTR esp_err_t ledc_duty_config(ledc_mode_t speed_mode, ledc_channel // Clear left-off LEDC gamma ram registers, random data in ram could cause output waveform error ledc_hal_clear_left_off_fade_param(&(p_ledc_obj[speed_mode]->ledc_hal), channel, 1); #endif + ESP_EARLY_LOGD(LEDC_TAG, "duty_config: duty-%d, dir-%d, cycle-%d, scale-%d, step-%d", duty_val, duty_direction, duty_cycle, duty_scale, duty_num); return ESP_OK; } @@ -392,6 +393,21 @@ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, ledc_timer_t timer_sel) return ESP_OK; } +#if SOC_LEDC_SUPPORT_ETM +esp_err_t ledc_channel_configure_maximum_timer_ovf_cnt(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + LEDC_ARG_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "speed_mode"); + LEDC_ARG_CHECK(channel < LEDC_CHANNEL_MAX, "channel"); + LEDC_ARG_CHECK(max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX, "max_ovf_cnt"); + LEDC_CHECK(p_ledc_obj[speed_mode] != NULL, LEDC_NOT_INIT, ESP_ERR_INVALID_STATE); + + ledc_hal_channel_configure_maximum_timer_ovf_cnt(&(p_ledc_obj[speed_mode]->ledc_hal), channel, max_ovf_cnt); + ledc_ls_channel_update(speed_mode, channel); + + return ESP_OK; +} +#endif + esp_err_t ledc_isr_register(void (*fn)(void *), void *arg, int intr_alloc_flags, ledc_isr_handle_t *handle) { esp_err_t ret; diff --git a/components/esp_driver_ledc/src/ledc_etm.c b/components/esp_driver_ledc/src/ledc_etm.c new file mode 100644 index 00000000000..971c289ba6c --- /dev/null +++ b/components/esp_driver_ledc/src/ledc_etm.c @@ -0,0 +1,154 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "freertos/FreeRTOS.h" +#include "esp_check.h" +#include "driver/ledc.h" +#include "esp_private/etm_interface.h" +#include "esp_heap_caps.h" +#include "hal/ledc_ll.h" + +#define TAG "ledc_etm" + +typedef struct { + union { + esp_etm_event_t evt_base; + esp_etm_task_t task_base; + }; + ledc_mode_t speed_mode; + volatile uint32_t *en_reg_addr; + uint32_t en_bit; +} ledc_etm_event_task_t; + +static portMUX_TYPE s_ledc_etm_spinlock = portMUX_INITIALIZER_UNLOCKED; + +static esp_err_t ledc_del_etm_event(esp_etm_event_t *event) +{ + ledc_etm_event_task_t *etm_event = __containerof(event, ledc_etm_event_task_t, evt_base); + + if (etm_event->en_reg_addr != 0) { + portENTER_CRITICAL(&s_ledc_etm_spinlock); + ledc_ll_etm_enable_evt_task(LEDC_LL_GET_HW(), etm_event->speed_mode, etm_event->en_reg_addr, etm_event->en_bit, false); + portEXIT_CRITICAL(&s_ledc_etm_spinlock); + } + + free(etm_event); + return ESP_OK; +} + +static esp_err_t ledc_del_etm_task(esp_etm_task_t *task) +{ + ledc_etm_event_task_t *etm_task = __containerof(task, ledc_etm_event_task_t, task_base); + + if (etm_task->en_reg_addr != 0) { + portENTER_CRITICAL(&s_ledc_etm_spinlock); + ledc_ll_etm_enable_evt_task(LEDC_LL_GET_HW(), etm_task->speed_mode, etm_task->en_reg_addr, etm_task->en_bit, false); + portEXIT_CRITICAL(&s_ledc_etm_spinlock); + } + + free(etm_task); + return ESP_OK; +} + +esp_err_t ledc_timer_new_etm_event(ledc_mode_t speed_mode, ledc_timer_t timer_sel, const ledc_timer_etm_event_config_t *config, esp_etm_event_handle_t *out_event) +{ + ESP_RETURN_ON_FALSE(speed_mode < LEDC_SPEED_MODE_MAX && timer_sel < LEDC_TIMER_MAX && config && config->event_type < LEDC_TIMER_ETM_EVENT_MAX && out_event, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + + ledc_etm_event_task_t *event = heap_caps_calloc(1, sizeof(ledc_etm_event_task_t), MALLOC_CAP_DEFAULT); + ESP_RETURN_ON_FALSE(event, ESP_ERR_NO_MEM, TAG, "no memory for ETM event"); + + uint32_t evt_id = LEDC_LL_ETM_TIMER_EVENT_ID(speed_mode, timer_sel, config->event_type); + volatile uint32_t *en_reg = LEDC_LL_ETM_TIMER_EVENT_EN_REG(speed_mode, config->event_type); + uint32_t en_bit = LEDC_LL_ETM_TIMER_EVENT_EN_BIT(speed_mode, timer_sel, config->event_type); + + portENTER_CRITICAL(&s_ledc_etm_spinlock); + ledc_ll_etm_enable_evt_task(LEDC_LL_GET_HW(), speed_mode, en_reg, en_bit, true); + portEXIT_CRITICAL(&s_ledc_etm_spinlock); + event->speed_mode = speed_mode; + event->en_reg_addr = en_reg; + event->en_bit = en_bit; + event->evt_base.event_id = evt_id; + event->evt_base.trig_periph = ETM_TRIG_PERIPH_LEDC; + event->evt_base.del = ledc_del_etm_event; + + *out_event = &event->evt_base; + return ESP_OK; +} + +esp_err_t ledc_channel_new_etm_event(ledc_mode_t speed_mode, ledc_channel_t channel, const ledc_channel_etm_event_config_t *config, esp_etm_event_handle_t *out_event) +{ + ESP_RETURN_ON_FALSE(speed_mode < LEDC_SPEED_MODE_MAX && channel < LEDC_CHANNEL_MAX && config && config->event_type < LEDC_CHANNEL_ETM_EVENT_MAX && out_event, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + + ledc_etm_event_task_t *event = heap_caps_calloc(1, sizeof(ledc_etm_event_task_t), MALLOC_CAP_DEFAULT); + ESP_RETURN_ON_FALSE(event, ESP_ERR_NO_MEM, TAG, "no memory for ETM event"); + + uint32_t evt_id = LEDC_LL_ETM_CHANNEL_EVENT_ID(speed_mode, channel, config->event_type); + volatile uint32_t *en_reg = LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(speed_mode, config->event_type); + uint32_t en_bit = LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(speed_mode, channel, config->event_type); + + portENTER_CRITICAL(&s_ledc_etm_spinlock); + ledc_ll_etm_enable_evt_task(LEDC_LL_GET_HW(), speed_mode, en_reg, en_bit, true); + portEXIT_CRITICAL(&s_ledc_etm_spinlock); + event->speed_mode = speed_mode; + event->en_reg_addr = en_reg; + event->en_bit = en_bit; + event->evt_base.event_id = evt_id; + event->evt_base.trig_periph = ETM_TRIG_PERIPH_LEDC; + event->evt_base.del = ledc_del_etm_event; + + *out_event = &event->evt_base; + return ESP_OK; +} + +esp_err_t ledc_timer_new_etm_task(ledc_mode_t speed_mode, ledc_timer_t timer_sel, const ledc_timer_etm_task_config_t *config, esp_etm_task_handle_t *out_task) +{ + ESP_RETURN_ON_FALSE(speed_mode < LEDC_SPEED_MODE_MAX && timer_sel < LEDC_TIMER_MAX && config && config->task_type < LEDC_TIMER_ETM_TASK_MAX && out_task, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + + ledc_etm_event_task_t *task = heap_caps_calloc(1, sizeof(ledc_etm_event_task_t), MALLOC_CAP_DEFAULT); + ESP_RETURN_ON_FALSE(task, ESP_ERR_NO_MEM, TAG, "no memory for ETM task"); + + uint32_t task_id = LEDC_LL_ETM_TIMER_TASK_ID(speed_mode, timer_sel, config->task_type); + volatile uint32_t *en_reg = LEDC_LL_ETM_TIMER_TASK_EN_REG(speed_mode, config->task_type); + uint32_t en_bit = LEDC_LL_ETM_TIMER_TASK_EN_BIT(speed_mode, timer_sel, config->task_type); + + portENTER_CRITICAL(&s_ledc_etm_spinlock); + ledc_ll_etm_enable_evt_task(LEDC_LL_GET_HW(), speed_mode, en_reg, en_bit, true); + portEXIT_CRITICAL(&s_ledc_etm_spinlock); + task->speed_mode = speed_mode; + task->en_reg_addr = en_reg; + task->en_bit = en_bit; + task->task_base.task_id = task_id; + task->task_base.trig_periph = ETM_TRIG_PERIPH_LEDC; + task->task_base.del = ledc_del_etm_task; + + *out_task = &task->task_base; + return ESP_OK; +} + +esp_err_t ledc_channel_new_etm_task(ledc_mode_t speed_mode, ledc_channel_t channel, const ledc_channel_etm_task_config_t *config, esp_etm_task_handle_t *out_task) +{ + ESP_RETURN_ON_FALSE(speed_mode < LEDC_SPEED_MODE_MAX && channel < LEDC_CHANNEL_MAX && config && config->task_type < LEDC_CHANNEL_ETM_TASK_MAX && out_task, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + + ledc_etm_event_task_t *task = heap_caps_calloc(1, sizeof(ledc_etm_event_task_t), MALLOC_CAP_DEFAULT); + ESP_RETURN_ON_FALSE(task, ESP_ERR_NO_MEM, TAG, "no memory for ETM task"); + + uint32_t task_id = LEDC_LL_ETM_CHANNEL_TASK_ID(speed_mode, channel, config->task_type); + volatile uint32_t *en_reg = LEDC_LL_ETM_CHANNEL_TASK_EN_REG(speed_mode, config->task_type); + uint32_t en_bit = LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(speed_mode, channel, config->task_type); + + portENTER_CRITICAL(&s_ledc_etm_spinlock); + ledc_ll_etm_enable_evt_task(LEDC_LL_GET_HW(), speed_mode, en_reg, en_bit, true); + portEXIT_CRITICAL(&s_ledc_etm_spinlock); + task->speed_mode = speed_mode; + task->en_reg_addr = en_reg; + task->en_bit = en_bit; + task->task_base.task_id = task_id; + task->task_base.trig_periph = ETM_TRIG_PERIPH_LEDC; + task->task_base.del = ledc_del_etm_task; + + *out_task = &task->task_base; + return ESP_OK; +} diff --git a/components/esp_driver_ledc/test_apps/ledc/main/CMakeLists.txt b/components/esp_driver_ledc/test_apps/ledc/main/CMakeLists.txt index b68eb188e2d..64222b781ec 100644 --- a/components/esp_driver_ledc/test_apps/ledc/main/CMakeLists.txt +++ b/components/esp_driver_ledc/test_apps/ledc/main/CMakeLists.txt @@ -6,6 +6,10 @@ if(CONFIG_SOC_LIGHT_SLEEP_SUPPORTED) list(APPEND srcs "test_ledc_sleep.cpp") endif() +if(CONFIG_SOC_ETM_SUPPORTED AND CONFIG_SOC_LEDC_SUPPORT_ETM) + list(APPEND srcs "test_ledc_etm.cpp") +endif() + # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register( diff --git a/components/esp_driver_ledc/test_apps/ledc/main/test_ledc_etm.cpp b/components/esp_driver_ledc/test_apps/ledc/main/test_ledc_etm.cpp new file mode 100644 index 00000000000..9f302ea192e --- /dev/null +++ b/components/esp_driver_ledc/test_apps/ledc/main/test_ledc_etm.cpp @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "unity.h" +#include "test_utils.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/ledc.h" +#include "test_ledc_utils.h" +#include "esp_etm.h" +#include "esp_attr.h" +#include "driver/uart.h" + +TEST_CASE("ledc etm event and task", "[ledc]") +{ + // Generate a PWM signal with certain number of pulses + + ledc_timer_config_t ledc_time_config = create_default_timer_config(); + TEST_ESP_OK(ledc_timer_config(&ledc_time_config)); + + ledc_channel_config_t ledc_ch_config = initialize_channel_config(); + TEST_ESP_OK(ledc_channel_config(&ledc_ch_config)); + + vTaskDelay(pdMS_TO_TICKS(50)); + + ledc_timer_pause(TEST_SPEED_MODE, LEDC_TIMER_0); + TEST_ESP_OK(ledc_channel_configure_maximum_timer_ovf_cnt(TEST_SPEED_MODE, LEDC_CHANNEL_0, 500)); + + esp_etm_channel_config_t etm_config = {}; + esp_etm_channel_handle_t etm_channel_a = NULL; + TEST_ESP_OK(esp_etm_new_channel(&etm_config, &etm_channel_a)); + + esp_etm_event_handle_t event_handle = NULL; + ledc_channel_etm_event_config_t event_config = { + .event_type = LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT, + }; + TEST_ESP_OK(ledc_channel_new_etm_event(TEST_SPEED_MODE, LEDC_CHANNEL_0, &event_config, &event_handle)); + + esp_etm_task_handle_t task_handle_a = NULL; + ledc_timer_etm_task_config_t task_config_a = { + .task_type = LEDC_TIMER_ETM_TASK_PAUSE, + }; + TEST_ESP_OK(ledc_timer_new_etm_task(TEST_SPEED_MODE, LEDC_TIMER_0, &task_config_a, &task_handle_a)); + + TEST_ESP_OK(esp_etm_channel_connect(etm_channel_a, event_handle, task_handle_a)); + + TEST_ESP_OK(esp_etm_channel_enable(etm_channel_a)); + + // use UART auto baud rate detection feature to count the PWM pulse count + uart_bitrate_detect_config_t conf = { + .rx_io_num = PULSE_IO, + .source_clk = UART_SCLK_DEFAULT, + }; + uart_bitrate_res_t res = {}; + + uart_detect_bitrate_start(UART_NUM_1, &conf); + TEST_ESP_OK(ledc_timer_rst(TEST_SPEED_MODE, LEDC_TIMER_0)); + TEST_ESP_OK(ledc_timer_resume(TEST_SPEED_MODE, LEDC_TIMER_0)); + vTaskDelay(pdMS_TO_TICKS(500)); + uart_detect_bitrate_stop(UART_NUM_1, true, &res); + uint32_t pulse_count = (res.edge_cnt + 1) / 2; + TEST_ASSERT_INT32_WITHIN(1, 500, pulse_count); + + TEST_ESP_OK(esp_etm_channel_disable(etm_channel_a)); + + TEST_ESP_OK(esp_etm_del_event(event_handle)); + TEST_ESP_OK(esp_etm_del_task(task_handle_a)); + TEST_ESP_OK(esp_etm_del_channel(etm_channel_a)); +} diff --git a/components/esp_hw_support/etm/include/esp_private/etm_interface.h b/components/esp_hw_support/etm/include/esp_private/etm_interface.h index 5b22a38dea5..720d70da65e 100644 --- a/components/esp_hw_support/etm/include/esp_private/etm_interface.h +++ b/components/esp_hw_support/etm/include/esp_private/etm_interface.h @@ -30,6 +30,7 @@ typedef enum { ETM_TRIG_PERIPH_I2S, /*!< ETM trigger source: I2S */ ETM_TRIG_PERIPH_LP_CORE, /*!< ETM trigger source: Low-Power Core */ ETM_TRIG_PERIPH_MODEM, /*!< ETM trigger source: Modem */ + ETM_TRIG_PERIPH_LEDC, /*!< ETM trigger source: LEDC */ } etm_trigger_peripheral_t; /** diff --git a/components/hal/esp32c2/include/hal/ledc_ll.h b/components/hal/esp32c2/include/hal/ledc_ll.h index 2c415b4d921..2a4d1b21f36 100644 --- a/components/hal/esp32c2/include/hal/ledc_ll.h +++ b/components/hal/esp32c2/include/hal/ledc_ll.h @@ -20,10 +20,13 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_DUTY_NUM_CH0_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_DUTY_CYCLE_CH0_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_DUTY_SCALE_CH0_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) @@ -587,6 +590,51 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c3/include/hal/ledc_ll.h b/components/hal/esp32c3/include/hal/ledc_ll.h index 6ed34c630d1..c9d71ea1d88 100644 --- a/components/hal/esp32c3/include/hal/ledc_ll.h +++ b/components/hal/esp32c3/include/hal/ledc_ll.h @@ -21,10 +21,13 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_DUTY_NUM_LSCH0_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_DUTY_CYCLE_LSCH0_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_DUTY_SCALE_LSCH0_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_LSCH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_LSCH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) @@ -589,6 +592,51 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_rst = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c5/include/hal/ledc_ll.h b/components/hal/esp32c5/include/hal/ledc_ll.h index 977fb08e8fc..0728be3f9a8 100644 --- a/components/hal/esp32c5/include/hal/ledc_ll.h +++ b/components/hal/esp32c5/include/hal/ledc_ll.h @@ -16,6 +16,7 @@ #include "soc/clk_tree_defs.h" #include "soc/pcr_struct.h" #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -23,14 +24,105 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_GAMMA_RANGE0_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_GAMMA_RANGE0_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_GAMMA_RANGE0_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_GAMMA_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_GAMMA_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_GAMMA_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_GAMMA_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_GAMMA_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_GAMMA_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -587,6 +679,69 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c6/include/hal/ledc_ll.h b/components/hal/esp32c6/include/hal/ledc_ll.h index e3d691de20d..d80a675e32c 100644 --- a/components/hal/esp32c6/include/hal/ledc_ll.h +++ b/components/hal/esp32c6/include/hal/ledc_ll.h @@ -17,6 +17,7 @@ #include "hal/assert.h" #include "esp_rom_sys.h" //for sync issue workaround #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -24,10 +25,13 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_GAMMA_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_GAMMA_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_GAMMA_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS @@ -35,6 +39,94 @@ extern "C" { #define LEDC_LL_GLOBAL_CLK_NC_BY_DEFAULT 1 #define LEDC_LL_GLOBAL_CLK_DEFAULT LEDC_SLOW_CLK_RC_FAST // The temporal global clock source to set to at least make the LEDC core clock on +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_GAMMA_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_GAMMA_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_GAMMA_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_GAMMA_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_GAMMA_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_GAMMA_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -709,6 +801,69 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c61/include/hal/ledc_ll.h b/components/hal/esp32c61/include/hal/ledc_ll.h index 333238be17b..0f00af8dc4d 100644 --- a/components/hal/esp32c61/include/hal/ledc_ll.h +++ b/components/hal/esp32c61/include/hal/ledc_ll.h @@ -16,6 +16,7 @@ #include "soc/clk_tree_defs.h" #include "soc/pcr_struct.h" #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -23,14 +24,105 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_GAMMA_RANGE0_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_GAMMA_RANGE0_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_GAMMA_RANGE0_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_GAMMA_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_GAMMA_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_GAMMA_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_GAMMA_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_GAMMA_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_GAMMA_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -587,6 +679,71 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + * + * @return None + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h2/include/hal/ledc_ll.h b/components/hal/esp32h2/include/hal/ledc_ll.h index d17c51b0378..ee79b47b7d4 100644 --- a/components/hal/esp32h2/include/hal/ledc_ll.h +++ b/components/hal/esp32h2/include/hal/ledc_ll.h @@ -17,6 +17,7 @@ #include "hal/assert.h" #include "esp_rom_sys.h" //for sync issue workaround #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -24,14 +25,105 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_GAMMA_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_GAMMA_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_GAMMA_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_GAMMA_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_GAMMA_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_GAMMA_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_GAMMA_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_GAMMA_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_GAMMA_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -706,6 +798,69 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h21/include/hal/ledc_ll.h b/components/hal/esp32h21/include/hal/ledc_ll.h index 2e4f6e5840e..db4c06031ef 100644 --- a/components/hal/esp32h21/include/hal/ledc_ll.h +++ b/components/hal/esp32h21/include/hal/ledc_ll.h @@ -17,6 +17,7 @@ #include "hal/assert.h" #include "esp_rom_sys.h" //for sync issue workaround #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -24,14 +25,105 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_GAMMA_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_GAMMA_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_GAMMA_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_GAMMA_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_GAMMA_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_GAMMA_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_GAMMA_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_GAMMA_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_GAMMA_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -705,6 +797,71 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + * + * @return None + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h4/include/hal/ledc_ll.h b/components/hal/esp32h4/include/hal/ledc_ll.h index e18f309acfb..bf49ef3f05c 100644 --- a/components/hal/esp32h4/include/hal/ledc_ll.h +++ b/components/hal/esp32h4/include/hal/ledc_ll.h @@ -16,6 +16,7 @@ #include "soc/clk_tree_defs.h" #include "soc/pcr_struct.h" #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -23,14 +24,105 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_FADE_PARAM_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_FADE_PARAM_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_FADE_PARAM_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_FADE_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_FADE_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_FADE_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_FADE_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_FADE_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_FADE_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -534,6 +626,71 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + * + * @return None + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-5), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32p4/include/hal/ledc_ll.h b/components/hal/esp32p4/include/hal/ledc_ll.h index 134399b2940..9eac6dee678 100644 --- a/components/hal/esp32p4/include/hal/ledc_ll.h +++ b/components/hal/esp32p4/include/hal/ledc_ll.h @@ -16,6 +16,7 @@ #include "soc/clk_tree_defs.h" #include "soc/hp_sys_clkrst_struct.h" #include "soc/soc_caps.h" +#include "soc/soc_etm_source.h" #ifdef __cplusplus extern "C" { @@ -23,14 +24,105 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_CH0_GAMMA_RANGE0_DUTY_NUM_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_CH0_GAMMA_RANGE0_DUTY_CYCLE_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_CH0_GAMMA_RANGE0_SCALE_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_CH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_CH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) #define LEDC_LL_GLOBAL_CLOCKS SOC_LEDC_CLKS +// Channel tasks: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_TASK_ID(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = LEDC_TASK_DUTY_SCALE_UPDATE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = LEDC_TASK_SIG_OUT_DIS_CH0, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = LEDC_TASK_OVF_CNT_RST_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = LEDC_TASK_GAMMA_RESTART_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = LEDC_TASK_GAMMA_PAUSE_CH0, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = LEDC_TASK_GAMMA_RESUME_CH0, \ + }}[(group)][(task)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN2_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_CHANNEL_TASK_EN_BIT(group, channel, task) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_TASK_MAX]){{ \ + [LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE] = BIT(LEDC_TASK_DUTY_SCALE_UPDATE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS] = BIT(LEDC_TASK_SIG_OUT_DIS_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST] = BIT(LEDC_TASK_OVF_CNT_RST_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESTART] = BIT(LEDC_TASK_GAMMA_RESTART_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_PAUSE] = BIT(LEDC_TASK_GAMMA_PAUSE_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_TASK_FADE_RESUME] = BIT(LEDC_TASK_GAMMA_RESUME_CH0_EN_S), \ + }}[(group)][(task)] << (channel)) + +// Channel events: ID, enable register and bit +#define LEDC_LL_ETM_CHANNEL_EVENT_ID(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = LEDC_EVT_DUTY_CHNG_END_CH0, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = LEDC_EVT_OVF_CNT_PLS_CH0, \ + }}[(group)][(event)] + (channel)) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_CHANNEL_EVENT_EN_BIT(group, channel, event) \ + ((uint32_t [1][LEDC_CHANNEL_ETM_EVENT_MAX]){{ \ + [LEDC_CHANNEL_ETM_EVENT_FADE_END] = BIT(LEDC_EVT_DUTY_CHNG_END_CH0_EN_S), \ + [LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT] = BIT(LEDC_EVT_OVF_CNT_PLS_CH0_EN_S), \ + }}[(group)][(event)] << (channel)) + +// Timer tasks: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_TASK_ID(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = LEDC_TASK_TIMER0_RST, \ + [LEDC_TIMER_ETM_TASK_RESUME] = LEDC_TASK_TIMER0_RESUME, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = LEDC_TASK_TIMER0_PAUSE, \ + }}[(group)][(task)] + (timer)) + +#define LEDC_LL_ETM_TIMER_TASK_EN_REG(group, task) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_RESUME] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + [LEDC_TIMER_ETM_TASK_PAUSE] = (volatile uint32_t *)LEDC_EVT_TASK_EN1_REG, \ + }}[(group)][(task)]) + +#define LEDC_LL_ETM_TIMER_TASK_EN_BIT(group, timer, task) \ + ((uint32_t [1][LEDC_TIMER_ETM_TASK_MAX]){{ \ + [LEDC_TIMER_ETM_TASK_RST] = BIT(LEDC_TASK_TIMER0_RST_EN_S), \ + [LEDC_TIMER_ETM_TASK_RESUME] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + [LEDC_TIMER_ETM_TASK_PAUSE] = BIT(LEDC_TASK_TIMER0_PAUSE_RESUME_EN_S), \ + }}[(group)][(task)] << (timer)) + +// Timer events: ID, enable register and bit +#define LEDC_LL_ETM_TIMER_EVENT_ID(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = LEDC_EVT_TIME_OVF_TIMER0, \ + }}[(group)][(event)] + (timer)) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_REG(group, event) \ + ((volatile uint32_t *[1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = (volatile uint32_t *)LEDC_EVT_TASK_EN0_REG, \ + }}[(group)][(event)]) + +#define LEDC_LL_ETM_TIMER_EVENT_EN_BIT(group, timer, event) \ + ((uint32_t [1][LEDC_TIMER_ETM_EVENT_MAX]){{ \ + [LEDC_TIMER_ETM_EVENT_OVF] = BIT(LEDC_EVT_TIME_OVF_TIMER0_EN_S), \ + }}[(group)][(event)] << (timer)) + /** * @brief Enable peripheral register clock * @@ -336,7 +428,7 @@ static inline void ledc_ll_get_max_duty(ledc_dev_t *hw, ledc_mode_t speed_mode, * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * * @return None */ @@ -350,7 +442,7 @@ static inline void ledc_ll_ls_channel_update(ledc_dev_t *hw, ledc_mode_t speed_m * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param hpoint_val LEDC hpoint value(max: 0xfffff) * * @return None @@ -365,7 +457,7 @@ static inline void ledc_ll_set_hpoint(ledc_dev_t *hw, ledc_mode_t speed_mode, le * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param hpoint_val Pointer to accept the LEDC hpoint value(max: 0xfffff) * * @return None @@ -380,7 +472,7 @@ static inline void ledc_ll_get_hpoint(ledc_dev_t *hw, ledc_mode_t speed_mode, le * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param duty_val LEDC duty value, the range of duty setting is [0, (2**duty_resolution)] * * @return None @@ -395,7 +487,7 @@ static inline void ledc_ll_set_duty_int_part(ledc_dev_t *hw, ledc_mode_t speed_m * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param duty_val Pointer to accept the LEDC duty value * * @return None @@ -410,7 +502,7 @@ static inline void ledc_ll_get_duty(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param range Gamma fade range index, 0 ~ SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX * @param dir LEDC duty change direction, increase or decrease * @param cycle The duty cycles @@ -436,7 +528,7 @@ static inline void ledc_ll_set_fade_param_range(ledc_dev_t *hw, ledc_mode_t spee * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param range_num Total number of ranges (1 - SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX) of the fading configured * * @return None @@ -451,7 +543,7 @@ static inline void ledc_ll_set_range_number(ledc_dev_t *hw, ledc_mode_t speed_mo * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param range_num Pointer to accept fade range number * * @return None @@ -466,7 +558,7 @@ static inline void ledc_ll_get_range_number(ledc_dev_t *hw, ledc_mode_t speed_mo * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param range Gamma fade range index to get, 0 ~ SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX * @param dir Pointer to accept fade direction value * @param cycle Pointer to accept fade cycle value @@ -492,7 +584,7 @@ static inline void ledc_ll_get_fade_param_range(ledc_dev_t *hw, ledc_mode_t spee * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param sig_out_en The output enable status * * @return None @@ -508,7 +600,7 @@ static inline void ledc_ll_set_sig_out_en(ledc_dev_t *hw, ledc_mode_t speed_mode * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * * @return None */ @@ -522,7 +614,7 @@ static inline void ledc_ll_set_duty_start(ledc_dev_t *hw, ledc_mode_t speed_mode * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param idle_level The output idle level * * @return None @@ -538,7 +630,7 @@ static inline void ledc_ll_set_idle_level(ledc_dev_t *hw, ledc_mode_t speed_mode * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param fade_end_intr_en The fade end interrupt enable status * * @return None @@ -555,7 +647,7 @@ static inline void ledc_ll_set_fade_end_intr(ledc_dev_t *hw, ledc_mode_t speed_m * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param intr_status The fade end interrupt status * * @return None @@ -572,7 +664,7 @@ static inline void ledc_ll_get_fade_end_intr_status(ledc_dev_t *hw, ledc_mode_t * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * * @return None */ @@ -587,7 +679,7 @@ static inline void ledc_ll_clear_fade_end_intr_status(ledc_dev_t *hw, ledc_mode_ * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t * * @return None @@ -602,7 +694,7 @@ static inline void ledc_ll_bind_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_ * * @param hw Beginning address of the peripheral registers * @param speed_mode LEDC speed_mode, low-speed mode only - * @param channel_num LEDC channel index (0-5), select from ledc_channel_t + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t * @param timer_sel Pointer to accept the LEDC timer index * * @return None @@ -612,6 +704,69 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable ETM event/task + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param reg_addr Register address to control the ETM event/task + * @param bit Bit position in the register + * @param enable Enable or disable the ETM event/task + */ +static inline void ledc_ll_etm_enable_evt_task(ledc_dev_t *hw, ledc_mode_t speed_mode, volatile uint32_t *reg_addr, uint32_t bit, bool enable) +{ + if (enable) { + REG_SET_BIT(reg_addr, bit); + } else { + REG_CLR_BIT(reg_addr, bit); + } +} + +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_reset = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s2/include/hal/ledc_ll.h b/components/hal/esp32s2/include/hal/ledc_ll.h index fc44fefe7c4..441fae1f0b7 100644 --- a/components/hal/esp32s2/include/hal/ledc_ll.h +++ b/components/hal/esp32s2/include/hal/ledc_ll.h @@ -21,10 +21,13 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_DUTY_NUM_LSCH0_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_DUTY_CYCLE_LSCH0_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_DUTY_SCALE_LSCH0_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_LSCH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_LSCH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) @@ -628,6 +631,51 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_rst = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s3/include/hal/ledc_ll.h b/components/hal/esp32s3/include/hal/ledc_ll.h index 1a689d6dee2..f89a21e1147 100644 --- a/components/hal/esp32s3/include/hal/ledc_ll.h +++ b/components/hal/esp32s3/include/hal/ledc_ll.h @@ -21,10 +21,13 @@ extern "C" { #define LEDC_LL_GET_HW() &LEDC +#define LEDC_LL_CHANNEL_SUPPORT_OVF_CNT 1 + #define LEDC_LL_DUTY_NUM_MAX (LEDC_DUTY_NUM_LSCH0_V) #define LEDC_LL_DUTY_CYCLE_MAX (LEDC_DUTY_CYCLE_LSCH0_V) #define LEDC_LL_DUTY_SCALE_MAX (LEDC_DUTY_SCALE_LSCH0_V) #define LEDC_LL_HPOINT_VAL_MAX (LEDC_HPOINT_LSCH0_V) +#define LEDC_LL_OVF_CNT_MAX (LEDC_OVF_NUM_LSCH0_V + 1) #define LEDC_LL_FRACTIONAL_BITS (8) #define LEDC_LL_FRACTIONAL_MAX ((1 << LEDC_LL_FRACTIONAL_BITS) - 1) @@ -589,6 +592,51 @@ static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_m *timer_sel = (ledc_timer_t)(hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel); } +/** + * @brief Enable or disable the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param enable True to enable; false to disable + * + * @return None + */ +static inline void ledc_ll_channel_enable_timer_ovt_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, bool enable) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_en = enable; +} + +/** + * @brief Set the maximum timer overflow count for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow count + * + * @return None + */ +static inline void ledc_ll_channel_set_maximum_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + HAL_ASSERT(max_ovf_cnt > 0 && max_ovf_cnt <= LEDC_LL_OVF_CNT_MAX); + hw->channel_group[speed_mode].channel[channel].conf0.ovf_num = max_ovf_cnt - 1; +} + +/** + * @brief Reset the timer overflow counter for the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, low-speed mode only + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_channel_reset_timer_ovf_cnt(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel) +{ + hw->channel_group[speed_mode].channel[channel].conf0.ovf_cnt_rst = 1; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/include/hal/ledc_hal.h b/components/hal/include/hal/ledc_hal.h index 18ac920a2d6..0ff3634659d 100644 --- a/components/hal/include/hal/ledc_hal.h +++ b/components/hal/include/hal/ledc_hal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -248,6 +248,19 @@ typedef struct { */ void ledc_hal_init(ledc_hal_context_t *hal, ledc_mode_t speed_mode); +#if LEDC_LL_CHANNEL_SUPPORT_OVF_CNT +/** + * @brief Configure the maximum timer overflow times for the LEDC channel + * + * @param hal Context of the HAL layer + * @param channel LEDC channel index, select from ledc_channel_t + * @param max_ovf_cnt The maximum timer overflow times. To disable the timer overflow count, set this parameter to 0. + * + * @return None + */ +void ledc_hal_channel_configure_maximum_timer_ovf_cnt(ledc_hal_context_t *hal, ledc_channel_t channel, uint32_t max_ovf_cnt); +#endif + /** * @brief Update channel configure when select low speed mode * diff --git a/components/hal/include/hal/ledc_types.h b/components/hal/include/hal/ledc_types.h index 9f6f006c280..116681c5682 100644 --- a/components/hal/include/hal/ledc_types.h +++ b/components/hal/include/hal/ledc_types.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -139,6 +139,56 @@ typedef enum { LEDC_FADE_MAX, } ledc_fade_mode_t; +#if SOC_LEDC_SUPPORT_ETM +/** + * @brief LEDC channel related specific tasks that supported by the ETM module + */ +typedef enum { + LEDC_CHANNEL_ETM_TASK_FADE_SCALE_UPDATE, /*!< Update newly configured scale for the fade on the channel */ + LEDC_CHANNEL_ETM_TASK_SIG_OUT_DIS, /*!< Disable signal output on the channel */ + LEDC_CHANNEL_ETM_TASK_OVF_CNT_RST, /*!< Reset channel's timer overflow counter */ + LEDC_CHANNEL_ETM_TASK_FADE_RESTART, /* Restart the last fade on the channel, the replay will start from last configured duty + (note that, for a single fade, the duty may be configured to a new value in ISR, + so it may not be the initial value you configured before fade) */ + LEDC_CHANNEL_ETM_TASK_FADE_PAUSE, /*!< Pause fading on the channel */ + LEDC_CHANNEL_ETM_TASK_FADE_RESUME, /*!< Resume fading on the channel */ + LEDC_CHANNEL_ETM_TASK_MAX, +} ledc_channel_etm_task_type_t; + +/** + * @brief LEDC timer related specific tasks that supported by the ETM module + */ +typedef enum { + LEDC_TIMER_ETM_TASK_RST, /*!< Reset the timer + When timer is reset, a timer overflow equivalent signal is sent to the channel, so any newly configured parameter is able to get updated + This is not the case on C6/H2/P4/C5/H4/H21, on such targets, no timer overflow equivalent signal is sent to the channel, i.e. newly configured parameter is not able to get updated when this ETM task is triggered */ + LEDC_TIMER_ETM_TASK_RESUME, /*!< Resume the timer + Note that the ETM timer pause/resume task must be used in pair + Pause by ETM task and resume by calling `ledc_timer_resume` is not allowed, vice versa */ + LEDC_TIMER_ETM_TASK_PAUSE, /*!< Pause the timer */ + LEDC_TIMER_ETM_TASK_MAX, +} ledc_timer_etm_task_type_t; + +/** + * @brief LEDC channel related specific events that supported by the ETM module + */ +typedef enum { + LEDC_CHANNEL_ETM_EVENT_FADE_END, /*!< Channel fading ended */ + LEDC_CHANNEL_ETM_EVENT_REACH_MAX_OVF_CNT, /*!< Channel has reached the maximum timer overflow count + The maximum overflow count value can be set with `ledc_channel_configure_maximum_timer_ovf_cnt` */ + LEDC_CHANNEL_ETM_EVENT_MAX, +} ledc_channel_etm_event_type_t; + +/** + * @brief LEDC timer related specific events that supported by the ETM module + */ +typedef enum { + LEDC_TIMER_ETM_EVENT_OVF, /*!< Timer overflow happened */ + LEDC_TIMER_ETM_EVENT_MAX, +} ledc_timer_etm_event_type_t; + +#endif + #ifdef __cplusplus } #endif diff --git a/components/hal/ledc_hal.c b/components/hal/ledc_hal.c index a5a32394cf1..7154fa52b1e 100644 --- a/components/hal/ledc_hal.c +++ b/components/hal/ledc_hal.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -63,3 +63,16 @@ void ledc_hal_get_fade_param(ledc_hal_context_t *hal, ledc_channel_t channel_num ledc_ll_get_fade_param_range(hal->dev, hal->speed_mode, channel_num, range, dir, cycle, scale, step); } #endif + +#if LEDC_LL_CHANNEL_SUPPORT_OVF_CNT +void ledc_hal_channel_configure_maximum_timer_ovf_cnt(ledc_hal_context_t *hal, ledc_channel_t channel, uint32_t max_ovf_cnt) +{ + if (max_ovf_cnt == 0) { + ledc_ll_channel_enable_timer_ovt_cnt(hal->dev, hal->speed_mode, channel, false); + } else { + ledc_ll_channel_enable_timer_ovt_cnt(hal->dev, hal->speed_mode, channel, true); + ledc_ll_channel_set_maximum_timer_ovf_cnt(hal->dev, hal->speed_mode, channel, max_ovf_cnt); + ledc_ll_channel_reset_timer_ovf_cnt(hal->dev, hal->speed_mode, channel); + } +} +#endif diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 9a9cb551b68..156c1415eca 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -783,6 +783,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_MMU_PERIPH_NUM int default 1 diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index fbed2753cb5..256729f2445 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -315,6 +315,7 @@ #define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MMU CAPS ----------------------------------------*/ #define SOC_MMU_PERIPH_NUM (1U) diff --git a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in index bfc74081c13..cdf6c31dc27 100644 --- a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in @@ -707,6 +707,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_MMU_PAGE_SIZE_CONFIGURABLE bool default y diff --git a/components/soc/esp32c6/include/soc/soc_caps.h b/components/soc/esp32c6/include/soc/soc_caps.h index c79feb23d1d..081322b1f56 100644 --- a/components/soc/esp32c6/include/soc/soc_caps.h +++ b/components/soc/esp32c6/include/soc/soc_caps.h @@ -291,6 +291,7 @@ #define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MMU CAPS ----------------------------------------*/ #define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1) diff --git a/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in index 2d30ff80ab2..4a8ec5625de 100644 --- a/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c61/include/soc/Kconfig.soc_caps.in @@ -643,6 +643,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_MMU_PAGE_SIZE_CONFIGURABLE bool default y diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index ccead5f87fe..05f786336d6 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -262,6 +262,7 @@ #define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MMU CAPS ----------------------------------------*/ #define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1) diff --git a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in index ae0d91158cb..e30ea5ba77c 100644 --- a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in @@ -715,6 +715,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_MPU_CONFIGURABLE_REGIONS_SUPPORTED bool default n diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index e573342a618..ec20076b5b9 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -310,6 +310,7 @@ #define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MPU CAPS ----------------------------------------*/ #define SOC_MPU_CONFIGURABLE_REGIONS_SUPPORTED 0 diff --git a/components/soc/esp32h21/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h21/include/soc/Kconfig.soc_caps.in index 6bdcec69a75..db5ff05ecd7 100644 --- a/components/soc/esp32h21/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h21/include/soc/Kconfig.soc_caps.in @@ -511,6 +511,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE bool default y diff --git a/components/soc/esp32h21/include/soc/soc_caps.h b/components/soc/esp32h21/include/soc/soc_caps.h index 1475416a83b..8c195f5b7f1 100644 --- a/components/soc/esp32h21/include/soc/soc_caps.h +++ b/components/soc/esp32h21/include/soc/soc_caps.h @@ -287,6 +287,7 @@ #define SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX (16) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MPU CAPS ----------------------------------------*/ // #define SOC_MPU_CONFIGURABLE_REGIONS_SUPPORTED 0 diff --git a/components/soc/esp32h4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h4/include/soc/Kconfig.soc_caps.in index 1798d3c7511..063959b0896 100644 --- a/components/soc/esp32h4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h4/include/soc/Kconfig.soc_caps.in @@ -491,6 +491,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_MMU_PAGE_SIZE_CONFIGURABLE bool default y diff --git a/components/soc/esp32h4/include/soc/soc_caps.h b/components/soc/esp32h4/include/soc/soc_caps.h index e1518842931..b711c3eb897 100644 --- a/components/soc/esp32h4/include/soc/soc_caps.h +++ b/components/soc/esp32h4/include/soc/soc_caps.h @@ -288,6 +288,7 @@ #define SOC_LEDC_SUPPORT_FADE_STOP (1) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MMU CAPS ----------------------------------------*/ #define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1) diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index ccb8d58c873..9e80e3c0421 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -1091,6 +1091,10 @@ config SOC_LEDC_SUPPORT_SLEEP_RETENTION bool default y +config SOC_LEDC_SUPPORT_ETM + bool + default y + config SOC_MMU_PERIPH_NUM int default 2 diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index 2a64a7ea718..1c13d7ca73b 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -399,6 +399,7 @@ #define SOC_LEDC_SUPPORT_FADE_STOP (1) #define SOC_LEDC_FADE_PARAMS_BIT_WIDTH (10) #define SOC_LEDC_SUPPORT_SLEEP_RETENTION (1) +#define SOC_LEDC_SUPPORT_ETM (1) /*-------------------------- MMU CAPS ----------------------------------------*/ #define SOC_MMU_PERIPH_NUM (2U) diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile index 885dbeb6aa2..84bf5fbf105 100644 --- a/docs/doxygen/Doxyfile +++ b/docs/doxygen/Doxyfile @@ -107,6 +107,7 @@ INPUT = \ $(PROJECT_PATH)/components/esp_driver_gptimer/include/driver/gptimer_etm.h \ $(PROJECT_PATH)/components/esp_driver_gptimer/include/driver/gptimer_types.h \ $(PROJECT_PATH)/components/esp_driver_ledc/include/driver/ledc.h \ + $(PROJECT_PATH)/components/esp_driver_ledc/include/driver/ledc_etm.h \ $(PROJECT_PATH)/components/esp_driver_mcpwm/include/driver/mcpwm_cap.h \ $(PROJECT_PATH)/components/esp_driver_mcpwm/include/driver/mcpwm_cmpr.h \ $(PROJECT_PATH)/components/esp_driver_mcpwm/include/driver/mcpwm_etm.h \ diff --git a/docs/en/api-reference/peripherals/etm.rst b/docs/en/api-reference/peripherals/etm.rst index 89f16d411e4..ec2b6973da7 100644 --- a/docs/en/api-reference/peripherals/etm.rst +++ b/docs/en/api-reference/peripherals/etm.rst @@ -74,6 +74,7 @@ Other Peripheral Events :SOC_ANA_CMPR_SUPPORT_ETM: - Refer to :doc:`/api-reference/peripherals/ana_cmpr` for how to get the ETM event handle from analog comparator. :SOC_TEMPERATURE_SENSOR_SUPPORT_ETM: - Refer to :doc:`/api-reference/peripherals/temp_sensor` for how to get the ETM event handle from temperature sensor. :SOC_I2S_SUPPORTS_ETM: - Refer to :doc:`/api-reference/peripherals/i2s` for how to get the ETM event handle from I2S. + :SOC_LEDC_SUPPORT_ETM: - Refer to :doc:`/api-reference/peripherals/ledc` for how to get the ETM event handle from LEDC. .. _etm-task: @@ -101,6 +102,7 @@ Other Peripheral Tasks :SOC_TIMER_SUPPORT_ETM: - Refer to :ref:`gptimer-etm-event-and-task` for how to get the ETM task handle from GPTimer. :SOC_TEMPERATURE_SENSOR_SUPPORT_ETM: - Refer to :doc:`/api-reference/peripherals/temp_sensor` for how to get the ETM task handle from temperature sensor. :SOC_I2S_SUPPORTS_ETM: - Refer to :doc:`/api-reference/peripherals/i2s` for how to get the ETM task handle from I2S. + :SOC_LEDC_SUPPORT_ETM: - Refer to :doc:`/api-reference/peripherals/ledc` for how to get the ETM task handle from LEDC. .. _etm-channel-control: diff --git a/docs/en/api-reference/peripherals/ledc.rst b/docs/en/api-reference/peripherals/ledc.rst index d15a676fc35..1e3f5a198b8 100644 --- a/docs/en/api-reference/peripherals/ledc.rst +++ b/docs/en/api-reference/peripherals/ledc.rst @@ -354,6 +354,21 @@ There are several individual timer-specific functions that can be used to change The first function is called "behind the scenes" by :cpp:func:`ledc_timer_config` to provide a startup of a timer after it is configured. +.. only:: SOC_LEDC_SUPPORT_ETM and SOC_ETM_SUPPORTED + + LEDC's ETM Events and Tasks + --------------------------- + + LEDC can generate various events that can be connected to the :doc:`ETM ` module. Timer's supported events are listed in :cpp:type:`ledc_timer_etm_event_type_t`, and channel's supported events are listed in :cpp:type:`ledc_channel_etm_event_type_t`. Users can create an ``ETM event`` handle by calling :cpp:func:`ledc_timer_new_etm_event` or :cpp:func:`ledc_channel_new_etm_event` respectively. + LEDC also supports some tasks that can be triggered by other events and executed automatically. Timer's supported tasks are listed in :cpp:type:`ledc_timer_etm_task_type_t`, and channel's supported tasks are listed in :cpp:type:`ledc_channel_etm_task_type_t`. Users can create an ``ETM task`` handle by calling :cpp:func:`ledc_timer_new_etm_task` or :cpp:func:`ledc_channel_new_etm_task` respectively. + + Some useful applications of ETM with LEDC are: + + * To generate a PWM signal with certain number of pulses + * To synchronize the PWM period with an external signal + * To start / stop the PWM signal output or a fading without CPU intervention + + For how to connect the LEDC events and tasks to the ETM channel, please refer to the :doc:`ETM ` documentation. Power Management ---------------- @@ -418,6 +433,7 @@ Application Example * :example:`peripherals/ledc/ledc_basic` demonstrates how to use the LEDC to generate a PWM signal in LOW SPEED mode. * :example:`peripherals/ledc/ledc_fade` demonstrates how to control the intensity of LEDs using the LEDC fade functionality. :SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED: * :example:`peripherals/ledc/ledc_gamma_curve_fade` demonstrates how to use the LEDC for color control of RGB LEDs with gamma correction. + :SOC_LEDC_SUPPORT_ETM and SOC_ETM_SUPPORTED: * :example:`peripherals/ledc/ledc_dimmer` demonstrates how to use the LEDC and ETM to generate TRIAC gate trigger pulses that are synchronized to the mains zero‑cross. API Reference @@ -425,3 +441,7 @@ API Reference .. include-build-file:: inc/ledc.inc .. include-build-file:: inc/ledc_types.inc + +.. only:: SOC_LEDC_SUPPORT_ETM and SOC_ETM_SUPPORTED + + .. include-build-file:: inc/ledc_etm.inc diff --git a/docs/zh_CN/api-reference/peripherals/etm.rst b/docs/zh_CN/api-reference/peripherals/etm.rst index 0f6127a356b..80cda16d92c 100644 --- a/docs/zh_CN/api-reference/peripherals/etm.rst +++ b/docs/zh_CN/api-reference/peripherals/etm.rst @@ -74,6 +74,7 @@ GPIO **边沿** 事件是最常见的事件类型,任何 GPIO 管脚均可触 :SOC_ANA_CMPR_SUPPORT_ETM: - 要了解如何从模拟比较器获取 ETM 事件句柄,请参阅 :doc:`/api-reference/peripherals/ana_cmpr`。 :SOC_TEMPERATURE_SENSOR_SUPPORT_ETM: - 要了解如何从温度传感器获取 ETM 事件句柄,请参阅 :doc:`/api-reference/peripherals/temp_sensor`。 :SOC_I2S_SUPPORTS_ETM: - 要了解如何从 I2S 获取 ETM 事件句柄,请参阅 :doc:`/api-reference/peripherals/i2s`。 + :SOC_LEDC_SUPPORT_ETM: - 要了解如何从 LEDC 获取 ETM 事件句柄,请参阅 :doc:`/api-reference/peripherals/ledc`。 .. _etm-task: @@ -101,6 +102,7 @@ GPIO 任务是最常见的任务类型。一个 GPIO 可以采取一个或多个 :SOC_TIMER_SUPPORT_ETM: - 要了解如何从 GPTimer 获取 ETM 任务句柄,请参阅 :ref:`gptimer-etm-event-and-task`。 :SOC_TEMPERATURE_SENSOR_SUPPORT_ETM: - 要了解如何从温度传感器获取 ETM 任务句柄,请参阅 :doc:`/api-reference/peripherals/temp_sensor`。 :SOC_I2S_SUPPORTS_ETM: - 要了解如何从 I2S 获取 ETM 任务句柄,请参阅 :doc:`/api-reference/peripherals/i2s`。 + :SOC_LEDC_SUPPORT_ETM: - 要了解如何从 LEDC 获取 ETM 任务句柄,请参阅 :doc:`/api-reference/peripherals/ledc`。 .. _etm-channel-control: diff --git a/docs/zh_CN/api-reference/peripherals/ledc.rst b/docs/zh_CN/api-reference/peripherals/ledc.rst index 5a2cb1d1990..f77f3ff15b1 100644 --- a/docs/zh_CN/api-reference/peripherals/ledc.rst +++ b/docs/zh_CN/api-reference/peripherals/ledc.rst @@ -354,6 +354,21 @@ LED PWM 控制器 API 有多种方式即时改变 PWM 频率: 第一个定时器复位函数在函数 :cpp:func:`ledc_timer_config` 内部完成所有定时器配置后会被调用一次。 +.. only:: SOC_LEDC_SUPPORT_ETM and SOC_ETM_SUPPORTED + + LEDC 的 ETM 事件和任务 + ---------------------- + + LEDC 可以生成多种事件,这些事件可以连接到 :doc:`ETM ` 模块。定时器支持的事件列在 :cpp:type:`ledc_timer_etm_event_type_t` 中,通道支持的事件列在 :cpp:type:`ledc_channel_etm_event_type_t` 中。用户可以分别通过调用 :cpp:func:`ledc_timer_new_etm_event` 或 :cpp:func:`ledc_channel_new_etm_event` 来创建 ``ETM event`` 句柄。 + LEDC 还支持一些可由其他事件触发并自动执行的任务。定时器支持的任务列在 :cpp:type:`ledc_timer_etm_task_type_t` 中,通道支持的任务列在 :cpp:type:`ledc_channel_etm_task_type_t` 中。用户可以分别通过调用 :cpp:func:`ledc_timer_new_etm_task` 或 :cpp:func:`ledc_channel_new_etm_task` 来创建 ``ETM task`` 句柄。 + + 一些使用 ETM 与 LEDC 结合的实用应用包括: + + * 生成一段特定脉冲数的 PWM 信号 + * 同步 PWM 周期与外部信号 + * 无需 CPU 干预即可开始 / 停止 PWM 信号输出或一次渐变 + + 关于如何将 LEDC 事件和任务连接到 ETM 通道,请参考 :doc:`ETM ` 文档。 电源管理 -------- @@ -418,6 +433,7 @@ LED PWM 控制器 API 会在设定的频率和占空比分辨率超过 LED PWM * :example:`peripherals/ledc/ledc_basic` 演示了如何使用 LEDC 生成低速模式的 PWM 信号。 * :example:`peripherals/ledc/ledc_fade` 演示了如何使用 LEDC 实现 LED 亮度的渐变控制。 :SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED: * :example:`peripherals/ledc/ledc_gamma_curve_fade` 演示了如何使用 LEDC 对 RGB LED 实现带伽马校正的颜色控制。 + :SOC_LEDC_SUPPORT_ETM and SOC_ETM_SUPPORTED: * :example:`peripherals/ledc/ledc_dimmer` 演示了如何使用 LEDC 和 ETM 生成与交流电零交叉同步的 TRIAC 门触发脉冲。 API 参考 @@ -425,3 +441,7 @@ API 参考 .. include-build-file:: inc/ledc.inc .. include-build-file:: inc/ledc_types.inc + +.. only:: SOC_LEDC_SUPPORT_ETM and SOC_ETM_SUPPORTED + + .. include-build-file:: inc/ledc_etm.inc diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 4e2b89da403..8b667324eca 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -272,6 +272,12 @@ examples/peripherals/ledc: depends_components: - esp_driver_ledc +examples/peripherals/ledc/ledc_dimmer: + disable: + - if: SOC_ETM_SUPPORTED != 1 or SOC_LEDC_SUPPORT_ETM != 1 + depends_components: + - esp_driver_ledc + examples/peripherals/ledc/ledc_gamma_curve_fade: disable: - if: SOC_LEDC_SUPPORTED != 1 or SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED != 1 diff --git a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c index 3ad8c473e2c..2f17326aa70 100644 --- a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c +++ b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c @@ -49,7 +49,6 @@ static void example_ledc_init(void) .speed_mode = LEDC_MODE, .channel = LEDC_CHANNEL, .timer_sel = LEDC_TIMER, - .intr_type = LEDC_INTR_DISABLE, .gpio_num = LEDC_OUTPUT_IO, .duty = 0, // Set duty to 0% .hpoint = 0, diff --git a/examples/peripherals/ledc/ledc_dimmer/CMakeLists.txt b/examples/peripherals/ledc/ledc_dimmer/CMakeLists.txt new file mode 100644 index 00000000000..2198ff47160 --- /dev/null +++ b/examples/peripherals/ledc/ledc_dimmer/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.22) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(ledc_dimmer) diff --git a/examples/peripherals/ledc/ledc_dimmer/README.md b/examples/peripherals/ledc/ledc_dimmer/README.md new file mode 100644 index 00000000000..2d94421fc8e --- /dev/null +++ b/examples/peripherals/ledc/ledc_dimmer/README.md @@ -0,0 +1,63 @@ +| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-H4 | ESP32-P4 | +| ----------------- | -------- | -------- | --------- | -------- | -------- | -------- | + +# LEDC Dimmer Example + +This example demonstrates how to generate TRIAC gate trigger pulses that are synchronized to the mains zero‑cross using LEDC and ETM. As a simplified demonstration, it simulates the 50 Hz zero‑cross AC mains detector input using a GPIO that toggles at 50 Hz, and uses ETM to reset the LEDC timer on each edge (every half-cycle) for synchronization. By shifting the LEDC `hpoint` (phase angle) after each reset, the gate pulse moves within the half‑cycle, achieving dimming. + +## How to use example + +### Hardware Required + +* A development board with any Espressif SoC that has ETM functionality (e.g., ESP32C61-DevKitC etc.) +* A USB cable for power supply and programming + +## Signals and pins + +| Signal | GPIO | +| --------------------------------------------------------------- | --------------------------------------------------------------------------- | +| Reference wave (50 Hz square from a AC mains detection circuit) | GPIO3 (configured as input/output in this demo to simulate the square wave) | +| Gate trigger pulse (LEDC output) | GPIO2 | + +Expected observation if connect an oscilloscope or logic analyzer: + +- A 50 Hz square wave on `GPIO3`. +- Short pulses on `GPIO2` that occur once each half‑cycle, moving left/right (earlier/later) every 2 seconds as the brightness ramps down and up. + +## Build and flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +```bash +idf.py build +idf.py -p PORT flash monitor +``` + +(Replace PORT with the name of the serial port to use.) + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [ESP‑IDF Getting Started Guide](https://idf.espressif.com/) for full steps to configure and use ESP-IDF to build projects. + +## Adapting to real mains dimming (advanced) + +If you want to control a real TRIAC load (lamp): + +1. Replace the simulated reference wave with a proper zero‑cross detector feeding an isolated input GPIO. + - Configure `REFERENCE_WAVE_IO` as input only, remove the toggling task, and ensure ETM still triggers on both edges. Or to normalize the AC mains to some analog signal, and use analog comparator to trigger a ETM event. +2. Drive the TRIAC gate through an opto‑triac from the LEDC output GPIO with proper current‑limit resistor. + +Here shows a simplified schematic for reference: + +![AC Lamp Dimmer with ESP32 and TRIAC](image/ac_lamp_dimmer_triac.png) + +And here is an actual timing diagrams (AC mains + dimmer output waveforms with phase angle): + +![Timing Diagram](image/timing_diagram.png) + +## Troubleshooting + +- Pulse timing not updating on C6/C5/H2/P4/H4/H21 → Check the notes in the example source file. For such targets, LEDC timer period should be shorter than the half-cycle of the mains, so that timer overflow could happen to update the duty parameters. +- Please make sure (hpoint + duty) is always less than (2 ** timer_resolution), otherwise, behavior is unexpected. + +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/ledc/ledc_dimmer/image/ac_lamp_dimmer_triac.png b/examples/peripherals/ledc/ledc_dimmer/image/ac_lamp_dimmer_triac.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7220c98c272df928d9307530008fd67b65036d GIT binary patch literal 87682 zcmeFZg;Yx3JxG8(mlWc($XPaLn+c7>d;+|k^)N1kRrm+ zA@Gj(e)e zu))HT&%wf?_bm8esEEmkaxm9&)YHQfz@+bB;bT)_;bKzQm_ICRCagc&Fexl;Z07$> z8)5VP4-XC&R;)7?-v97C!94$bG%?>lGXHww7GwXdu^8vy+&E*!xc^RL+x-#qJ={6|=(T<3;peNw$@$07|9<}Er?0c)-e~JB7u78#dhH6f2p4#QT{yh zzjPE+JFxzTp})*Nh`}!8bJF}G@DJZG8hOX${~sQc;>sI-N-Z_{+u47)uAkxek0Sh` zG7|Wf7Ti;-{;yJFtnD)VT?zkkT^v(nxrgzl{Qu=0b!NnkxaWk}@G-p&O(0ClWsWai z{h{Ii`W2q`2~*OmuaUA^UFXPz$)ez23mO?;)`CudE;x>+b8l{!rLeJLJJbB_uqYB! zW!|ulcX>zUFI@D*L*MnpHL?AjUrb6$g8M-u&^$bq%(dZ4iY<9~O$CCQ)reCq$83mXO7>WZ>ntA=8>?^c(7pwI392N&g;^qAwVFw3_s{gO&=X`Ea=sF#{~6fqZ&X z;2&cNqrQ-jBF0JW@4@qD=rP#->AO*WInrkTG%NatE~+RP|8Ix?8t6TD>@f2JS51G* z`+u5^{4+Z}J^VclyP2^Hz1VmfWa#rxe{KIrK0O@)g&tD-?7YeL-%*>){Kv!?Iw{kICX;Yml9P#&YlSZr&KS1 zl&^g?LcNf;6A}n}H?P*;H&^>II$1)aW35L2(GcN{1DN@(q}`+Q#B>qdI3Yf6u#&t|sX6n0*M?pK$5|6IDTTe3*YEect~5{c zSAGxKd|dF~oXB;YtFh?1Kq#FR1a2v;IGdW=;vY5+(ply(d%)AyWyNlOIw`xDK5^!5 zKAE%3-_c@xN-D33-HO05LX>6TV z;e)lTTSdWjxe5Vwx54|tD=wa`XCeE+u#4YY${t`STJ324HE62p%n5kJ_=0?~wrNaY zvvHWMtoEJ;dq|7i=~uhSl+a_Ybd-Qx9i5#O1Fkz`@2D8t7A&kw?qdD*=GKD>J3@_dwZJeV1+{)!#`&5;fJ6Z4O-WKpo zE+tB^@A=2mMVEYvknM-%!E4d<>Az3v!<2UF+ZJCCnALhoUB>YiaV(T;y`GrwzVUlv zGHiaf5*FsORTvP|o%atng~Ua@ga`_UFkViBl)wM(SN@G#+l15$ktO>6yevucY>ouE0Q80pvVr|!1y?@Gn zi)No>UO88Pv6AOfH~J#;xR;P!vOZ+brIHOc7B09#|I|0_J*Igkvb%pfC)e3w*JjOk-J|-Ix|FXL5Ty7x+UJ_@Kkj!Cn|$B}6b z#J0K(ogr?2BOH+f2aE(^pY5mhq~8crVSK-}y}4ew{mv44zUGTsi@QAwbF3C_=Ws2+ zLPdr3{>I<@>GMfC?B)nIY1VZ}n{LbH+4{SopIkyVd}vh0y?eF4HRoA>+~KU*(@D-8 z8;Ws$DTmVfIZ_o7a|k0j+c-JhNpN1-HaNFJsV2! zI9|O%fZ^}4{Su>f9_w2cg$Y$;JT)4_pVJ(-@|ZRj7*9HY;2^(iQ*=!^8C43&^hF+d z7#}TgcA@<_f4=Qk6!cfOYH{@;BC2LXrMd++$j_xI3%1N+>gr)s`;@le7#}oL+!cgb z1e81W%(3^*WN^}PhPPx#2iv1q@595d*>BG^js{RE({p#ev4zXfA*0+1{pQ4mSpy0J z4=Z^m1Gfq_s8`P5SKq&4sSeT?Xx^U9-!4tSlvjTLFzYULQhj~*;H_@%vtJ!3|0CJ+ z(35IwH&1{#``0itaNwJZtM1$2CweO{c5BUzr^5;dW0Mt_0ZIcTUmTD=s%-6Ur`FQI zK@vqln75=smp4$8j4jrH{*$lJ_JvJ_Y`Rds8IYACJ@1Va_#K(|7czkt%eMxd^w$~< zzo&S>r;2vg1w2r1sW715B{4LSR`@}?8fQE}mJo&-GT!QEN-eC|scm~ln%k`GR5 zlaJlkj2E0o{tQICWx6NmT=(wgNof07?B@LzOxe7}(;!CUA{_5C>Z^?KmZ zX6{q}h3FgLc`rqf>$i_dpzC)^#1PkMA0RCtpw{NY68o9n`SEgasv(>$mCuR~7Lmwi zuYm;<&NBz8lAsD?&CDn`%bzDoRP?1C6;=!8m{nUcYz@5sP=!*}`&a$}xYpgafO_jk zRWgYbD?@+{RgZ$`uby%@#XP=gUM%S(Vk_rqO&ZzY=cXAESY} zn?HQ~p1-a}%$A6-d8>l+p0`_C=jCku@WO`-B{I%rebaeV!uPX%B{c2wwimemkV0vu zz_X8N6SIqubW7=B@X{Fqgk9*gzaxQ>pkKEfa22kWAw8+!mp`gsFYB6z3^@T%;VG%X z$6quiF`dNn((dDu`^QQ5t5xD`^}B}mOcNg&VjoX=yE0{R&c3@_IVkeDvxOyJ{f(xS zz@r!O^9RJVh77bBAjAVQ0C?Ep508s_={u|-XF2I4?X(xhuV$WQSAw4;>y;UmGtqLk zh9hky4h|lI+p0NRKD;sWcw%Qp8OU|;gfc7DwNs|HvHBIpF-A7(aQ=yq#~6Hf#o@tB}F=RC?cZme_3aC;(ng7=b0gJnfS`O+|G zj9|GX_UesUECtu8x~`ok3Biq8Y>%Z&?G6Du?HMuwkaIx-7O(D;$iC>=;$LzS7={RK z&3r)le|#cGjt6Ei^Md{y??UmhomwByW*<5;rYWu#d(G1;gc_C9ZmiL3l|{_jxs3<6 zqaN!PeQrdOx!t1AR}FhM-i?>yxIAlb@|On}FNe*h$V1F|U2S)Nex%h_j6yW1Yif|O z4UM!!9ZaNI|K?PR-Wj*P0R<^9QWb3S5;6VX~Xe9?Yuz{AMfcW?1oL=J7F?<)4*( zHQ#WiDXCZR7ZERuha;j$&#lMf3A(5dvu9xTjr`qDfp{}qf#fpv3g#3sUJKs!IvDR< ziT0R4%g}o=b1ee~WNx^4kcybu#&N&%jOVtxrb)mx#R>~FeJL4|pU}N}<#Bsj@9FV5 zI4*9#-+!b&?ArXrR{rua&tW$eG&pf(1VuNV@BU%bwd-PYGgkR`N#OTgFfTze$CQJ{ zB&0G%T}r$w=hgA=eqftM(2ZB;`~hQDl;mJ!oVNw@Sy^zU#$Y?W<$=lat!$oVa<(Nl zJTW9NMfF*8;cAIPE9*;q`g*McxJ}1+T|_@^+S9jpO&SfcL9asScspfnx44p1Mr*gI z-5eA=1qWi7-A6?3xs6o}<`ZANuFx;kKAo!fdmdu4`=&)n(bf7pL=y=WBIe^w8y3`-HWAwnR>f+YQr@O~FQ-UJhiEI{^m@2^L8N15Wu_;YVaU3Mt z#cVNcyRf@G8fLRBnSOf-Lvd*J-=Wc!^kC0$xz(4r6Hf!aJBV~18%2U#R4t*2g8Cx! z;c6edV+Y?z&6`g{DS0*zuh;(U(3Nj55Ig(^9WReN_d_UnX7|O$)N##|<#X$khs~d;xdZ}_84&FpaR|h##et)nCl2C}L8Y-70`F~a%7nHD zG9l_GL#u!Ry#rW-Wh>u^!r(&+-&oiDocLJyy}%L**?ActBZrpDzNfzLdj_dasz_#7 zO+oqhLBdbO5TZnYIC#bpFzLkkbTC2F2*@S>t{C-ZjA(uvV#}lYp=Ed+9K7!Ugp3eQ zk^taXh|}&I(@-?yEo8O);Ceqy`TN8E?x=*b^;NQ;=hdwp=23!U9VT~q$2vF@1;@_w zajY+=vL_Ul(d0*;0y+~!re#Y8Y1aU3MAQypUr7XjYQ$!VU)XP!v6f%^eD|BrHS7Fg zQhtG(l`rY1ropgL)*wi7= z)laVQd1c3`!2KK-TVNIN3t5Hsn+I>P<3*g23R`ugh6c)9hf8=9171ZEp4jbNml%1t zef?BixW3)$anL`3G&nH98Klev376p z?l<<`Ayq+-G2W|@A7yrfT;xr^?T0E38HY%H!uvq z)GE3trw{Q)r46+YF;!3FQNrd^sO<|r0}n^Ijss3+&GI|X78BZpSG9$g%_3!rQ7QIo zDPH&3&!0~>BY^pIo1Rn&)Fw2mbgv$RlxBq}E}us#bH+%A8b^>H#hsn6-e*j4;MEgn zc5T2`1WNsW{`JXp#cR?NuQ!3slhS44U90PKyv+eCelnv6!#xK*vR={WJ-8Ib`RiU+ zgh0I)7aQ3X%2sG~>m}DtscSZz<=_@#*GR?nhp{;ot308KU1UoNB3Y4!1= zNFFo)UA1Ex0t2o9Zq<(iQ-*4~rXhT!91E)?kLaFJlW0m0>6x+(*t`fV)m{~>e3VtJ(?STgLybHT^ z?RB|gb}{d7Z>}sJb$eiT3O>$i4Ex-Damw!f>$N!@eMwvFb)hH^rd49eAD=^>zHDc& zDL~{(41e?NC-X(js}Qo<+t~np3LKF~WPPNo4hm&&6Sf7nB649f>x<&V=ql~@UmRmI0GR)@}gLt=c0y!DQuSRjA|cq^p@NisHN?o#o0yoxY3`R8-J@$ zq}I-}5uaUUGRyS375M?mmnOT9dQLJl$_vw#8CV0OxKb3SSiDE>EhL;{AQkuI*pS}y zgjVaT#rfyVc<#Ng$mwz1_a1b2Na3Ezu=~vz9`Ckw7$s8weylGSeafkP_RXgy;No)% z8?n!{7Y(!iD=!6nparqVVt?m&M?E8Ih}J1FSm$e`8~cNXRJQ4$&0Hs=?-;NIG})^a zCVj`qUC(9jMU+&j5V_gh;_MxlM?dBB|0Jj>e;UT5(2N?>D%6|?_L@+ysQ)y$ zk?%J%ib;|sn{q#h$d(+IEg%RaLbzP&HaHjBap^}!BeCg6dq{p}cu#OusDLhvf&I@{ zSyHI=-?Ps2lTFK#;Cl5G+Xcz;Nr?4;I}M@6B3>8Q-IVr)0>%hyl8RS22IF6JiYB6kaB=FFwlBUAJQ|<=X=mvbCO#Biy)NrDd_CQvns_Am z%_u@}_S_b$-4A-bYh7V|e%(U|eDFGW#=?KW!CATGcNW`Ky|+EGdV9vS81Z|X?HIB{ z0d_kuvF+O$SYI=?U*#R;{`C@3H8Qt4Ptx@GA&D#RF%#e%uRPD7#45r9&=up)*cwVudTnY}cRuBR*LW6-PzG^(t*y~?CPh=1XR z6{*8)BVK2C$+~?BE2fi-7NkH)sPZ+tPVN*Rs4~C6R4y_Bt;#=&y&T^ljD2=-7%np} zY(c6>rKacJLe$D*gXQJ#kCC)x_To)7yHHCHETS=|E{uK)0( zYV+qxp<7Yj8O={>Frz>%!SV#}b(2(`d>H1e{D#+kRa+dn7QVmV5yoVe>_yAMdjee@ zU_RqUJ(f4{7+dEDc1e7ajWlgc!#y4*{55{_2ZXBr+!2;bk&Hm_n!n_iR7y%22sOV< zY@xcSI@#`{F8LrdY?k>zua8&hsc7}9$7;QW%+z3$SH&W}IQkiTs5K)J7pA4afVtSa zZ|78L)=CJg^Pd#oC&nhIs%@?>28>m<-VK-6ewZ|?CtNdMj8E6}`5tWBZ(vO&^09wT z{9Tgy2KN_+h^+|xqe+1N75;a>M4L*f;QB$7U}1ErSzEtq3C&zTZ^|O@I3w7(1oaNA7nB43m!;6{ppdbk2vJqO%C*8`iR0o5VHb3Aj*!6pkW`C z$1l1l7>X4f`U&b%UbQ#ZPyb>PAM2-wY<{wK8R741kF=wF8&Ch00r4nS;M2Xvl8+LS z&79>NepMYO&v3qLF!`rP=4dsze7<&3%XkcqvPCrt+CCzl}*p zydcbXYg>rv+Du=92GLm))YC&_mNkbekd(N4r?A6Z@`9c_+8H2dHBmuSK~b3hI-a^V zDthQHvC8abq~3_s#&qeSi#wE@IK|A1Fxts3dF#RTRqm%JKydoVupV6f@*m0ivg4`Yw;+vroygcEqcpj_m<`u?S6-(Rg_H( zf5sgsYrmobyNld?lJ~J|B*%W)G7$dlO{nkMMNY`uZge06j1dfP;~4`MxegKJ!uZNm z{23gTq^j+WbV7AbCgEnSH1%UzGE(2saVXL-N1FD_)xsgnRF}8lH~(}Jb5wGPOu6nI zCLbh34Yrodj6y1#4dFd*(*=hXj#bI|=_Z9q$p|W!ji8NY33qK%)`J~AsJbj-mdI<5 zrQ8!Z^Pz?o$FtB1ZIAd0Wwm~1$h!}KMaPN1r1Pxqeb4k!r;tYk^*qH}zj?jINAVGV zps)^2{ggu8t-1iLgBF)vG9_id*IMDjY6J=Lt_B3^C7PQ)L|C3thiA76MUciVR=E%B z)E*@^MA7?M7~j>`K2hbK6kroILe?6?()q@oqWOPIPWneTx(bQ4`FLND+= z1+=C+Fi!#h{fJS;`A~$3swA7FV@f71)HBL$E!)eW5R3%j)ljl|Zo7OfCcS@uPH;(J z`RkelX#}QT=IIa6z;oH6sS?znc)!!c2n*ob$4L1Vglav;}f z5-L$;+?VeALJMu>fO_)`M9WJ~l%>hU06E2$74H#Nako zIv(WYodMI7sx|KI$K=+Uy)V|P=MS!(OyKOF*ZP5k&GV2`Xal56ij>HCAN@HHv!5-- zn?x%b@U*0OpR1mjl2~`fY)#LZlL7E2JL zWnr_2JeOUsAre8dih(bCcy%*Mus>6GG0w1#bG0`FaxqzMjc6Xfg3&IQo}qNGD5 z5ZMto6QFJV2@5xRka}3B?3`)M!fb+9fm}FJ`iurZJOQKV9C|qH0JPXF)kBr>#M2qh zWres^q27NQlu?AxcrBg+hbkcci3{PsG$>3Kje;?Y?9Z2=Vsmjoy;JAr>ubM=Sn1_Y zWF+*$+@^FX*~`els2ntwx z@q&l-F$9n0Hpu z^!fIQVN)K5o)=V_2{1J>JPkX)PqPsmmwj3FQbo;hm}pV%Hognb)38DbE@Xx?jard_0!ZwMSWKFLR9Tmg{|k;d?K`sN+VBv5q?qeOeFciW!PIV<27>>h2klna4XArKoQq4Lm|6r)JN87Nnwf>i67Shq{2;Wd%bk@sFjL%U zmKP&cBV6o@L}NcawkqSZUR>PLI&7NS}j_;4?w>#JdNJKl7@Nbd!({nmeTe zYZ4NMB4OY7byOoEyK3(!-`7OCax-Rf_c=Y4-sP}d(13g6jtlcIJxa%9IIyE0!{31x z`RyymO<&wftx4%TZSzh%ve+z_nsivwzaKwOml&k#9 zIMRVAgvg4Pny{l(5x5Z4Teb7pQpovdW-CsnP-Xway_xj!{_tV6XLW~Aw|Wd$Ojhz@x}RgWRF%P<7_n$7sM#Q*^p(1zvB0g`C`*)hk)O@yuF=M{crl8b zjmQcqk?^=K#iCj}n+KK~CoZEPnc#9zWs{#G1F{t+?5_+_WKq(PGrrJyI#d?GD)Oq7 z7-}x#pg8j?4`(y6zw&^uiE)Q-@aSn;LP``E_dE@{7~~lLSfzA?pz@4>@pN^V!~~Lr zhxlLzDj>d_MrO26CN2#a`iq#-YG;Mb+0_3^W9=ZpMQ{Z_X%IX-EFuA=`hcV)JD#$K zlO}`QvpeT`e<^33c*7e&gD$t%BWL9HNC{%7Vf6ee_WE{mYyX|~VbeWe@<}04ff3x0(!>h@+h!Uwm3` zFQc8V$;lC7{czhF5lQWi2RovNM72UE?D(H|F?)9Bz3=D7z)TQ}!9Ya!X-BiPPp5kr zyx1x1{=7upz5*Mzm~40d1ICxa((QOgRU>frw0IY1Pj1qC<0l#3;bO%#5Z#8d7oO0? zWrp_@_YUD&gJBk7*C!>Y^j*1MT%}dIE2aLE7dF|m)M2uc=OOWrYfyH^$a?|5o=bGS z>SVFr&f1l85YioHSboG9Jfa~P^J1NF1;@v3sj%fe?Z%}R#fNoW<%jdFzLIP2 zQ%lQt&pADGpS-6ah>i_$4l_jPgMB7R{g9l!nO$Q}=Fc9(&*_pIzy$&gWEHBvs-fz4 z?o~s?*o~jn$QGj(CElwKHjks=~F`?2ht~NqgviW@H=V|iM+93;l$y%x{>E;N~ER>yc+Ru=w#YYS%J zw3ngHMG6vEe04r_pN&dzlorKJs}^)F^|r-loybSa$w04=IMSFVu^}m*m*`}sqMRR= z^_Ef`tbaXPx#&bH9=Ys{M@YDC&L0DD(K$L%RD5U_^+P@X6#^x;u$+n+JaXUH7$oIP>b^U$MY)fK!{w8&yPz#4eKyCE$1T2A)P zF4&`vpP7wu0sUk$IU%PD!!;d!#Eu{L+9a}{`ZJ=#rnGo-DMAk-Gn8-6QIj86uHBn4 z!83WIuX(4hV696sU!TVNqb6j!FZ6r{C^Zb&#=9?1>LXaBwM?IX1)jjNEb7zA`G6_;y@EguMn5-> z6^VK4zV#8d}|-e4{zvZ}KQmND?Y z4Y}+pR`c8wm)s+S^2*N-yLFDY*Jm=aX_z{3nna~2>(_=596A+v#Vj~vKb?rC2R{cx z#O%&YU1TWQj1)1UH^4FaqOj$OLWS%s+y!3!wy=wF>-0}VyalVg>#j4;q2gYy>qd3% z*`R#_)&}Y--{^OrT&{FKLbj7#MX4|RF|Yk!Ng3J_Vq^LvWW zkOjc!snL2{U;?=Eh(d`~Co{ekDOXAcp>bL}8DL{ucQ&S_f^Dwn$%_=W-n)g{24wO* z6*-@Ygcy>#|L#_{H9z2?bf_5T{q(|@#uIP;+o>c(fba@)-BcS3XxEEZz< zkMsC<8G6~-=MVQIS4=J4)bcPV`dka2Nhw^mnYqHSg;C9WK)hF$DygUV_`iDE;z|Wo z+(tVr6*bgX2e73EaUZq`=Z?J00kxsSGZUxJgA&aO`EVap3eRZFyiANq5Ng-RjhM`7 z=uUsNaXKz^sA|%-oaNJYJwQTs=lv5!gK>S`1(rm&`&Mg4Z2VeMbS~%zIjDh;hKeA3 zr+8?3@jwOjX*y`ItatDE>aRv;-mS>PO6XA8D{V<3Z~D>DJ@R`a}yz6n-l$uG?)ZPo5|{kcSU?O2PE)KYIHYTyev=q0q1zPn*HZ9k_y z;nx1$ea|L6QNw=AHv-q%5auNt_~sMxp|x7OT6lxN4$V1DR!&k%I$+AXFI}IAVn|gh zBkWg$3l*p|iwf+Y@~Bccd@x;oauUi-?fHbuJC&QP>mEnT#FjSCQ)J++7Qt1c@64;7 z`@ytcbz|a#f{jl%Ym!|yn%kjsg)=8x4=Y)Pf4CIPy?P>BOF57E&dR#ptMYon^ z-3ryBZj5S(emCTt^e%du$t!7^$uOz^!>)dkMd7Xm_*vYYE3%U6V@h)~3d0V_j3s(8pdSYXIEA^nm9FcU}5^+OJn@hc=2?OxK|G4`Qi8gr)fl``3D`Z_I~SebH2m}`g;_h`*6@`TzGHR8Mw2y8X4IPo4*JBD(_f3<)%|^y zCYg#J4Z;A&MgoVJ-8~YY2Tu=!D^sfGI=JZL!i>hZRD_>jK0!<84_i89nr!oQvR`ix zJN}rd+=Siiz(|2>&oCEoguDk)Lg!%Xo5n2@Q-_c2gZ|aE?#rib?YS5rZ^#uJ)Y=1E z8e+!3u(93_&UMHV!@!0)7b6u@B`SirYl+3>ul@!A`<4gS8=3 zjcd$WS~kXeXlrrT>Rf)}!F6g1=!G1-B}{2os4El|eb!^~`N35u9ZLF@dRb8{UeUM%^w)0xKzLC3xhG|kF02u{v# ze^z?R;qWB8-ux#zd~^r!(h(NaGQf#7MAB_<4>xwqQnM zLdPXQ2b{1d<-!RqcFkTr^?!Hp=t$iGTK3_#_=tdsz2G9A_fw8LB4FcjYFwlo%{@Ww zl4Y0h7VpkaM~sXb_z4f{51#3y;n2dfkh8k!X#xlu2X2_R_g?Eu1g)7BrD+mx&@Z2P z`r|~warAw;RlS~330bvn@AO2b=UnIpa>C?V=1$b$&_c?2j)ILr0mXF>GpKMtY48p( z34exeg`?hHqOSH2be#J7_3+nPPa2ZERW#APf(QQmsKF%4H^4#OyT}@3An+xzg0G!^ zjUpppnQwBSO^F%Cp9l~vD(Bqm?)hYM2|`0XI&^LD1Q(UqBTgDltyw$($ONUiY;`7Z zh@^>gJK98PZk`mEtra_;C~{@9-{P+KDfC^+TYnSP9X z&X1eXx9~}cZKm4(9j_LmMh%A(wiv@Rm^UOGqQ>RHIYhb1H)tFWE}HU0`StNq{ow>8 zzQ2RJ^MS?ENs|{4)VH&##!xRl4|)On#zl81qejo#@tTlC z;;wDJH)=HM_-mX9CkQijm54%}CA?~UF-1K-HY)QH@Q}w?`1*!qk5%_JNe}++3>RMt z#cg!BIg6$`w!dw}){4|#g8U?W{Pii@Y9|OjV$fP&`SOm$PD*HBo^;FA>!FY~UbF4? zcE}xfC2z~%NP7HCniuFOk@iBS8-@igHP*FS3??ruz8DN6LbwNPp*ZMH!Cr8bT?X z#6Q?DTbSoSaI>6H`X6k#{tG@^hgWE4d&zJ!Y1F9^smNWyNSs$8MdB*3eBBIP}uPg z4~rXA4a8=hayTADvsieXYoEO19O9+BiX=pMsBJ;YAzk67Le_4UpJSHr1FfB@t2BhKxsVT3(6eaHoTq02*}2Ci*Dk`U zPXKBw9Y0?jvcq*ROi|*TLUS+wZkUAYy%|3j;)<_;A~{;hdSTo<7pqbP5@6K?Z^*YN zGw}$*D$Parht(-5zwzw4QZIHhx75%q7h@F;9BeSjD9=RCw@K&->17etesETAq=1J^ z=|OQLvOz5I?YVuuC%ZHB<~r*N6Ek7;UWlhldKQg=d4Ce81OyF3PUXhBGP_Jjxj9$g z)!;fKGi@#LmDxlD2?vQODoX($6R(cftCbk+u@KSJud=*{Ui(#YS^uIg8W@76ppDLY zyI=Exi{JG^h{pKCoZri!9JUXjkpwi>u@L*s;kE#yNgBV!1Q42~bo^E* ze~k_Hy+5cq6kVE3Ju*9HY=+JmOnu7|7U#y7;f#jb_sQauk7n!49|@|A+6uT`z73a=f&r=!m=@_=yQ@z-iMX1a}tAG|ed7b$d4&bkd~JBBIk7$#nPL;SYzDcr!$j z&EtZw6KRLa{nQb+#?{$zw&3q!I;(ozH_26tA1>#NPZFf=!jQ9t`)Zqq5i!usB!zb- zaB|IRF+-rs$j*b7jEjP=9ivdSXoBqJ>+zJBhcy15@21VV9Q;sfj0_S6IGnH{C-bC8 z*bcF;Oan=x34Is`e*Abot&;y^_HFANRx` zeAV3I2-#XkKg_f{l=)Yh;N*jr_poGztd%MJlZe8Eb)Eoh%t@Z-$Cy0$QXY(nC9=M~1eTmsEKCG)0;+h3}I! zHrF+0>QL10qSL*akx4Asz5rg`FjV&FnEc3Q zvPhPU+(CrPE!?U0J6?YNl#Ak_U;!@fJ)k8*c*|Iw_E6vs`xH!BkIhB{DE&eolK^rzt-Cd+ z3tF0sx)Y&3f?vr__6*)oglxUNslx!8HVh_5iiffrjdT?%Ka?H}ZAQA*B!k8uOsLy% zJ5FVpGqK$bw{If6nj!fmWVu`3K+JFvNp=1#KyFLXFnOYw!wgmn+RDY|b7Kd*hnwANdF+X7Mh&FyW(KFjHmn0(wT?$Q}L*sPn7v{&M5Jc?; zve6sxHkEva!1>sw7C-JT92~`=FCz(4m;qMSU0pBL^HHxujO0xZN^LHbC?W`d3AIPi zZb-=A;z?xgGL8$yj#X^*H)E@1ZyhBPp)z*)HzL~OhqfTQV_lbqI_wXpp7QAPh6+9# zIUseoxp-l!L3Y&`;~N~e)jO?=kKp&rmrn#lqa6lu1s2%>MctBR&}1Xv_d&jZn~VL6 zetaGBgfR&@yAlAJU!PVnnFevx&$#hA_pY-zI0}!4U$N-}Gb|0!7@?se5tfX-A;Cm! z7(T3KOoU%oVSJHsTt46Yigi0O%42F=OtY> z^AlYJ$+D1JEcFztT81*4j>6f&QIj zc3^!xqxDO;fwo#&5mKuPM~dHhtb#R;Y$$=bDdYU!f(DS5f?<2@{3k2y^SkimY|2Dl zO%RB-i|>n!BksD74MgNrWv%y-+{K|`fug2=heP~{Rnknq`olmpQqA!+VIgs9*q^9iNg$`y`Q&e5Rb7L+05)xL5i{4ihY!6a+EB3 znP}u5C%(Yyp3mvb#KF!UK{z1;K3sBYd7uK~F4>VbfWmqaqTC_@Ru_fo;zfT_EZ=(g z5&ix#ZAb+a6BkenJru>_+3vALN_6#P3XP?JK9DV@NF0xV9X?&!#Kj)?i_v9i?^Cd@ zY1vS)*_j>`Knx(F)xs^LOcCsle&5gveGZqB7EeYH*{B6J=3>bl87fsb-!-z#q?9f6 zN7rb~=Or$6A>%q^m+(@2(~1e8>S(c7nzV?t5~w_<=c9uKeuDVaLksiF_|;6s%K&CRe%43QX33ngIqN*0oH5H%sX&l{#&I~`yz3>xKA`W`-PyJUiYQP*Mo1F z?K3s+y0mW92ugdPhYPy@wrtP~KRmo?$kw|63B z?i&&YgL0eHMjNlSyqsaf;{$ji^SF(~#|EvhAK>$_C(r|kf-|B`Oko?Xs>hZ?cJ$8L zB3=d?(1%a89);2X-b_!KbLw48kT)Oqm)_5ed2`6mPjmq;3VY=1$+}h0@EHCzSC}8X zHNQ(a;8a&Bj5sSW>_?|du!=z#xWKytu_RpsDor`}CUtl&NW?4!*d)^4jya9p$wHxx z3i-BNOFv90C<0IVYWXxS+YH*q_%uxXvK(^1@3Y7qMk9MTl9~`7_}h?yL9Y`JbMHRW zU?lCEk`XICy2NRV*V0OR z78zFhSqM(Zx)_*Xkhrfsf$DECkeVn;$au0yX^F*WLaZdhr&Yuy`e#Y{GUiUlSjKKB zF}@}=x<&#n@ao+kVH*9zg@14D8XNvdpH8}1{ka#UAOq4BZNXNZpLnLIE zQU>yEoXA>L)z3ALc?*@Wu4DDr0d^4?@5v7ec2;t9Ax+-9&xUBVhJ1ywRV{P~mp4hbKrw!HFl6n2=xHT=Bu0?wd;s zxui@u-ixK-@%JAv*A0B&yqbAT*wUuem3+Z{_K@Q*U5R@2mNnJE9_{)K!WTgIKwy;V zE30KQ0|pBSHM)e8g(}&hfPG0zJSsyJ5%ip6&-FkjzI(!HWA4eKUxL{W^Fbe_S;t#H z1h42mVcf_Rgwo+h@nPH){C4OrCcvnY6%W=Qu@xJK__}5o*!pwE+Ij%OKe%NJeH&pf zNRzTjn?=A>P|&(h;SLXC3USmu;{Wt4M^}aD|1kB{aZP=H+$u^6sB{hK?uI#3Qc}9R zq#Fi|5Co(pq(fS|dvqz?Eigt(ZRF@@{=U!idOiQ`p4aQ%?Vfvf?m6%J4AOBaFx8vB z(YboA38wT9Ye-0n5q&mY_=QY)H$huF62zHP@-vB@x8t8t4PRtsg4(t3B~wH5YA;HO zvxe)z0s_uFf=>Gj$?Tec~c?n^WUht@h8+>!G<4RPQA5Dav^58r7! zVH?})K4t6XI1YSWu#XEZm?vxOZ6M^pXXxIy9z#ndJvi67bgR3RvVn`P^&Y5#+0#^q zHGGSjhxdqpf@}5>Uad_1+}T1M@Na|n{@W157~T#B+-2#hGf<>Y;*!GQ-6vyFuJ+(x zLByIqc@CZycuwvJ))BU->vxm}HXiNlm2|L|2G4~6f77C143U=T&B#|1H>7FT6(jV7OXOM zsj{(;m2IR}G*|7HHt^)H!CJRE;mMEdp*)!jq)P;LRRUO9dV0a4lw8pOwpi3BJeR+r z2QYU^Qnh5-mL80<>gpI+*#*DTHdo*=*19!YwIs$)y+lRfXCnjvc<_ycE z;rU!*-7?u_qpMaq0Q`vps~-PAh^qHXG54UssXsY{vpcK;`)Nr*7``$VIFN)BNi&)c z6>2fI1*4(bV5>lj$AscJ5q7CwXp>fh}+1Pox`(&qpLI zl7B1&GjuSX06_T7zO{psT~RdIP(fR$$VyEwp%*3|F+V4rMzg7L+Z{g@$*(&xm<6@6 zX*l>c-KUr%^;n_IzWXEfV+3Ki(Pb zYv`N=bgV!InzdWKJ$|^a65ISHHA3UP@=jO``t$MZw)BQ!?wB;vEqZpIEl22fCSHTL z%pm=f7zhuvUn+-Td>85F(=($8>Ww@xMKr5otp!FKDoeoXX4%wPjzw0b134UsIRtT7 z%(nt6(?5e$llXo_vT6M=AugI4LvUjI$5Qr#L%BHo;qD&mGQAXd=0G`kBHoCNCu6Rw zr3o^tjQkmRPmjHqI;HPYaK$kI?Pr}RAUg;6AE>2bj|*!QbIVz;-Cs0~Zf7_<0sPO@ z+|m2>^b99x1ox|XW4{V9c(lL>+Pm&>@yCWXB=ImV@D^@)ini1_Z=dEoK*df+1YoX% z6O{9>kNDL$-ecX(t3Zr(kUSL zBC1-Hwt&0QM|ec-`LAoIN>!O}XD{LmionS@)<7j(e|*+okQscX zd{sG&98jtfb0lGaOK@r~8HX7W8kRf#?C7@VvJo-9ZVUPR%~15ac=T~o=bPz+&WC$O zsZ)ymaYUkJIq(>II&y?KP|YNFM#nxlO||topnbsGC&N5g_~XK*)A`KKP^4@fJXS(o zuS2?B^PqEeURp zM*183QCdF-8Eo-@Cm}l_q6d++KM{+%ab+!y8bBoG0JqUlHr%d~rUFdu$OA`XeO`}X z97LZ2D{x^4b`{Sq)C~%B_)u@5UoTlTJSU2&J3hAmgZdtaOacyJHQ&$o+x0pl<(@Oh zB^P(aF=Q}iOTD-OS_Ol)5TSo7NIQIE3LeVCQZPkbOs(b?cG&)Z!Du$To(j}^I=yuj z8++)vR(DwKVD5);@_PHWD)8Jsm9cYnKc1=MThFUgL@!~6P_e4Wuu8fmdN_5a{Y%2w ziw*gGrs>X9PVaua>bqaDEs%5dT)A}(H6W7Sd*$=<$vB1|&)5pgOeg^V!(mr2IS=D0 zexEwTMTsBOuL1HwbEiz17`;Ga7p0wXEGp%;9lx?uGuw^H$dehcjL$lZYJ*}OeU?ws_Fv{i+KhjV|HaY>T?ypGL;gX#gRJ|%YYTEH zXUHydy9hnIq@IS2b)sEh%hYF$O==|fcBGZph#D8z`#NUj%tO=)q;7PyZS|b{e_1DQ zE?1^GJ2U^Ze!fmnZH&|3M98O*{HlogTDBAs=RohS_M@EZW{Ivp%A% z=rbLRsIBG?^1~h0;icEE6jZVrIOPJjvfWsGGlYz+jrlAtr9#ZQ7Kb{R!`oTx<~O

NE$cY(+^G4#}ao~er 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

  • BN%GAybx8eT8`gG%VMmb% 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 literal 0 HcmV?d00001 diff --git a/examples/peripherals/ledc/ledc_dimmer/image/timing_diagram.png b/examples/peripherals/ledc/ledc_dimmer/image/timing_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4cbeb7e0c57252b94429a7bf414b7a2773d36f GIT binary patch literal 156045 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%0DC2b7rzk?V-Br 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 Fe*?i(6A=Ia literal 0 HcmV?d00001 diff --git a/examples/peripherals/ledc/ledc_dimmer/main/CMakeLists.txt b/examples/peripherals/ledc/ledc_dimmer/main/CMakeLists.txt new file mode 100644 index 00000000000..db62d4c5d81 --- /dev/null +++ b/examples/peripherals/ledc/ledc_dimmer/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "ledc_dimmer_example_main.c" + PRIV_REQUIRES esp_driver_ledc esp_driver_gpio + INCLUDE_DIRS ".") diff --git a/examples/peripherals/ledc/ledc_dimmer/main/ledc_dimmer_example_main.c b/examples/peripherals/ledc/ledc_dimmer/main/ledc_dimmer_example_main.c new file mode 100644 index 00000000000..aff2ab55fcf --- /dev/null +++ b/examples/peripherals/ledc/ledc_dimmer/main/ledc_dimmer_example_main.c @@ -0,0 +1,145 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_check.h" +#include "driver/ledc.h" +#include "driver/gpio.h" +#include "esp_etm.h" +#include "sdkconfig.h" + +#define REFERENCE_WAVE_IO (3) // Reference wave GPIO +#define GATE_TRIGGER_PULSE_IO (2) // Gate trigger pulse GPIO +#define LEDC_TIMER LEDC_TIMER_0 +#define LEDC_MODE LEDC_LOW_SPEED_MODE +#define LEDC_CHANNEL LEDC_CHANNEL_0 +#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits +#define LEDC_DUTY (400) // Set duty to 400 out of 8192 (13-bit) +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32H4 || CONFIG_IDF_TARGET_ESP32H21 +// On such targets. due to hardware limitation, LEDC timer reset ETM task won't sync newly configured duty parameters. +// Therefore, the LEDC timer frequency should be higher than 100 Hz (2 * 50 Hz) to ensure a timer overflow happens before the timer reset to update the duty parameters. +#define LEDC_FREQUENCY (120) // Frequency in Hertz. Set frequency at 120 Hz +#define LEDC_HPOINT_INITIAL (1640) // Initial hpoint value (to ensure no pulse between timer overflow and timer reset) +#else +#define LEDC_FREQUENCY (80) // Frequency in Hertz. Set frequency at 80 Hz +#define LEDC_HPOINT_INITIAL (0) // Initial hpoint value +#endif + +// For C6/C5/H2/P4/H4/H21: +// 120Hz 8192-step PWM cycle in 100Hz -> (1640, 8192 - LEDC_DUTY) steps for a 84% ~ 21% dimming (this is the limitation due to the hardware) +// For other targets: +// 100Hz in a 80Hz 8192-step PWM cycle -> (0, 6554) steps for a 100% ~ 0% dimming +// Overall, we want to increase and decrease the brightness in 10 steps, so each step is: +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32H4 || CONFIG_IDF_TARGET_ESP32H21 +#define LEDC_HPOINT_STEP (615) +#else +#define LEDC_HPOINT_STEP (655) +#endif + +// Simulate a signal comes from the 50Hz mains AC supply +// Use GPIO + vTaskDelay to output a 50Hz square wave as the reference signal +static void reference_wave_init(void) +{ + gpio_config_t io_conf = {}; + io_conf.mode = GPIO_MODE_INPUT_OUTPUT; + io_conf.pin_bit_mask = (1ULL << REFERENCE_WAVE_IO); + ESP_ERROR_CHECK(gpio_config(&io_conf)); +} + +static void reference_wave_task(void *arg) +{ + while (1) { + // Set the reference wave high + ESP_ERROR_CHECK(gpio_set_level(REFERENCE_WAVE_IO, 1)); + vTaskDelay(pdMS_TO_TICKS(10)); // High for 10ms + + // Set the reference wave low + ESP_ERROR_CHECK(gpio_set_level(REFERENCE_WAVE_IO, 0)); + vTaskDelay(pdMS_TO_TICKS(10)); // Low for 10ms + } +} + +// Initialize the gate trigger pulse signal using LEDC +static void gate_trigger_pulse_signal_init(void) +{ + ledc_timer_config_t ledc_timer = { + .speed_mode = LEDC_MODE, + .duty_resolution = LEDC_DUTY_RES, + .timer_num = LEDC_TIMER, + .freq_hz = LEDC_FREQUENCY, + .clk_cfg = LEDC_AUTO_CLK + }; + ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); + + ledc_channel_config_t ledc_channel = { + .speed_mode = LEDC_MODE, + .channel = LEDC_CHANNEL, + .timer_sel = LEDC_TIMER, + .gpio_num = GATE_TRIGGER_PULSE_IO, + .duty = LEDC_DUTY, + .hpoint = LEDC_HPOINT_INITIAL + }; + ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); +} + +void app_main(void) +{ + gate_trigger_pulse_signal_init(); + vTaskDelay(pdMS_TO_TICKS(50)); // Wait for the LEDC to run for at least one cycle + + reference_wave_init(); + xTaskCreate(reference_wave_task, "reference_wave_task", 2048, NULL, 5, NULL); + + // Connect reference wave GPIO toggle event to LEDC timer reset task, so that the timing frame of the gate trigger pulse + // can be synchronized to the reference wave signal + esp_etm_channel_config_t etm_config = {}; + esp_etm_channel_handle_t etm_channel = NULL; + ESP_ERROR_CHECK(esp_etm_new_channel(&etm_config, &etm_channel)); + + esp_etm_event_handle_t gpio_event = NULL; + gpio_etm_event_config_t gpio_event_config = { + .edge = GPIO_ETM_EVENT_EDGE_ANY, + }; + ESP_ERROR_CHECK(gpio_new_etm_event(&gpio_event_config, &gpio_event)); + ESP_ERROR_CHECK(gpio_etm_event_bind_gpio(gpio_event, REFERENCE_WAVE_IO)); + + esp_etm_task_handle_t ledc_task = NULL; + ledc_timer_etm_task_config_t ledc_task_config = { + .task_type = LEDC_TIMER_ETM_TASK_RST, + }; + ESP_ERROR_CHECK(ledc_timer_new_etm_task(LEDC_MODE, LEDC_TIMER, &ledc_task_config, &ledc_task)); + + ESP_ERROR_CHECK(esp_etm_channel_connect(etm_channel, gpio_event, ledc_task)); + + ESP_ERROR_CHECK(esp_etm_channel_enable(etm_channel)); + + int cnt = 0; + bool dimming = true; // controls the dimming direction + uint32_t hpoint = LEDC_HPOINT_INITIAL; + while (1) { + vTaskDelay(pdMS_TO_TICKS(2000)); + if (dimming) { + // Decrease brightness + if (cnt < 10) { + hpoint += LEDC_HPOINT_STEP; + cnt++; + } else if (cnt == 10) { + dimming = false; + } + } else { + // Increase brightness + if (cnt > 0) { + hpoint -= LEDC_HPOINT_STEP; + cnt--; + } else if (cnt == 0) { + dimming = true; + } + } + ESP_ERROR_CHECK(ledc_set_duty_with_hpoint(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY, hpoint)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL)); + } +}