Просмотр исходного кода

driver/timer: only re-enable alarm in callback when auto reload is true

closes https://github.com/espressif/esp-idf/issues/7001
laokaiyao 4 лет назад
Родитель
Сommit
1138be502e

+ 6 - 2
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]);

+ 1 - 5
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__':

+ 1 - 1
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));