Skip to content

Commit 46057c5

Browse files
authored
Merge pull request #2103 from LMESTM/fix_pwmout_period
Fix pwmout period
2 parents 3d20b10 + 6dc9501 commit 46057c5

File tree

63 files changed

+708
-456
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+708
-456
lines changed

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_DISCO_F051R8/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,7 @@ struct i2c_s {
9393
I2CName i2c;
9494
};
9595

96-
struct pwmout_s {
97-
PWMName pwm;
98-
PinName pin;
99-
uint32_t period;
100-
uint32_t pulse;
101-
};
102-
96+
#include "common_objects.h"
10397
#include "gpio_object.h"
10498

10599
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F030R8/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,7 @@ struct i2c_s {
8888
I2CName i2c;
8989
};
9090

91-
struct pwmout_s {
92-
PWMName pwm;
93-
PinName pin;
94-
uint32_t period;
95-
uint32_t pulse;
96-
};
97-
91+
#include "common_objects.h"
9892
#include "gpio_object.h"
9993

10094
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F031K6/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,7 @@ struct i2c_s {
8888
I2CName i2c;
8989
};
9090

91-
struct pwmout_s {
92-
PWMName pwm;
93-
PinName pin;
94-
uint32_t period;
95-
uint32_t pulse;
96-
};
97-
91+
#include "common_objects.h"
9892
#include "gpio_object.h"
9993

10094
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F042K6/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,12 @@ struct i2c_s {
8888
I2CName i2c;
8989
};
9090

91-
struct pwmout_s {
92-
PWMName pwm;
93-
PinName pin;
94-
uint32_t period;
95-
uint32_t pulse;
96-
};
97-
9891
struct can_s {
9992
CANName can;
10093
int index;
10194
};
10295

96+
#include "common_objects.h"
10397
#include "gpio_object.h"
10498

10599
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F070RB/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,7 @@ struct i2c_s {
8888
I2CName i2c;
8989
};
9090

91-
struct pwmout_s {
92-
PWMName pwm;
93-
PinName pin;
94-
uint32_t period;
95-
uint32_t pulse;
96-
};
97-
91+
#include "common_objects.h"
9892
#include "gpio_object.h"
9993

10094
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F072RB/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,12 @@ struct i2c_s {
9393
I2CName i2c;
9494
};
9595

96-
struct pwmout_s {
97-
PWMName pwm;
98-
PinName pin;
99-
uint32_t period;
100-
uint32_t pulse;
101-
};
102-
10396
struct can_s {
10497
CANName can;
10598
int index;
10699
};
107100

101+
#include "common_objects.h"
108102
#include "gpio_object.h"
109103

110104
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F091RC/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,12 @@ struct i2c_s {
9393
I2CName i2c;
9494
};
9595

96-
struct pwmout_s {
97-
PWMName pwm;
98-
PinName pin;
99-
uint32_t period;
100-
uint32_t pulse;
101-
};
102-
10396
struct can_s {
10497
CANName can;
10598
int index;
10699
};
107100

101+
#include "common_objects.h"
108102
#include "gpio_object.h"
109103

110104
#ifdef __cplusplus
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/* mbed Microcontroller Library
2+
*******************************************************************************
3+
* Copyright (c) 2016, STMicroelectronics
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are met:
8+
*
9+
* 1. Redistributions of source code must retain the above copyright notice,
10+
* this list of conditions and the following disclaimer.
11+
* 2. Redistributions in binary form must reproduce the above copyright notice,
12+
* this list of conditions and the following disclaimer in the documentation
13+
* and/or other materials provided with the distribution.
14+
* 3. Neither the name of STMicroelectronics nor the names of its contributors
15+
* may be used to endorse or promote products derived from this software
16+
* without specific prior written permission.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
*******************************************************************************
29+
*/
30+
#ifndef MBED_COMMON_OBJECTS_H
31+
#define MBED_COMMON_OBJECTS_H
32+
33+
#include "cmsis.h"
34+
#include "PortNames.h"
35+
#include "PeripheralNames.h"
36+
#include "PinNames.h"
37+
38+
#ifdef __cplusplus
39+
extern "C" {
40+
#endif
41+
42+
struct pwmout_s {
43+
PWMName pwm;
44+
PinName pin;
45+
uint32_t prescaler;
46+
uint32_t period;
47+
uint32_t pulse;
48+
};
49+
50+
#include "gpio_object.h"
51+
52+
#ifdef __cplusplus
53+
}
54+
#endif
55+
56+
#endif
57+

hal/targets/hal/TARGET_STM/TARGET_STM32F0/pwmout_api.c

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
7575
obj->pin = pin;
7676
obj->period = 0;
7777
obj->pulse = 0;
78+
obj->prescaler = 1;
7879

