Skip to content

Commit 4e907a0

Browse files
committed
[NUCLEO_F401RE] Add more ANALOG_IN, I2C and SPI pins
1 parent 9b8352d commit 4e907a0

File tree

3 files changed

+72
-66
lines changed

3 files changed

+72
-66
lines changed

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

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,20 @@
3838
static const PinMap PinMap_ADC[] = {
3939
{PA_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN0
4040
{PA_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN1
41+
{PA_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN2
42+
{PA_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN3
4143
{PA_4, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN4
44+
{PA_5, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN5
45+
{PA_5, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN6
46+
{PA_6, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN7
4247
{PB_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN8
43-
{PC_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN11
48+
{PB_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN9
4449
{PC_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN10
50+
{PC_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN11
51+
{PC_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN12
52+
{PC_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN13
53+
{PC_4, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN14
54+
{PC_5, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN15
4555
{NC, NC, 0}
4656
};
4757

@@ -105,18 +115,48 @@ static inline uint16_t adc_read(analogin_t *obj) {
105115
case PA_1:
106116
sConfig.Channel = ADC_CHANNEL_1;
107117
break;
118+
case PA_2:
119+
sConfig.Channel = ADC_CHANNEL_2;
120+
break;
121+
case PA_3:
122+
sConfig.Channel = ADC_CHANNEL_3;
123+
break;
108124
case PA_4:
109125
sConfig.Channel = ADC_CHANNEL_4;
110126
break;
127+
case PA_5:
128+
sConfig.Channel = ADC_CHANNEL_5;
129+
break;
130+
case PA_6:
131+
sConfig.Channel = ADC_CHANNEL_6;
132+
break;
133+
case PA_7:
134+
sConfig.Channel = ADC_CHANNEL_7;
135+
break;
111136
case PB_0:
112137
sConfig.Channel = ADC_CHANNEL_8;
113138
break;
139+
case PB_1:
140+
sConfig.Channel = ADC_CHANNEL_9;
141+
break;
142+
case PC_0:
143+
sConfig.Channel = ADC_CHANNEL_10;
144+
break;
114145
case PC_1:
115146
sConfig.Channel = ADC_CHANNEL_11;
116147
break;
117-
case PC_0:
118-
sConfig.Channel = ADC_CHANNEL_10;
148+
case PC_2:
149+
sConfig.Channel = ADC_CHANNEL_12;
150+
break;
151+
case PC_3:
152+
sConfig.Channel = ADC_CHANNEL_13;
153+
break;
154+
case PC_4:
155+
sConfig.Channel = ADC_CHANNEL_14;
119156
break;
157+
case PC_5:
158+
sConfig.Channel = ADC_CHANNEL_15;
159+
break;
120160
default:
121161
return 0;
122162
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,19 @@
4343
#define LONG_TIMEOUT ((int)0x8000)
4444

4545
static const PinMap PinMap_I2C_SDA[] = {
46-
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
4746
{PB_3, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)},
4847
{PB_4, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)},
48+
{PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
49+
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
50+
{PC_9, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
4951
{NC, NC, 0}
5052
};
5153

5254
static const PinMap PinMap_I2C_SCL[] = {
55+
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
56+
{PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
5357
{PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
5458
{PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
55-
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
5659
{NC, NC, 0}
5760
};
5861

@@ -76,7 +79,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
7679
if (obj->i2c == I2C_2) {
7780
__I2C2_CLK_ENABLE();
7881
}
79-
8082
if (obj->i2c == I2C_3) {
8183
__I2C3_CLK_ENABLE();
8284
}

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

Lines changed: 24 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -40,41 +40,40 @@
4040
static const PinMap PinMap_SPI_MOSI[] = {
4141
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
4242
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
43-
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
43+
//{PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
4444
{PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
45+
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
4546
{PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
46-
{PB_5 , SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
4747
{NC, NC, 0}
4848
};
4949

5050
static const PinMap PinMap_SPI_MISO[] = {
5151
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
5252
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
53-
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
53+
//{PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
5454
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
55+
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
5556
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
56-
{PB_4 , SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
5757
{NC, NC, 0}
5858
};
5959

6060
static const PinMap PinMap_SPI_SCLK[] = {
6161
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
6262
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
63+
//{PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
6364
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
6465
{PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
6566
{PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
66-
{PB_3 , SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
6767
{NC, NC, 0}
6868
};
6969

70-
// Only used in Slave mode
7170
static const PinMap PinMap_SPI_SSEL[] = {
72-
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
73-
{PA_15, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
74-
{PB_9 , SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
75-
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
76-
{PA_4 , SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
77-
{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
71+
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
72+
//{PA_4, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
73+
{PA_15, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
74+
//{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
75+
{PB_9, SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
76+
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
7877
{NC, NC, 0}
7978
};
8079

@@ -133,9 +132,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
133132
pinmap_pinout(mosi, PinMap_SPI_MOSI);
134133
pinmap_pinout(miso, PinMap_SPI_MISO);
135134
pinmap_pinout(sclk, PinMap_SPI_SCLK);
136-
if (ssel != NC) { // slave mode
137-
pinmap_pinout(ssel, PinMap_SPI_SSEL);
138-
}
139135

140136
// Save new values
141137
obj->bits = SPI_DATASIZE_8BIT;
@@ -202,61 +198,31 @@ void spi_format(spi_t *obj, int bits, int mode, int slave) {
202198
}
203199

204200
void spi_frequency(spi_t *obj, int hz) {
205-
<<<<<<< HEAD
206201
// Note: The frequencies are obtained with SPI1 clock = 84 MHz (APB2 clock)
207-
if (hz < 500000) {
208-
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 331 kHz
202+
if (hz < 600000) {
203+
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 330 kHz
209204
}
210-
else if ((hz >= 500000) && (hz < 1000000)) {
211-
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 663 kHz
205+
else if ((hz >= 600000) && (hz < 1000000)) {
206+
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 656 kHz
212207
}
213208
else if ((hz >= 1000000) && (hz < 2000000)) {
214209
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.3 MHz
215210
}
216211
else if ((hz >= 2000000) && (hz < 5000000)) {
217-
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.65 MHz
212+
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.6 MHz
218213
}
219214
else if ((hz >= 5000000) && (hz < 10000000)) {
220-
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.3 MHz
215+
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.25 MHz
221216
}
222-
else if ((hz >= 10000000) && (hz < 20000000)) {
223-
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.6 MHz
217+
else if ((hz >= 10000000) && (hz < 21000000)) {
218+
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.5 MHz
224219
}
225-
else if ((hz >= 20000000) && (hz < 40000000)) {
226-
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21.2 MHz
220+
else if ((hz >= 21000000) && (hz < 42000000)) {
221+
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21 MHz
227222
}
228-
else { // >= 40000000
223+
else { // >= 42000000
229224
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 42 MHz
230225
}
231-
=======
232-
// Get SPI clock frequency
233-
234-
// SPI1 runs from PCLK2, which runs at SystemCoreClock / 2. SPI2 and SPI3
235-
// run from PCLK1, which runs at SystemCoreClock / 4.
236-
uint32_t PCLK = SystemCoreClock;
237-
switch ((int)obj->spi) {
238-
case SPI_1: PCLK = PCLK >> 1; break;
239-
case SPI_2: PCLK = PCLK >> 2; break;
240-
case SPI_3: PCLK = PCLK >> 2; break;
241-
}
242-
// Choose the baud rate divisor (between 2 and 256)
243-
uint32_t divisor = PCLK / hz;
244-
245-
// Find the nearest power-of-2
246-
divisor = (divisor > 0 ? divisor-1 : 0);
247-
divisor |= divisor >> 1;
248-
divisor |= divisor >> 2;
249-
divisor |= divisor >> 4;
250-
divisor |= divisor >> 8;
251-
divisor |= divisor >> 16;
252-
divisor++;
253-
254-
uint32_t baud_rate = __builtin_ffs(divisor) - 2;
255-
256-
// Save new value
257-
obj->br_presc = ((baud_rate > 7) ? (7 << 3) : (baud_rate << 3));
258-
259-
>>>>>>> b95ba7a52a7ae9e1239b3adafff2293a2c7aebfd
260226
init_spi(obj);
261227
}
262228

@@ -279,9 +245,7 @@ static inline int ssp_writeable(spi_t *obj) {
279245
static inline void ssp_write(spi_t *obj, int value) {
280246
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
281247
while (!ssp_writeable(obj));
282-
if(obj->bits == SPI_DATASIZE_8BIT)
283-
spi->DR = (uint8_t)value; // 8 bit mode
284-
else spi->DR = (uint16_t)value; // 16 bit mode
248+
spi->DR = (uint16_t)value;
285249
}
286250

287251
static inline int ssp_read(spi_t *obj) {
@@ -314,7 +278,7 @@ int spi_slave_read(spi_t *obj) {
314278
void spi_slave_write(spi_t *obj, int value) {
315279
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
316280
while (!ssp_writeable(obj));
317-
spi->DR = (uint8_t)value;
281+
spi->DR = (uint16_t)value;
318282
}
319283

320284
int spi_busy(spi_t *obj) {

0 commit comments

Comments
 (0)