Skip to content

Commit 53b5432

Browse files
committed
Merge pull request #1706 from LMESTM/fix_pwmout
Fix pwmout for STM32F3
2 parents 860fdd2 + c5c95d1 commit 53b5432

File tree

8 files changed

+30
-6
lines changed

8 files changed

+30
-6
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/TARGET_DISCO_F303VC/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct i2c_s {
9999
struct pwmout_s {
100100
PWMName pwm;
101101
PinName pin;
102+
uint32_t prescaler;
102103
uint32_t period;
103104
uint32_t pulse;
104105
uint32_t channel;

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/TARGET_DISCO_F334C8/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct i2c_s {
9999
struct pwmout_s {
100100
PWMName pwm;
101101
PinName pin;
102+
uint32_t prescaler;
102103
uint32_t period;
103104
uint32_t pulse;
104105
uint32_t channel;

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/TARGET_NUCLEO_F302R8/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct i2c_s {
9999
struct pwmout_s {
100100
PWMName pwm;
101101
PinName pin;
102+
uint32_t prescaler;
102103
uint32_t period;
103104
uint32_t pulse;
104105
uint32_t channel;

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/TARGET_NUCLEO_F303K8/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct i2c_s {
9999
struct pwmout_s {
100100
PWMName pwm;
101101
PinName pin;
102+
uint32_t prescaler;
102103
uint32_t period;
103104
uint32_t pulse;
104105
uint32_t channel;

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/TARGET_NUCLEO_F303RE/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct i2c_s {
9999
struct pwmout_s {
100100
PWMName pwm;
101101
PinName pin;
102+
uint32_t prescaler;
102103
uint32_t period;
103104
uint32_t pulse;
104105
uint32_t channel;

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/TARGET_NUCLEO_F334R8/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct i2c_s {
9999
struct pwmout_s {
100100
PWMName pwm;
101101
PinName pin;
102+
uint32_t prescaler;
102103
uint32_t period;
103104
uint32_t pulse;
104105
uint32_t channel;

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/pwmout_api.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void pwmout_write(pwmout_t* obj, float value)
9696

9797
// Configure channels
9898
sConfig.OCMode = TIM_OCMODE_PWM1;
99-
sConfig.Pulse = obj->pulse;
99+
sConfig.Pulse = obj->pulse / obj->prescaler;
100100
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
101101
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
102102
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
@@ -161,8 +161,26 @@ void pwmout_period_us(pwmout_t* obj, int us)
161161
// Update the SystemCoreClock variable
162162
SystemCoreClockUpdate();
163163

164-
TimHandle.Init.Period = us - 1;
165-
TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
164+
/* To make it simple, we use to possible prescaler values which lead to:
165+
* pwm unit = 1us, period/pulse can be from 1us to 65535us
166+
* or
167+
* pwm unit = 500us, period/pulse can be from 500us to ~32.76sec
168+
* Be careful that all the channels of a PWM shares the same prescaler
169+
*/
170+
if (us > 0xFFFF) {
171+
obj->prescaler = 500;
172+
} else {
173+
obj->prescaler = 1;
174+
}
175+
TimHandle.Init.Prescaler = ((SystemCoreClock / 1000000) * obj->prescaler) - 1;
176+
177+
if (TimHandle.Init.Prescaler > 0xFFFF)
178+
error("PWM: out of range prescaler");
179+
180+
TimHandle.Init.Period = (us - 1) / obj->prescaler;
181+
if (TimHandle.Init.Period > 0xFFFF)
182+
error("PWM: out of range period");
183+
166184
TimHandle.Init.ClockDivision = 0;
167185
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
168186

libraries/tests/mbed/pwm/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ float value = 0.75;
1919
int main() {
2020
#if defined(TARGET_FF_ARDUINO)
2121
PwmOut pwm(D9);
22+
int period_ms = 10;
2223

23-
pwm.period_ms(10);
24+
pwm.period_ms(period_ms);
2425
pwm.write(value);
2526

2627
float result = floor(pwm.read() * 100 + 0.5) / 100; // round it to 0.xx
27-
printf("Initialize PWM on pin D9 with duty cycle: %.2f\n", result);
28+
printf("PWM period = %dms with duty cycle: %d%%\n", period_ms, (int) (result * 100));
2829

2930
notify_completion(result == value ? true : false);
30-
3131
#elif defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) || defined(TARGET_LPC2460)
3232
PwmOut pwm_p25(p25);
3333
PwmOut pwm_p26(p26);

0 commit comments

Comments
 (0)