7980
pwmout_period_us(obj, 20000); // 20 ms per default
8081
}
@@ -101,7 +102,7 @@ void pwmout_write(pwmout_t* obj, float value) {
101102

102103
// Configure channels
103104
sConfig.OCMode = TIM_OCMODE_PWM1;
104-
sConfig.Pulse = obj->pulse;
105+
sConfig.Pulse = obj->pulse / obj->prescaler;
105106
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
106107
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
107108
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
@@ -265,18 +266,39 @@ void pwmout_period_us(pwmout_t* obj, int us) {
265266
// Update the SystemCoreClock variable
266267
SystemCoreClockUpdate();
267268

268-
TimHandle.Init.Period = us - 1;
269-
TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
269+
/* To make it simple, we use to possible prescaler values which lead to:
270+
* pwm unit = 1us, period/pulse can be from 1us to 65535us
271+
* or
272+
* pwm unit = 500us, period/pulse can be from 500us to ~32.76sec
273+
* Be careful that all the channels of a PWM shares the same prescaler
274+
*/
275+
if (us > 0xFFFF) {
276+
obj->prescaler = 500;
277+
} else {
278+
obj->prescaler = 1;
279+
}
280+
TimHandle.Init.Prescaler = ((SystemCoreClock / 1000000) * obj->prescaler) - 1;
281+
282+
if (TimHandle.Init.Prescaler > 0xFFFF)
283+
error("PWM: out of range prescaler");
284+
285+
TimHandle.Init.Period = (us - 1) / obj->prescaler;
286+
if (TimHandle.Init.Period > 0xFFFF)
287+
error("PWM: out of range period");
288+
270289
TimHandle.Init.ClockDivision = 0;
271290
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
272-
HAL_TIM_PWM_Init(&TimHandle);
273291

274-
// Set duty cycle again
275-
pwmout_write(obj, dc);
292+
if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) {
293+
error("Cannot initialize PWM");
294+
}
276295

277296
// Save for future use
278297
obj->period = us;
279298

299+
// Set duty cycle again
300+
pwmout_write(obj, dc);
301+
280302
__HAL_TIM_ENABLE(&TimHandle);
281303
}
282304

hal/targets/hal/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,13 @@ struct i2c_s {
8989
uint32_t slave;
9090
};
9191

92-
struct pwmout_s {
93-
PWMName pwm;
94-
PinName pin;
95-
uint32_t period;
96-
uint32_t pulse;
97-
};
98-
9992
struct can_s {
10093
CANName can;
10194
int index;
10295
};
10396

10497
#include "gpio_object.h"
98+
#include "common_objects.h"
10599

106100
#ifdef __cplusplus
107101
}

hal/targets/hal/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,7 @@ struct i2c_s {
8989
uint32_t slave;
9090
};
9191

92-
struct pwmout_s {
93-
PWMName pwm;
94-
PinName pin;
95-
uint32_t period;
96-
uint32_t pulse;
97-
};
98-
92+
#include "common_objects.h"
9993
#include "gpio_object.h"
10094

10195
#ifdef __cplusplus

hal/targets/hal/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/objects.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,12 @@ struct i2c_s {
8989
uint32_t slave;
9090
};
9191

92-
struct pwmout_s {
93-
PWMName pwm;
94-
PinName pin;
95-
uint32_t period;
96-
uint32_t pulse;
97-
};
98-
9992
struct can_s {
10093
CANName can;
10194
int index;
10295
};
10396

97+
#include "common_objects.h"
10498
#include "gpio_object.h"
10599

106100
#ifdef __cplusplus
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/* mbed Microcontroller Library
2+
*******************************************************************************
3+
* Copyright (c) 2016, STMicroelectronics
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are met:
8+
*
9+
* 1. Redistributions of source code must retain the above copyright notice,
10+
* this list of conditions and the following disclaimer.
11+
* 2. Redistributions in binary form must reproduce the above copyright notice,
12+
* this list of conditions and the following disclaimer in the documentation
13+
* and/or other materials provided with the distribution.
14+
* 3. Neither the name of STMicroelectronics nor the names of its contributors
15+
* may be used to endorse or promote products derived from this software
16+
* without specific prior written permission.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
*******************************************************************************
29+
*/
30+
#ifndef MBED_COMMON_OBJECTS_H
31+
#define MBED_COMMON_OBJECTS_H
32+
33+
#include "cmsis.h"
34+
#include "PortNames.h"
35+
#include "PeripheralNames.h"
36+
#include "PinNames.h"
37+
38+
#ifdef __cplusplus
39+
extern "C" {
40+
#endif
41+
42+
struct pwmout_s {
43+
PWMName pwm;
44+
PinName pin;
45+
uint32_t prescaler;
46+
uint32_t period;
47+
uint32_t pulse;
48+
};
49+
50+
#include "gpio_object.h"
51+
52+
#ifdef __cplusplus
53+
}
54+
#endif
55+
56+
#endif
57+

0 commit comments

Comments
 (0)