From 1138be502e52b5403ca3ef43fa03c0c8c6211ae4 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Wed, 12 May 2021 14:00:58 +0800 Subject: [PATCH] driver/timer: only re-enable alarm in callback when auto reload is true closes https://github.com/espressif/esp-idf/issues/7001 --- components/driver/timer.c | 8 ++++++-- examples/peripherals/timer_group/example_test.py | 6 +----- examples/system/eventfd/main/eventfd_example.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/driver/timer.c b/components/driver/timer.c index b395c787de..38b9f7ded3 100644 --- a/components/driver/timer.c +++ b/components/driver/timer.c @@ -203,8 +203,12 @@ static void IRAM_ATTR timer_isr_default(void *arg) is_awoken = timer_obj->timer_isr_fun.fn(timer_obj->timer_isr_fun.args); //Clear intrrupt status timer_hal_clear_intr_status(&(timer_obj->hal)); - //After the alarm has been triggered, we need enable it again, so it is triggered the next time. - timer_hal_set_alarm_enable(&(timer_obj->hal), TIMER_ALARM_EN); + //If the timer is set to auto reload, we need enable it again, so it is triggered the next time. + if (timer_hal_get_auto_reload(&timer_obj->hal)) { + timer_hal_set_alarm_enable(&(timer_obj->hal), TIMER_ALARM_EN); + } else { + timer_hal_set_alarm_enable(&(timer_obj->hal), TIMER_ALARM_DIS); + } } } TIMER_EXIT_CRITICAL(&timer_spinlock[timer_obj->timer_isr_fun.isr_timer_group]); diff --git a/examples/peripherals/timer_group/example_test.py b/examples/peripherals/timer_group/example_test.py index 068f7931cb..b4d80e1dde 100644 --- a/examples/peripherals/timer_group/example_test.py +++ b/examples/peripherals/timer_group/example_test.py @@ -28,11 +28,7 @@ def test_examples_timergroup(env, extra_data): # type: (Any, Any) -> None dut.expect('Timer Group without auto reload', timeout=5) dut.expect('EVENT TIME') event_time0 = dut.expect(re.compile(r'Time\s+:\s+(\d+\.\d+)\s+s'))[0] - dut.expect('Timer Group without auto reload', timeout=6) - dut.expect('EVENT TIME') - event_time1 = dut.expect(re.compile(r'Time\s+:\s+(\d+\.\d+)\s+s'))[0] - print('event0={}, event1={}'.format(event_time0, event_time1)) - assert float(event_time1) - float(event_time0) < 5.001 + print('event0={}'.format(event_time0)) if __name__ == '__main__': diff --git a/examples/system/eventfd/main/eventfd_example.c b/examples/system/eventfd/main/eventfd_example.c index e7aaa57ab4..688231319f 100644 --- a/examples/system/eventfd/main/eventfd_example.c +++ b/examples/system/eventfd/main/eventfd_example.c @@ -63,7 +63,7 @@ static void eventfd_timer_init(int timer_idx, double timer_interval_sec) .counter_dir = TIMER_COUNT_UP, .counter_en = TIMER_PAUSE, .alarm_en = TIMER_ALARM_EN, - .auto_reload = false, + .auto_reload = true, }; ESP_ERROR_CHECK(timer_init(TIMER_GROUP_0, timer_idx, &config));