33
33
#include "pinmap.h"
34
34
#include "error.h"
35
35
36
+ // TIM1 cannot be used because already used by the us_ticker
36
37
static const PinMap PinMap_PWM [] = {
37
- {PA_7 , TIM_14 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_4 )}, // TIM14_CH1
38
+ {PA_4 , TIM_14 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_4 )}, // TIM14_CH1
39
+ {PA_6 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM3_CH1
40
+ // {PA_6, TIM_16, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_5)}, // TIM16_CH1
41
+ {PA_7 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM3_CH1
42
+ // {PA_7, TIM_14, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_4)}, // TIM14_CH1
43
+ // {PA_7, TIM_17, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_5)}, // TIM17_CH1
44
+ {PB_0 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM3_CH3
45
+ {PB_1 , TIM_14 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_0 )}, // TIM14_CH1
46
+ // {PB_1, TIM_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_1)}, // TIM3_CH4
47
+ {PB_4 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM3_CH1
48
+ {PB_5 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM3_CH2
49
+ {PB_6 , TIM_16 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_2 )}, // TIM16_CH1N
50
+ {PB_7 , TIM_17 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_2 )}, // TIM17_CH1N
51
+ {PB_8 , TIM_16 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_2 )}, // TIM16_CH1
52
+ {PB_9 , TIM_17 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_2 )}, // TIM17_CH1
53
+ {PB_14 , TIM_15 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM15_CH1
54
+ {PB_15 , TIM_15 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_1 )}, // TIM15_CH2
55
+ // {PB_15, TIM_15, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_3)}, // TIM15_CH1N
56
+ {PC_6 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_0 )}, // TIM3_CH1
38
57
{PC_7 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_0 )}, // TIM3_CH2
39
- {PB_6 , TIM_16 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_2 )}, // TIM16_CH1N --> FAIL
58
+ {PC_8 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_0 )}, // TIM3_CH3
59
+ {PC_9 , TIM_3 , STM_PIN_DATA (GPIO_Mode_AF , GPIO_OType_PP , GPIO_PuPd_NOPULL , GPIO_AF_0 )}, // TIM3_CH4
40
60
{NC , NC , 0 }
41
61
};
42
62
@@ -51,7 +71,9 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
51
71
// Enable TIM clock
52
72
if (obj -> pwm == TIM_3 ) RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3 , ENABLE );
53
73
if (obj -> pwm == TIM_14 ) RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM14 , ENABLE );
74
+ if (obj -> pwm == TIM_15 ) RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM15 , ENABLE );
54
75
if (obj -> pwm == TIM_16 ) RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM16 , ENABLE );
76
+ if (obj -> pwm == TIM_17 ) RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM17 , ENABLE );
55
77
56
78
// Configure GPIO
57
79
pinmap_pinout (pin , PinMap_PWM );
@@ -81,32 +103,64 @@ void pwmout_write(pwmout_t* obj, float value) {
81
103
82
104
obj -> pulse = (uint32_t )((float )obj -> period * value );
83
105
84
- TIM_OCInitStructure .TIM_OCMode = TIM_OCMode_PWM1 ;
85
- TIM_OCInitStructure .TIM_Pulse = obj -> pulse ;
86
-
87
- // Configure channel 1
88
- if (obj -> pin == PA_7 ) {
89
- TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
90
- TIM_OCInitStructure .TIM_OCPolarity = TIM_OCPolarity_High ;
91
- TIM_OC1PreloadConfig (tim , TIM_OCPreload_Enable );
92
- TIM_OC1Init (tim , & TIM_OCInitStructure );
93
- }
94
-
95
- // Configure channel 1N
96
- if (obj -> pin == PB_6 ) {
97
- TIM_OCInitStructure .TIM_OutputNState = TIM_OutputNState_Enable ;
98
- TIM_OCInitStructure .TIM_OCNPolarity = TIM_OCNPolarity_High ;
99
- TIM_OC1PreloadConfig (tim , TIM_OCPreload_Enable );
100
- TIM_OC1Init (tim , & TIM_OCInitStructure );
101
- }
106
+ // Configure channels
107
+ TIM_OCInitStructure .TIM_OCMode = TIM_OCMode_PWM1 ;
108
+ TIM_OCInitStructure .TIM_Pulse = obj -> pulse ;
109
+ TIM_OCInitStructure .TIM_OCPolarity = TIM_OCPolarity_High ;
110
+ TIM_OCInitStructure .TIM_OCNPolarity = TIM_OCPolarity_Low ;
111
+ TIM_OCInitStructure .TIM_OCIdleState = TIM_OCIdleState_Reset ;
112
+ TIM_OCInitStructure .TIM_OCNIdleState = TIM_OCNIdleState_Reset ;
113
+
114
+ switch (obj -> pin ) {
115
+ // Channels 1
116
+ case PA_4 :
117
+ case PA_6 :
118
+ case PA_7 :
119
+ case PB_1 :
120
+ case PB_4 :
121
+ case PB_8 :
122
+ case PB_9 :
123
+ case PB_14 :
124
+ case PC_6 :
125
+ TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
126
+ TIM_OC1PreloadConfig (tim , TIM_OCPreload_Enable );
127
+ TIM_OC1Init (tim , & TIM_OCInitStructure );
128
+ break ;
129
+ // Channels 1N
130
+ case PB_6 :
131
+ case PB_7 :
132
+ TIM_OCInitStructure .TIM_OutputNState = TIM_OutputNState_Enable ;
133
+ TIM_OC1PreloadConfig (tim , TIM_OCPreload_Enable );
134
+ TIM_OC1Init (tim , & TIM_OCInitStructure );
135
+ break ;
136
+ // Channels 2
137
+ // case PA_7:
138
+ case PB_5 :
139
+ case PC_7 :
140
+ TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
141
+ TIM_OC2PreloadConfig (tim , TIM_OCPreload_Enable );
142
+ TIM_OC2Init (tim , & TIM_OCInitStructure );
143
+ break ;
144
+ // Channels 3
145
+ case PB_0 :
146
+ case PC_8 :
147
+ TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
148
+ TIM_OC3PreloadConfig (tim , TIM_OCPreload_Enable );
149
+ TIM_OC3Init (tim , & TIM_OCInitStructure );
150
+ break ;
151
+ // Channels 4
152
+ // case PB_1:
153
+ case PC_9 :
154
+ TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
155
+ TIM_OC4PreloadConfig (tim , TIM_OCPreload_Enable );
156
+ TIM_OC4Init (tim , & TIM_OCInitStructure );
157
+ break ;
158
+ default :
159
+ return ;
160
+ }
102
161
103
- // Configure channel 2
104
- if (obj -> pin == PC_7 ) {
105
- TIM_OCInitStructure .TIM_OutputState = TIM_OutputState_Enable ;
106
- TIM_OCInitStructure .TIM_OCPolarity = TIM_OCPolarity_High ;
107
- TIM_OC2PreloadConfig (tim , TIM_OCPreload_Enable );
108
- TIM_OC2Init (tim , & TIM_OCInitStructure );
109
- }
162
+ TIM_CtrlPWMOutputs (tim , ENABLE );
163
+
110
164
}
111
165
112
166
float pwmout_read (pwmout_t * obj ) {
0 commit comments