34
34
#include "error.h"
35
35
#include "stm32f4xx_hal.h"
36
36
37
+ // TIM5 cannot be used because already used by the us_ticker
37
38
static const PinMap PinMap_PWM [] = {
38
- {PB_3 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH2
39
- {PB_4 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH1
40
- {PB_6 , PWM_4 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM4 )}, // TIM4_CH1
39
+ {PA_0 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH1
40
+ //{PA_0, PWM_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5)}, // TIM5_CH1
41
+ {PA_1 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH2
42
+ //{PA_1, PWM_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5)}, // TIM5_CH2
43
+ {PA_2 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH3
44
+ //{PA_2, PWM_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5)}, // TIM5_CH3
45
+ //{PA_2, PWM_9, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9)}, // TIM9_CH1
46
+ {PA_3 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH3
47
+ //{PA_3, PWM_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5)}, // TIM5_CH4
48
+ //{PA_3, PWM_9, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9)}, // TIM9_CH2
49
+ {PA_5 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH1
50
+ {PA_6 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH1
51
+ {PA_7 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH1N
52
+ //{PA_7, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2
53
+ {PA_8 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH1
54
+ {PA_9 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH2
55
+ {PA_10 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH3
56
+ {PA_11 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH4
57
+ {PA_15 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH1
58
+
59
+ {PB_0 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH2N
60
+ //{PB_0, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH3
61
+ {PB_1 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH3N
62
+ //{PB_1, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH4
63
+ {PB_3 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH2
64
+ {PB_4 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH1
65
+ {PB_5 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH2
66
+ {PB_6 , PWM_4 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM4 )}, // TIM4_CH1
67
+ {PB_7 , PWM_4 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM4 )}, // TIM4_CH2
68
+ {PB_8 , PWM_4 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM4 )}, // TIM4_CH3
69
+ //{PB_8, PWM_10,STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10)}, // TIM10_CH1
70
+ {PB_9 , PWM_4 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM4 )}, // TIM4_CH4
71
+ //{PB_9, PWM_11,STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11)}, // TIM11_CH1
72
+ {PB_10 , PWM_2 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM2 )}, // TIM2_CH3
73
+ {PB_13 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH1N
74
+ {PB_14 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH2N
75
+ {PB_15 , PWM_1 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF1_TIM1 )}, // TIM1_CH3N
76
+
77
+ {PC_6 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH1
78
+ {PC_7 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH2
79
+ {PC_8 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH3
80
+ {PC_9 , PWM_3 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_AF2_TIM3 )}, // TIM3_CH3
81
+
41
82
{NC , NC , 0 }
42
83
};
43
84
@@ -52,9 +93,13 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
52
93
}
53
94
54
95
// Enable TIM clock
96
+ if (obj -> pwm == PWM_1 ) __TIM1_CLK_ENABLE ();
55
97
if (obj -> pwm == PWM_2 ) __TIM2_CLK_ENABLE ();
56
98
if (obj -> pwm == PWM_3 ) __TIM3_CLK_ENABLE ();
57
99
if (obj -> pwm == PWM_4 ) __TIM4_CLK_ENABLE ();
100
+ if (obj -> pwm == PWM_9 ) __TIM9_CLK_ENABLE ();
101
+ if (obj -> pwm == PWM_10 ) __TIM10_CLK_ENABLE ();
102
+ if (obj -> pwm == PWM_11 ) __TIM11_CLK_ENABLE ();
58
103
59
104
// Configure GPIO
60
105
pinmap_pinout (pin , PinMap_PWM );
@@ -76,7 +121,9 @@ void pwmout_free(pwmout_t* obj) {
76
121
77
122
void pwmout_write (pwmout_t * obj , float value ) {
78
123
TIM_OC_InitTypeDef sConfig ;
79
-
124
+ int channel = 0 ;
125
+ int complementary_channel = 0 ;
126
+
80
127
TimHandle .Instance = (TIM_TypeDef * )(obj -> pwm );
81
128
82
129
if (value < (float )0.0 ) {
@@ -86,21 +133,89 @@ void pwmout_write(pwmout_t* obj, float value) {
86
133
}
87
134
88
135
obj -> pulse = (uint32_t )((float )obj -> period * value );
89
-
90
- sConfig .OCMode = TIM_OCMODE_PWM1 ;
91
- sConfig .OCFastMode = TIM_OCFAST_DISABLE ;
92
- sConfig .OCPolarity = TIM_OCPOLARITY_HIGH ;
93
- sConfig .Pulse = obj -> pulse ;
94
-
95
- if (obj -> pin == PB_3 ) {
96
- HAL_TIM_PWM_ConfigChannel (& TimHandle , & sConfig , TIM_CHANNEL_2 );
97
- HAL_TIM_PWM_Start (& TimHandle , TIM_CHANNEL_2 );
136
+
137
+ // Configure channels
138
+ sConfig .OCMode = TIM_OCMODE_PWM1 ;
139
+ sConfig .Pulse = obj -> pulse ;
140
+ sConfig .OCPolarity = TIM_OCPOLARITY_HIGH ;
141
+ sConfig .OCNPolarity = TIM_OCNPOLARITY_HIGH ;
142
+ sConfig .OCFastMode = TIM_OCFAST_DISABLE ;
143
+ sConfig .OCIdleState = TIM_OCIDLESTATE_RESET ;
144
+ sConfig .OCNIdleState = TIM_OCNIDLESTATE_RESET ;
145
+
146
+ switch (obj -> pin ) {
147
+ // Channels 1
148
+ case PA_0 :
149
+ //case PA_2:
150
+ case PA_5 :
151
+ case PA_6 :
152
+ case PA_8 :
153
+ case PA_15 :
154
+ case PB_4 :
155
+ case PB_6 :
156
+ //case PB_8:
157
+ //case PB_9:
158
+ case PC_6 :
159
+ channel = TIM_CHANNEL_1 ;
160
+ break ;
161
+ // Channels 1N
162
+ case PA_7 :
163
+ case PB_13 :
164
+ channel = TIM_CHANNEL_1 ;
165
+ complementary_channel = 1 ;
166
+ break ;
167
+ // Channels 2
168
+ case PA_1 :
169
+ //case PA_3:
170
+ //case PA_7:
171
+ case PA_9 :
172
+ case PB_3 :
173
+ case PB_5 :
174
+ case PB_7 :
175
+ case PC_7 :
176
+ channel = TIM_CHANNEL_2 ;
177
+ break ;
178
+ // Channels 2N
179
+ case PB_0 :
180
+ case PB_14 :
181
+ channel = TIM_CHANNEL_2 ;
182
+ complementary_channel = 1 ;
183
+ break ;
184
+ // Channels 3
185
+ case PA_2 :
186
+ case PA_3 :
187
+ case PA_10 :
188
+ //case PB_0:
189
+ case PB_8 :
190
+ case PB_10 :
191
+ case PC_8 :
192
+ case PC_9 :
193
+ channel = TIM_CHANNEL_3 ;
194
+ break ;
195
+ // Channels 3N
196
+ case PB_1 :
197
+ case PB_15 :
198
+ channel = TIM_CHANNEL_3 ;
199
+ complementary_channel = 1 ;
200
+ break ;
201
+ // Channels 4
202
+ //case PA_3:
203
+ case PA_11 :
204
+ //case PB_1:
205
+ case PB_9 :
206
+ channel = TIM_CHANNEL_4 ;
207
+ break ;
208
+ default :
209
+ return ;
98
210
}
99
211
100
- if ((obj -> pin == PB_4 ) || (obj -> pin == PB_6 )) {
101
- HAL_TIM_PWM_ConfigChannel (& TimHandle , & sConfig , TIM_CHANNEL_1 );
102
- HAL_TIM_PWM_Start (& TimHandle , TIM_CHANNEL_1 );
103
- }
212
+ HAL_TIM_PWM_ConfigChannel (& TimHandle , & sConfig , channel );
213
+ if (complementary_channel ) {
214
+ HAL_TIMEx_PWMN_Start (& TimHandle , channel );
215
+ }
216
+ else {
217
+ HAL_TIM_PWM_Start (& TimHandle , channel );
218
+ }
104
219
}
105
220
106
221
float pwmout_read (pwmout_t * obj ) {
0 commit comments