33
33
#include "pinmap.h"
34
34
#include "error.h"
35
35
36
+ // TIM5 cannot be used because already used by the us_ticker
36
37
static const PinMap PinMap_PWM [] = {
37
- {PB_3 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH2
38
- {PB_4 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH1
39
- {PB_6 , PWM_4 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM4 )}, // TIM4_CH1
40
- {NC , NC , 0 }
38
+ //{PA_0, PWM_5, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM5)}, // TIM5_CH1
39
+ {PA_1 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH2
40
+ //{PA_1, PWM_5, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM5)}, // TIM5_CH1
41
+ {PA_2 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH3
42
+ //{PA_2, PWM_5, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM5)}, // TIM5_CH3
43
+ //{PA_2, PWM_9, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM9)}, // TIM9_CH1
44
+ {PA_3 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH4
45
+ //{PA_3, PWM_5, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM5)}, // TIM5_CH4
46
+ //{PA_3, PWM_9, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM9)}, // TIM9_CH2
47
+ {PA_6 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH1
48
+ //{PA_6, PWM_10, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM10)}, // TIM10_CH1
49
+ {PA_7 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH2
50
+ //{PA_7, PWM_11, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM11)}, // TIM11_CH1
51
+ {PB_0 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH3
52
+ {PB_1 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH4
53
+ {PB_3 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH2
54
+ {PB_4 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH1
55
+ {PB_5 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH2
56
+ {PB_6 , PWM_4 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM4 )}, // TIM4_CH1
57
+ {PB_7 , PWM_4 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM4 )}, // TIM4_CH2
58
+ {PB_8 , PWM_4 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM4 )}, // TIM4_CH3
59
+ //{PB_8, PWM_10, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM10)}, // TIM10_CH1
60
+ {PB_9 , PWM_4 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM4 )}, // TIM4_CH4
61
+ //{PB_9, PWM_11, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_TIM11)}, // TIM11_CH1
62
+ {PB_10 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH3
63
+ {PB_11 , PWM_2 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM2 )}, // TIM2_CH4
64
+ {PB_12 , PWM_10 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM10 )}, // TIM10_CH1
65
+ {PB_13 , PWM_9 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM9 )}, // TIM9_CH1
66
+ {PB_14 , PWM_9 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM9 )}, // TIM9_CH2
67
+ {PB_15 , PWM_11 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM11 )}, // TIM11_CH1
68
+ {PC_6 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH1
69
+ {PC_7 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH2
70
+ {PC_8 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH3
71
+ {PC_9 , PWM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_UP , GPIO_AF_TIM3 )}, // TIM3_CH4
72
+ {NC , NC , 0 }
41
73
};
42
74
43
75
void pwmout_init (pwmout_t * obj , PinName pin ) {
@@ -52,6 +84,10 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
52
84
if (obj -> pwm == PWM_2 ) RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2 , ENABLE );
53
85
if (obj -> pwm == PWM_3 ) RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3 , ENABLE );
54
86
if (obj -> pwm == PWM_4 ) RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM4 , ENABLE );
87
+ if (obj -> pwm == PWM_5 ) RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM5 , ENABLE );
88
+ if (obj -> pwm == PWM_9 ) RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM9 , ENABLE );
89
+ if (obj -> pwm == PWM_10 ) RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM10 , ENABLE );
90
+ if (obj -> pwm == PWM_11 ) RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM11 , ENABLE );
55
91
56
92
// Configure GPIO
57
93
pinmap_pinout (pin , PinMap_PWM );
@@ -71,7 +107,7 @@ void pwmout_free(pwmout_t* obj) {
71
107
void pwmout_write (pwmout_t * obj , float value ) {
72
108
TIM_TypeDef * tim = (TIM_TypeDef * )(obj -> pwm );
73
109
TIM_OCInitTypeDef TIM_OCInitStructure ;
74
-
110
+
75
111
if (value < 0.0 ) {
76
112
value = 0.0 ;
77
113
} else if (value > 1.0 ) {
@@ -80,21 +116,62 @@ void pwmout_write(pwmout_t* obj, float value) {
80
116
81
117
obj -> pulse = (uint32_t )((float )obj -> period * value );
82
118
83
- TIM_OCInitStructure .TIM_OCMode = TIM_OCMode_PWM1 ;
119
+ TIM_OCInitStructure .TIM_OCMode = TIM_OCMode_PWM1 ;
84
120
TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
85
- TIM_OCInitStructure .TIM_Pulse = obj -> pulse ;
86
- TIM_OCInitStructure .TIM_OCPolarity = TIM_OCPolarity_High ;
87
-
88
- // Configure channel 1
89
- if ((obj -> pin == PB_4 ) || (obj -> pin == PB_6 )) {
90
- TIM_OC1PreloadConfig (tim , TIM_OCPreload_Enable );
91
- TIM_OC1Init (tim , & TIM_OCInitStructure );
92
- }
93
-
94
- // Configure channel 2
95
- if (obj -> pin == PB_3 ) {
96
- TIM_OC2PreloadConfig (tim , TIM_OCPreload_Enable );
97
- TIM_OC2Init (tim , & TIM_OCInitStructure );
121
+ TIM_OCInitStructure .TIM_Pulse = obj -> pulse ;
122
+ TIM_OCInitStructure .TIM_OCPolarity = TIM_OCPolarity_High ;
123
+
124
+ // Configure the channels
125
+ switch (obj -> pin ) {
126
+ // Channels 1
127
+ //case PA_0:
128
+ //case PA_1:
129
+ //case PA_2:
130
+ case PA_6 :
131
+ //case PA_7:
132
+ case PB_4 :
133
+ case PB_6 :
134
+ //case PB_8:
135
+ //case PB_9:
136
+ case PB_12 :
137
+ case PB_13 :
138
+ case PB_15 :
139
+ case PC_6 :
140
+ TIM_OC1PreloadConfig (tim , TIM_OCPreload_Enable );
141
+ TIM_OC1Init (tim , & TIM_OCInitStructure );
142
+ break ;
143
+ // Channels 2
144
+ case PA_1 :
145
+ //case PA_3:
146
+ case PA_7 :
147
+ case PB_3 :
148
+ case PB_5 :
149
+ case PB_7 :
150
+ case PB_14 :
151
+ case PC_7 :
152
+ TIM_OC2PreloadConfig (tim , TIM_OCPreload_Enable );
153
+ TIM_OC2Init (tim , & TIM_OCInitStructure );
154
+ break ;
155
+ // Channels 3
156
+ case PA_2 :
157
+ case PB_0 :
158
+ case PB_8 :
159
+ case PB_10 :
160
+ case PC_8 :
161
+ TIM_OC3PreloadConfig (tim , TIM_OCPreload_Enable );
162
+ TIM_OC3Init (tim , & TIM_OCInitStructure );
163
+ break ;
164
+ // Channels 4
165
+ case PA_3 :
166
+ case PB_1 :
167
+ case PB_9 :
168
+ case PB_11 :
169
+ case PC_9 :
170
+ TIM_OC4PreloadConfig (tim , TIM_OCPreload_Enable );
171
+ TIM_OC4Init (tim , & TIM_OCInitStructure );
172
+ break ;
173
+ default :
174
+ return ;
98
175
}
99
176
}
100
177
@@ -123,10 +200,10 @@ void pwmout_period_us(pwmout_t* obj, int us) {
123
200
124
201
obj -> period = us ;
125
202
126
- TIM_TimeBaseStructure .TIM_Period = obj -> period - 1 ;
127
- TIM_TimeBaseStructure .TIM_Prescaler = (uint16_t )(SystemCoreClock / 1000000 ) - 1 ; // 1 µs tick
203
+ TIM_TimeBaseStructure .TIM_Period = obj -> period - 1 ;
204
+ TIM_TimeBaseStructure .TIM_Prescaler = (uint16_t )(SystemCoreClock / 1000000 ) - 1 ; // 1 µs tick
128
205
TIM_TimeBaseStructure .TIM_ClockDivision = 0 ;
129
- TIM_TimeBaseStructure .TIM_CounterMode = TIM_CounterMode_Up ;
206
+ TIM_TimeBaseStructure .TIM_CounterMode = TIM_CounterMode_Up ;
130
207
TIM_TimeBaseInit (tim , & TIM_TimeBaseStructure );
131
208
132
209
// Set duty cycle again
0 commit comments