Skip to content

Commit a8236d8

Browse files
committed
[NUCLEO_L152RE] Add more ANALOG_IN, ANALOG_OUT, PWM, SERIAL and SPI pins
1 parent ad9f894 commit a8236d8

File tree

6 files changed

+270
-133
lines changed

6 files changed

+270
-133
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/PeripheralNames.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ extern "C" {
3737
#endif
3838

3939
typedef enum {
40-
ADC_1 = (int)ADC1_BASE,
41-
ADC_2 = (int)ADC_BASE
40+
ADC_1 = (int)ADC1_BASE
4241
} ADCName;
4342

4443
typedef enum {
@@ -69,9 +68,13 @@ typedef enum {
6968
} I2CName;
7069

7170
typedef enum {
72-
PWM_2 = (int)TIM2_BASE,
73-
PWM_3 = (int)TIM3_BASE,
74-
PWM_4 = (int)TIM4_BASE
71+
PWM_2 = (int)TIM2_BASE,
72+
PWM_3 = (int)TIM3_BASE,
73+
PWM_4 = (int)TIM4_BASE,
74+
PWM_5 = (int)TIM5_BASE,
75+
PWM_9 = (int)TIM9_BASE,
76+
PWM_10 = (int)TIM10_BASE,
77+
PWM_11 = (int)TIM11_BASE
7578
} PWMName;
7679

7780
#ifdef __cplusplus

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/analogin_api.c

Lines changed: 75 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,36 @@
3535
#include "error.h"
3636

3737
static const PinMap PinMap_ADC[] = {
38-
{PA_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN0
39-
{PA_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN1
40-
{PA_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN4
41-
{PB_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN8
42-
{PC_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN11
43-
{PC_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN10
44-
{NC, NC, 0}
38+
{PA_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN0
39+
{PA_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN1
40+
{PA_2, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN2
41+
{PA_3, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN3
42+
{PA_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN4
43+
{PA_5, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN5
44+
{PA_6, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN6
45+
{PA_7, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN7
46+
{PB_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN8
47+
{PB_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN9
48+
{PB_12, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN18
49+
{PB_13, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN19
50+
{PB_14, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN20
51+
{PB_15, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN21
52+
{PC_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN10
53+
{PC_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN11
54+
{PC_2, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN12
55+
{PC_3, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN13
56+
{PC_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN14
57+
{PC_5, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN15
58+
{NC, NC, 0}
4559
};
4660

4761
int adc_inited = 0;
4862

4963
void analogin_init(analogin_t *obj, PinName pin) {
50-
51-
ADC_TypeDef *adc;
64+
ADC_TypeDef *adc;
5265
ADC_InitTypeDef ADC_InitStructure;
5366

54-
// Get the peripheral name (ADC_1, ADC_2...) from the pin and assign it to the object
67+
// Get the peripheral name from the pin and assign it to the object
5568
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
5669

5770
if (obj->adc == (ADCName)NC) {
@@ -92,31 +105,76 @@ void analogin_init(analogin_t *obj, PinName pin) {
92105
static inline uint16_t adc_read(analogin_t *obj) {
93106
// Get ADC registers structure address
94107
ADC_TypeDef *adc = (ADC_TypeDef *)(obj->adc);
108+
uint8_t channel = 0;
95109

96110
// Configure ADC channel
97111
switch (obj->pin) {
98112
case PA_0:
99-
ADC_RegularChannelConfig(adc, ADC_Channel_0, 1, ADC_SampleTime_4Cycles);
113+
channel = ADC_Channel_0;
100114
break;
101115
case PA_1:
102-
ADC_RegularChannelConfig(adc, ADC_Channel_1, 1, ADC_SampleTime_4Cycles);
116+
channel = ADC_Channel_1;
117+
break;
118+
case PA_2:
119+
channel = ADC_Channel_2;
103120
break;
121+
case PA_3:
122+
channel = ADC_Channel_3;
123+
break;
104124
case PA_4:
105-
ADC_RegularChannelConfig(adc, ADC_Channel_4, 1, ADC_SampleTime_4Cycles);
125+
channel = ADC_Channel_4;
126+
break;
127+
case PA_5:
128+
channel = ADC_Channel_5;
129+
break;
130+
case PA_6:
131+
channel = ADC_Channel_6;
106132
break;
133+
case PA_7:
134+
channel = ADC_Channel_7;
135+
break;
107136
case PB_0:
108-
ADC_RegularChannelConfig(adc, ADC_Channel_8, 1, ADC_SampleTime_4Cycles);
137+
channel = ADC_Channel_8;
109138
break;
110-
case PC_1:
111-
ADC_RegularChannelConfig(adc, ADC_Channel_11, 1, ADC_SampleTime_4Cycles);
139+
case PB_1:
140+
channel = ADC_Channel_9;
141+
break;
142+
case PB_12:
143+
channel = ADC_Channel_18;
144+
break;
145+
case PB_13:
146+
channel = ADC_Channel_19;
112147
break;
148+
case PB_14:
149+
channel = ADC_Channel_20;
150+
break;
151+
case PB_15:
152+
channel = ADC_Channel_21;
153+
break;
113154
case PC_0:
114-
ADC_RegularChannelConfig(adc, ADC_Channel_10, 1, ADC_SampleTime_4Cycles);
155+
channel = ADC_Channel_10;
156+
break;
157+
case PC_1:
158+
channel = ADC_Channel_11;
159+
break;
160+
case PC_2:
161+
channel = ADC_Channel_12;
115162
break;
163+
case PC_3:
164+
channel = ADC_Channel_13;
165+
break;
166+
case PC_4:
167+
channel = ADC_Channel_14;
168+
break;
169+
case PC_5:
170+
channel = ADC_Channel_15;
171+
break;
116172
default:
117173
return 0;
118174
}
119175

176+
ADC_RegularChannelConfig(adc, channel, 1, ADC_SampleTime_4Cycles);
177+
120178
ADC_SoftwareStartConv(adc); // Start conversion
121179

122180
while(ADC_GetFlagStatus(adc, ADC_FLAG_EOC) == RESET); // Wait end of conversion

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/analogout_api.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
static const PinMap PinMap_DAC[] = {
3939
{PA_4, DAC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // DAC_OUT1
40-
//{PA_5, DAC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // DAC_OUT2 - Cannot be used due to the LED connected on it
40+
{PA_5, DAC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // DAC_OUT2
4141
{NC, NC, 0}
4242
};
4343

@@ -61,20 +61,20 @@ void analogout_init(dac_t *obj, PinName pin) {
6161
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
6262

6363
// Configure and enable DAC channel
64-
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
65-
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
64+
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
65+
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
6666
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
67-
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
67+
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
6868

6969
if (obj->channel == PA_4) {
70-
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
71-
DAC_Cmd(DAC_Channel_1, ENABLE);
70+
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
71+
DAC_Cmd(DAC_Channel_1, ENABLE);
7272
}
73-
//if (obj->channel == PA_5) {
74-
// DAC_Init(DAC_Channel_2, &DAC_InitStructure);
75-
// DAC_Cmd(DAC_Channel_2, ENABLE);
76-
//}
77-
73+
if (obj->channel == PA_5) {
74+
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
75+
DAC_Cmd(DAC_Channel_2, ENABLE);
76+
}
77+
7878
analogout_write_u16(obj, 0);
7979
}
8080

@@ -83,20 +83,20 @@ void analogout_free(dac_t *obj) {
8383

8484
static inline void dac_write(dac_t *obj, uint16_t value) {
8585
if (obj->channel == PA_4) {
86-
DAC_SetChannel1Data(DAC_Align_12b_R, value);
86+
DAC_SetChannel1Data(DAC_Align_12b_R, value);
87+
}
88+
if (obj->channel == PA_5) {
89+
DAC_SetChannel2Data(DAC_Align_12b_R, value);
8790
}
88-
//if (obj->channel == PA_5) {
89-
// DAC_SetChannel2Data(DAC_Align_12b_R, value);
90-
//}
9191
}
9292

9393
static inline int dac_read(dac_t *obj) {
9494
if (obj->channel == PA_4) {
95-
return (int)DAC_GetDataOutputValue(DAC_Channel_1);
95+
return (int)DAC_GetDataOutputValue(DAC_Channel_1);
96+
}
97+
if (obj->channel == PA_5) {
98+
return (int)DAC_GetDataOutputValue(DAC_Channel_2);
9699
}
97-
//if (obj->channel == PA_5) {
98-
// return (int)DAC_GetDataOutputValue(DAC_Channel_2);
99-
//}
100100
return 0;
101101
}
102102

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

Lines changed: 99 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,43 @@
3333
#include "pinmap.h"
3434
#include "error.h"
3535

36+
// TIM5 cannot be used because already used by the us_ticker
3637
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}
4173
};
4274

4375
void pwmout_init(pwmout_t* obj, PinName pin) {
@@ -52,6 +84,10 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
5284
if (obj->pwm == PWM_2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
5385
if (obj->pwm == PWM_3) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
5486
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);
5591

5692
// Configure GPIO
5793
pinmap_pinout(pin, PinMap_PWM);
@@ -71,7 +107,7 @@ void pwmout_free(pwmout_t* obj) {
71107
void pwmout_write(pwmout_t* obj, float value) {
72108
TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
73109
TIM_OCInitTypeDef TIM_OCInitStructure;
74-
110+
75111
if (value < 0.0) {
76112
value = 0.0;
77113
} else if (value > 1.0) {
@@ -80,21 +116,62 @@ void pwmout_write(pwmout_t* obj, float value) {
80116

81117
obj->pulse = (uint32_t)((float)obj->period * value);
82118

83-
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
119+
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
84120
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;
98175
}
99176
}
100177

@@ -123,10 +200,10 @@ void pwmout_period_us(pwmout_t* obj, int us) {
123200

124201
obj->period = us;
125202

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
128205
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
129-
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
206+
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
130207
TIM_TimeBaseInit(tim, &TIM_TimeBaseStructure);
131208

132209
// Set duty cycle again

0 commit comments

Comments
 (0)