diff --git a/sys/ztimer/periodic.c b/sys/ztimer/periodic.c index ddd82b8d771c7..254d69d1b3d5c 100644 --- a/sys/ztimer/periodic.c +++ b/sys/ztimer/periodic.c @@ -57,18 +57,22 @@ void ztimer_periodic_init(ztimer_clock_t *clock, ztimer_periodic_t *timer, bool (*callback)( void *), void *arg, uint32_t interval) { - ztimer_remove(clock, &timer->timer); + /* check if this is a reinit, ensure timer is stopped in case */ + if (timer->timer.callback == _ztimer_periodic_callback) { + ztimer_periodic_stop(timer); + } *timer = (ztimer_periodic_t){ .clock = clock, .interval = interval, .callback = callback, .arg = arg, .timer = { - .callback = _ztimer_periodic_callback, - .arg = timer + .callback = _ztimer_periodic_callback } }; } void ztimer_periodic_start(ztimer_periodic_t *timer) { + ztimer_periodic_stop(timer); + timer->timer.arg = timer; ztimer_acquire(timer->clock); uint32_t now = ztimer_now(timer->clock); @@ -79,7 +83,9 @@ void ztimer_periodic_start(ztimer_periodic_t *timer) void ztimer_periodic_stop(ztimer_periodic_t *timer) { - ztimer_remove(timer->clock, &timer->timer); - - ztimer_release(timer->clock); + if (timer->timer.arg == timer) { + ztimer_remove(timer->clock, &timer->timer); + ztimer_release(timer->clock); + timer->timer.arg = NULL; + } }