Skip to content

Commit 9b8352d

Browse files
committed
[NUCLEO_F401RE] Add more SERIAL and PWM pins
1 parent 5963a31 commit 9b8352d

File tree

3 files changed

+160
-37
lines changed

3 files changed

+160
-37
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,13 @@ 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 {
4544
UART_1 = (int)USART1_BASE,
4645
UART_2 = (int)USART2_BASE,
47-
UART_3 = (int)USART6_BASE
46+
UART_6 = (int)USART6_BASE
4847
} UARTName;
4948

5049
#define STDIO_UART_TX PA_2
@@ -64,9 +63,14 @@ typedef enum {
6463
} I2CName;
6564

6665
typedef enum {
67-
PWM_2 = (int)TIM2_BASE,
68-
PWM_3 = (int)TIM3_BASE,
69-
PWM_4 = (int)TIM4_BASE
66+
PWM_1 = (int)TIM1_BASE,
67+
PWM_2 = (int)TIM2_BASE,
68+
PWM_3 = (int)TIM3_BASE,
69+
PWM_4 = (int)TIM4_BASE,
70+
PWM_5 = (int)TIM5_BASE,
71+
PWM_9 = (int)TIM9_BASE,
72+
PWM_10 = (int)TIM10_BASE,
73+
PWM_11 = (int)TIM11_BASE
7074
} PWMName;
7175

7276
#ifdef __cplusplus

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

Lines changed: 132 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,51 @@
3434
#include "error.h"
3535
#include "stm32f4xx_hal.h"
3636

37+
// TIM5 cannot be used because already used by the us_ticker
3738
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+
4182
{NC, NC, 0}
4283
};
4384

@@ -52,9 +93,13 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
5293
}
5394

5495
// Enable TIM clock
96+
if (obj->pwm == PWM_1) __TIM1_CLK_ENABLE();
5597
if (obj->pwm == PWM_2) __TIM2_CLK_ENABLE();
5698
if (obj->pwm == PWM_3) __TIM3_CLK_ENABLE();
5799
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();
58103

59104
// Configure GPIO
60105
pinmap_pinout(pin, PinMap_PWM);
@@ -76,7 +121,9 @@ void pwmout_free(pwmout_t* obj) {
76121

77122
void pwmout_write(pwmout_t* obj, float value) {
78123
TIM_OC_InitTypeDef sConfig;
79-
124+
int channel = 0;
125+
int complementary_channel = 0;
126+
80127
TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
81128

82129
if (value < (float)0.0) {
@@ -86,21 +133,89 @@ void pwmout_write(pwmout_t* obj, float value) {
86133
}
87134

88135
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;
98210
}
99211

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+
}
104219
}
105220

106221
float pwmout_read(pwmout_t* obj) {

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/serial_api.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,20 @@
3535
#include "stm32f4xx_hal.h"
3636

3737
static const PinMap PinMap_UART_TX[] = {
38-
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
3938
{PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
40-
{PC_6, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
39+
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
40+
{PA_11, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
41+
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
42+
{PC_6, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
4143
{NC, NC, 0}
4244
};
4345

4446
static const PinMap PinMap_UART_RX[] = {
45-
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
4647
{PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
47-
{PC_7, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
48+
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
49+
{PA_12, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
50+
{PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
51+
{PC_7, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
4852
{NC, NC, 0}
4953
};
5054

@@ -91,10 +95,10 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
9195
if (obj->uart == UART_2) {
9296
__USART2_CLK_ENABLE();
9397
}
94-
if (obj->uart == UART_3) {
95-
__USART6_CLK_ENABLE();
98+
if (obj->uart == UART_6) {
99+
__USART6_CLK_ENABLE();
96100
}
97-
101+
98102
// Configure the UART pins
99103
pinmap_pinout(tx, PinMap_UART_TX);
100104
pinmap_pinout(rx, PinMap_UART_RX);
@@ -112,7 +116,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
112116
// The index is used by irq
113117
if (obj->uart == UART_1) obj->index = 0;
114118
if (obj->uart == UART_2) obj->index = 1;
115-
if (obj->uart == UART_3) obj->index = 2;
119+
if (obj->uart == UART_6) obj->index = 2;
116120

117121
// For stdio management
118122
if (obj->uart == STDIO_UART) {
@@ -186,7 +190,7 @@ static void uart_irq(UARTName name, int id) {
186190
// Not part of mbed api
187191
static void uart1_irq(void) {uart_irq(UART_1, 0);}
188192
static void uart2_irq(void) {uart_irq(UART_2, 1);}
189-
static void uart3_irq(void) {uart_irq(UART_3, 2);}
193+
static void uart6_irq(void) {uart_irq(UART_6, 2);}
190194

191195
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
192196
irq_handler = handler;
@@ -208,12 +212,12 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
208212
irq_n = USART2_IRQn;
209213
vector = (uint32_t)&uart2_irq;
210214
}
211-
212-
if (obj->uart == UART_3) {
213-
irq_n = USART6_IRQn;
214-
vector = (uint32_t)&uart3_irq;
215-
}
216215

216+
if (obj->uart == UART_6) {
217+
irq_n = USART6_IRQn;
218+
vector = (uint32_t)&uart6_irq;
219+
}
220+
217221
if (enable) {
218222

219223
if (irq == RxIrq) {

0 commit comments

Comments
 (0)