stm32/timer: Fix Timer.freq() calc so mult doesn't overflow uint32_t.
Fixes issue #5280.
This commit is contained in:
parent
4e1b03d45c
commit
9ec73aedb4
|
@ -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 prescaler = self->tim.Instance->PSC & 0xffff;
|
||||||
uint32_t period = __HAL_TIM_GET_AUTORELOAD(&self->tim) & TIMER_CNT_MASK(self);
|
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 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 MICROPY_PY_BUILTINS_FLOAT
|
||||||
if (source_freq % divide != 0) {
|
if (source_freq % divide_a != 0) {
|
||||||
return mp_obj_new_float((float)source_freq / (float)divide);
|
return mp_obj_new_float((mp_float_t)source_freq / (mp_float_t)divide_a / (mp_float_t)divide_b);
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return mp_obj_new_int(source_freq / divide);
|
|
||||||
}
|
}
|
||||||
|
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 {
|
} else {
|
||||||
// set
|
// set
|
||||||
uint32_t period;
|
uint32_t period;
|
||||||
|
|
|
@ -11,3 +11,9 @@ tim.prescaler(300)
|
||||||
print(tim.prescaler())
|
print(tim.prescaler())
|
||||||
tim.period(400)
|
tim.period(400)
|
||||||
print(tim.period())
|
print(tim.period())
|
||||||
|
|
||||||
|
# Setting and printing frequency
|
||||||
|
tim = Timer(2, freq=100)
|
||||||
|
print(tim.freq())
|
||||||
|
tim.freq(0.001)
|
||||||
|
print(tim.freq())
|
||||||
|
|
|
@ -2,3 +2,5 @@
|
||||||
200
|
200
|
||||||
300
|
300
|
||||||
400
|
400
|
||||||
|
100
|
||||||
|
0.001
|
||||||
|
|
Loading…
Reference in New Issue