STM32: pwm period and prescaler calculation

Correct the while loop limit and add a safe guard to avoid infinite loop.
pull/3930/head
Laurent MEUNIER 2017-02-27 13:47:34 +01:00 committed by Anna Bridge
parent 1f825c1877
commit ae139d6c22
1 changed files with 7 additions and 1 deletions

View File

@ -251,13 +251,19 @@ void pwmout_period_us(pwmout_t* obj, int us)
TimHandle.Init.Period = (us - 1);
/* In case period or pre-scalers are out of range, loop-in to get valid values */
while ((TimHandle.Init.Period > 0xFFFF) || (TimHandle.Init.Period > 0xFFFF)) {
while ((TimHandle.Init.Period > 0xFFFF) || (TimHandle.Init.Prescaler > 0xFFFF)) {
obj->prescaler = obj->prescaler * 2;
if (APBxCLKDivider == RCC_HCLK_DIV1)
TimHandle.Init.Prescaler = (((PclkFreq) / 1000000) * obj->prescaler) - 1;
else
TimHandle.Init.Prescaler = (((PclkFreq * 2) / 1000000) * obj->prescaler) - 1;
TimHandle.Init.Period = (us - 1) / obj->prescaler;
/* Period decreases and prescaler increases over loops, so check for
* possible out of range cases */
if ((TimHandle.Init.Period < 0xFFFF) && (TimHandle.Init.Prescaler > 0xFFFF)) {
error("Cannot initialize PWM\n");
break;
}
}
TimHandle.Init.ClockDivision = 0;