From b6fbdb2f7928bc833737c913f60d98159a6d7909 Mon Sep 17 00:00:00 2001 From: Ian Martin Date: Tue, 1 Mar 2016 15:18:04 -0500 Subject: [PATCH] Avoid rounding errors during frequency scaling. --- cpu/cc2538/periph/timer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpu/cc2538/periph/timer.c b/cpu/cc2538/periph/timer.c index f98a659669..d4ba03db9b 100644 --- a/cpu/cc2538/periph/timer.c +++ b/cpu/cc2538/periph/timer.c @@ -144,6 +144,7 @@ int timer_set(tim_t dev, int channel, unsigned int timeout) uint64_t scaled_value = timeout; scaled_value *= RCOSC16M_FREQ; + scaled_value += config_freq[dev] / 2; scaled_value /= config_freq[dev]; gptimer->TAMATCHR = gptimer->TAV + scaled_value; @@ -192,6 +193,7 @@ int timer_set_absolute(tim_t dev, int channel, unsigned int value) uint64_t scaled_value = value; scaled_value *= config_freq[dev]; + scaled_value += RCOSC16M_FREQ / 2; scaled_value /= RCOSC16M_FREQ; gptimer->TAMATCHR = (scaled_value > UINT32_MAX)? UINT32_MAX : scaled_value;