From 9f50fb8543362a37006958e6682a2b2d10d6cb41 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Fri, 3 Apr 2026 15:05:26 +0800 Subject: [PATCH] fix(ledc): wrong interrupt status handling in ISR could cause INT WDT Introduced in 88b62b19fd24c5d775f4b8b306c05a641f5d27eb --- components/esp_driver_ledc/src/ledc.c | 2 +- .../ledc/ledc_fade/pytest_ledc_fade.py | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py diff --git a/components/esp_driver_ledc/src/ledc.c b/components/esp_driver_ledc/src/ledc.c index 587a1fc8797..d37ebf45a53 100644 --- a/components/esp_driver_ledc/src/ledc.c +++ b/components/esp_driver_ledc/src/ledc.c @@ -1206,7 +1206,7 @@ static void IRAM_ATTR ledc_fade_isr(void *arg) continue; } intr_status = ledc_ll_get_intr_status(p_ledc_obj[speed_mode]->ledc_hal.dev) & LEDC_LL_DUTY_CHANGE_END_INTR_MASK(speed_mode); - intr_status >>= __builtin_ctzll(intr_status); + intr_status >>= __builtin_ctzll(LEDC_LL_DUTY_CHANGE_END_INTR_MASK(speed_mode)); while (intr_status) { ledc_calc_fade_end_channel(&intr_status, &channel); diff --git a/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py b/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py new file mode 100644 index 00000000000..ff56ec35933 --- /dev/null +++ b/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded_idf import IdfDut +from pytest_embedded_idf.utils import idf_parametrize +from pytest_embedded_idf.utils import soc_filtered_targets + + +@pytest.mark.generic +@idf_parametrize('target', soc_filtered_targets('SOC_LEDC_SUPPORTED == 1'), indirect=['target']) +def test_ledc_fade_example(dut: IdfDut) -> None: + # repeat to test at least two rounds of fade + dut.expect_exact('1. LEDC fade up to duty = 4000') + dut.expect_exact('2. LEDC fade down to duty = 0') + dut.expect_exact('3. LEDC set duty = 4000 without fade') + dut.expect_exact('4. LEDC set duty = 0 without fade') + dut.expect_exact('1. LEDC fade up to duty = 4000') + dut.expect_exact('2. LEDC fade down to duty = 0') + dut.expect_exact('3. LEDC set duty = 4000 without fade') + dut.expect_exact('4. LEDC set duty = 0 without fade')