From 476dc6e46ac42f00621d63377d33bdb4a1925b9c Mon Sep 17 00:00:00 2001 From: Steven Cooreman Date: Tue, 9 Jul 2019 22:38:53 +0100 Subject: [PATCH] Fix for PWM output found by testing against FPGA shield Two issues: * Downcasting too early * Potential for a uint32_t overflow in an intermediate calculation Passing test requires #11005 to be merged. --- targets/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c b/targets/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c index eaeac2ad57..a733f875d4 100644 --- a/targets/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c +++ b/targets/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c @@ -342,13 +342,13 @@ void pwmout_pulsewidth(pwmout_t *obj, float seconds) void pwmout_pulsewidth_ms(pwmout_t *obj, int ms) { - uint16_t width_cycles = (uint16_t) ((REFERENCE_FREQUENCY >> pwm_prescaler_div) * ms) / 1000; + uint16_t width_cycles = (uint16_t) (((REFERENCE_FREQUENCY >> pwm_prescaler_div) * ms) / 1000); TIMER_CompareBufSet(PWM_TIMER, obj->channel, width_cycles); } void pwmout_pulsewidth_us(pwmout_t *obj, int us) { - uint16_t width_cycles = (uint16_t) ((REFERENCE_FREQUENCY >> pwm_prescaler_div) * us) / 1000000; + uint16_t width_cycles = (uint16_t) (((uint64_t)(REFERENCE_FREQUENCY >> pwm_prescaler_div) * (uint64_t)us) / 1000000UL); TIMER_CompareBufSet(PWM_TIMER, obj->channel, width_cycles); }