Skip to content

Commit ae139d6

Browse files
LMESTMadbridge
authored andcommitted
STM32: pwm period and prescaler calculation
Correct the while loop limit and add a safe guard to avoid infinite loop.
1 parent 1f825c1 commit ae139d6

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

targets/TARGET_STM/pwmout_api.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,19 @@ void pwmout_period_us(pwmout_t* obj, int us)
251251
TimHandle.Init.Period = (us - 1);
252252

253253
/* In case period or pre-scalers are out of range, loop-in to get valid values */
254-
while ((TimHandle.Init.Period > 0xFFFF) || (TimHandle.Init.Period > 0xFFFF)) {
254+
while ((TimHandle.Init.Period > 0xFFFF) || (TimHandle.Init.Prescaler > 0xFFFF)) {
255255
obj->prescaler = obj->prescaler * 2;
256256
if (APBxCLKDivider == RCC_HCLK_DIV1)
257257
TimHandle.Init.Prescaler = (((PclkFreq) / 1000000) * obj->prescaler) - 1;
258258
else
259259
TimHandle.Init.Prescaler = (((PclkFreq * 2) / 1000000) * obj->prescaler) - 1;
260260
TimHandle.Init.Period = (us - 1) / obj->prescaler;
261+
/* Period decreases and prescaler increases over loops, so check for
262+
* possible out of range cases */
263+
if ((TimHandle.Init.Period < 0xFFFF) && (TimHandle.Init.Prescaler > 0xFFFF)) {
264+
error("Cannot initialize PWM\n");
265+
break;
266+
}
261267
}
262268

263269
TimHandle.Init.ClockDivision = 0;

0 commit comments

Comments
 (0)