summaryrefslogtreecommitdiff
path: root/ports/stm32/timer.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2019-10-31 12:49:18 +1100
committerDamien George <damien.p.george@gmail.com>2019-10-31 12:49:18 +1100
commit9ec73aedb4fedafce93a018c26cfbc79686be34b (patch)
treeea19043d155b3aaeebf6fdead9ba1f815bdd221e /ports/stm32/timer.c
parent4e1b03d45c4d6be9ad9615f63a1146c46a4136d7 (diff)
stm32/timer: Fix Timer.freq() calc so mult doesn't overflow uint32_t.
Fixes issue #5280.
Diffstat (limited to 'ports/stm32/timer.c')
-rw-r--r--ports/stm32/timer.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/ports/stm32/timer.c b/ports/stm32/timer.c
index 3b9f1dc40..834ebd9c8 100644
--- a/ports/stm32/timer.c
+++ b/ports/stm32/timer.c
@@ -1269,15 +1269,21 @@ STATIC mp_obj_t pyb_timer_freq(size_t n_args, const mp_obj_t *args) {
uint32_t prescaler = self->tim.Instance->PSC & 0xffff;
uint32_t period = __HAL_TIM_GET_AUTORELOAD(&self->tim) & TIMER_CNT_MASK(self);
uint32_t source_freq = timer_get_source_freq(self->tim_id);
- uint32_t divide = ((prescaler + 1) * (period + 1));
+ uint32_t divide_a = prescaler + 1;
+ uint32_t divide_b = period + 1;
#if MICROPY_PY_BUILTINS_FLOAT
- if (source_freq % divide != 0) {
- return mp_obj_new_float((float)source_freq / (float)divide);
- } else
- #endif
- {
- return mp_obj_new_int(source_freq / divide);
+ if (source_freq % divide_a != 0) {
+ return mp_obj_new_float((mp_float_t)source_freq / (mp_float_t)divide_a / (mp_float_t)divide_b);
}
+ source_freq /= divide_a;
+ if (source_freq % divide_b != 0) {
+ return mp_obj_new_float((mp_float_t)source_freq / (mp_float_t)divide_b);
+ } else {
+ return mp_obj_new_int(source_freq / divide_b);
+ }
+ #else
+ return mp_obj_new_int(source_freq / divide_a / divide_b);
+ #endif
} else {
// set
uint32_t period;