Skip to content

Commit 63f5854

Browse files
authored
Merge pull request #2585 from beeverycreative/master
Added support for ADC only pins in LPC43xx
2 parents 297597c + d312fe3 commit 63f5854

File tree

5 files changed

+109
-8
lines changed

5 files changed

+109
-8
lines changed

hal/targets/hal/TARGET_NXP/TARGET_LPC43XX/TARGET_LPC4330/PeripheralNames.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,23 @@ typedef enum {
4545
ADC1_4,
4646
ADC1_5,
4747
ADC1_6,
48-
ADC1_7
48+
ADC1_7,
49+
ADC_pin0_0,
50+
ADC_pin0_1,
51+
ADC_pin0_2,
52+
ADC_pin0_3,
53+
ADC_pin0_4,
54+
ADC_pin0_5,
55+
ADC_pin0_6,
56+
ADC_pin0_7,
57+
ADC_pin1_0,
58+
ADC_pin1_1,
59+
ADC_pin1_2,
60+
ADC_pin1_3,
61+
ADC_pin1_4,
62+
ADC_pin1_5,
63+
ADC_pin1_6,
64+
ADC_pin1_7
4965
} ADCName;
5066

5167
typedef enum {

hal/targets/hal/TARGET_NXP/TARGET_LPC43XX/TARGET_LPC4330/PinNames.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ typedef enum {
2929

3030
#define PORT_SHIFT 5
3131
#define NO_GPIO 15
32+
#define NO_PORT 0xFF
33+
3234

3335
// On the LPC43xx the MCU pin name and the GPIO pin name are not the same.
3436
// Encode SCU and GPIO offsets as a pin identifier
@@ -664,6 +666,24 @@ typedef enum {
664666
// (*) if DAC0 is configured, ADC4 is not available
665667
// (**) ADC5 requires JP2 mod
666668

669+
// Analog Only Pins
670+
adc0_0 = MBED_PIN(NO_PORT, 0, NO_GPIO, 0),
671+
adc0_1 = MBED_PIN(NO_PORT, 1, NO_GPIO, 0),
672+
adc0_2 = MBED_PIN(NO_PORT, 2, NO_GPIO, 0),
673+
adc0_3 = MBED_PIN(NO_PORT, 3, NO_GPIO, 0),
674+
adc0_4 = MBED_PIN(NO_PORT, 4, NO_GPIO, 0),
675+
adc0_5 = MBED_PIN(NO_PORT, 5, NO_GPIO, 0),
676+
adc0_6 = MBED_PIN(NO_PORT, 6, NO_GPIO, 0),
677+
adc0_7 = MBED_PIN(NO_PORT, 7, NO_GPIO, 0),
678+
adc1_0 = MBED_PIN(NO_PORT, 8, NO_GPIO, 0),
679+
adc1_1 = MBED_PIN(NO_PORT, 9, NO_GPIO, 0),
680+
adc1_2 = MBED_PIN(NO_PORT, 10, NO_GPIO, 0),
681+
adc1_3 = MBED_PIN(NO_PORT, 11, NO_GPIO, 0),
682+
adc1_4 = MBED_PIN(NO_PORT, 12, NO_GPIO, 0),
683+
adc1_5 = MBED_PIN(NO_PORT, 13, NO_GPIO, 0),
684+
adc1_6 = MBED_PIN(NO_PORT, 14, NO_GPIO, 0),
685+
adc1_7 = MBED_PIN(NO_PORT, 15, NO_GPIO, 0),
686+
667687
// USB pins
668688
// 210E 210 200E 200
669689
// ---- ---- ---- ----

hal/targets/hal/TARGET_NXP/TARGET_LPC43XX/TARGET_LPC4337/PeripheralNames.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,23 @@ typedef enum {
4545
ADC1_4,
4646
ADC1_5,
4747
ADC1_6,
48-
ADC1_7
48+
ADC1_7,
49+
ADC_pin0_0,
50+
ADC_pin0_1,
51+
ADC_pin0_2,
52+
ADC_pin0_3,
53+
ADC_pin0_4,
54+
ADC_pin0_5,
55+
ADC_pin0_6,
56+
ADC_pin0_7,
57+
ADC_pin1_0,
58+
ADC_pin1_1,
59+
ADC_pin1_2,
60+
ADC_pin1_3,
61+
ADC_pin1_4,
62+
ADC_pin1_5,
63+
ADC_pin1_6,
64+
ADC_pin1_7
4965
} ADCName;
5066

5167
typedef enum {

hal/targets/hal/TARGET_NXP/TARGET_LPC43XX/TARGET_LPC4337/PinNames.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ typedef enum {
3030

3131
#define PORT_SHIFT 5
3232
#define NO_GPIO 15
33+
#define NO_PORT 0xFF
3334

3435
// On the LPC43xx the MCU pin name and the GPIO pin name are not the same.
3536
// Encode SCU and GPIO offsets as a pin identifier
@@ -504,6 +505,24 @@ typedef enum {
504505
LED3 = LED_GREEN,
505506
LED4 = LED_RED,
506507

508+
// Analog Only pins
509+
adc0_0 = MBED_PIN(NO_PORT, 0, NO_GPIO, 0),
510+
adc0_1 = MBED_PIN(NO_PORT, 1, NO_GPIO, 0),
511+
adc0_2 = MBED_PIN(NO_PORT, 2, NO_GPIO, 0),
512+
adc0_3 = MBED_PIN(NO_PORT, 3, NO_GPIO, 0),
513+
adc0_4 = MBED_PIN(NO_PORT, 4, NO_GPIO, 0),
514+
adc0_5 = MBED_PIN(NO_PORT, 5, NO_GPIO, 0),
515+
adc0_6 = MBED_PIN(NO_PORT, 6, NO_GPIO, 0),
516+
adc0_7 = MBED_PIN(NO_PORT, 7, NO_GPIO, 0),
517+
adc1_0 = MBED_PIN(NO_PORT, 8, NO_GPIO, 0),
518+
adc1_1 = MBED_PIN(NO_PORT, 9, NO_GPIO, 0),
519+
adc1_2 = MBED_PIN(NO_PORT, 10, NO_GPIO, 0),
520+
adc1_3 = MBED_PIN(NO_PORT, 11, NO_GPIO, 0),
521+
adc1_4 = MBED_PIN(NO_PORT, 12, NO_GPIO, 0),
522+
adc1_5 = MBED_PIN(NO_PORT, 13, NO_GPIO, 0),
523+
adc1_6 = MBED_PIN(NO_PORT, 14, NO_GPIO, 0),
524+
adc1_7 = MBED_PIN(NO_PORT, 15, NO_GPIO, 0),
525+
507526
// ---------- End of LPCXpresso 4337 pins ----------
508527
} PinName;
509528

hal/targets/hal/TARGET_NXP/TARGET_LPC43XX/analogin_api.c

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ static const PinMap PinMap_ADC[] = {
4444
{PF_11, ADC1_5, 0},
4545
{P7_7, ADC1_6, 0},
4646
{PF_7, ADC1_7, 0},
47+
{adc0_0, ADC_pin0_0, 0},
48+
{adc0_1, ADC_pin0_1, 0},
49+
{adc0_2, ADC_pin0_2, 0},
50+
{adc0_3, ADC_pin0_3, 0},
51+
{adc0_4, ADC_pin0_4, 0},
52+
{adc0_5, ADC_pin0_5, 0},
53+
{adc0_6, ADC_pin0_6, 0},
54+
{adc0_7, ADC_pin0_7, 0},
55+
{adc1_0, ADC_pin1_0, 0},
56+
{adc1_1, ADC_pin1_1, 0},
57+
{adc1_2, ADC_pin1_2, 0},
58+
{adc1_3, ADC_pin1_3, 0},
59+
{adc1_4, ADC_pin1_4, 0},
60+
{adc1_5, ADC_pin1_5, 0},
61+
{adc1_6, ADC_pin1_6, 0},
62+
{adc1_7, ADC_pin1_7, 0},
4763
{NC, NC, 0 }
4864
};
4965

@@ -52,16 +68,30 @@ void analogin_init(analogin_t *obj, PinName pin) {
5268

5369
name = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
5470
MBED_ASSERT(obj->adc != (LPC_ADC_T *)NC);
71+
72+
// Set ADC number
73+
if(name < ADC1_0) {
74+
obj->num = 0;
75+
} else if(name < ADC_pin0_0 && name > ADC0_6) {
76+
obj->num = 1;
77+
} else if(name < ADC_pin1_1 && name > ADC1_7) {
78+
obj->num = 0;
79+
} else if(name > ADC_pin0_7) {
80+
obj->num = 1;
81+
}
5582

56-
// Set ADC register, number and channel
57-
obj->num = (name >> ADC0_7) ? 1 : 0;
83+
//ADC register and channel
5884
obj->ch = name % (ADC0_7 + 1);
5985
obj->adc = (LPC_ADC_T *) (obj->num > 0) ? LPC_ADC1 : LPC_ADC0;
6086

61-
// Reset pin function to GPIO
62-
gpio_set(pin);
63-
// Select ADC on analog function select register in SCU
64-
LPC_SCU->ENAIO[obj->num] |= (1 << obj->ch);
87+
// Reset pin function to GPIO if it is a GPIO pin. for adc only pins it is not necessary
88+
if(name < ADC_pin0_0) {
89+
gpio_set(pin);
90+
// Select ADC on analog function select register in SCU
91+
LPC_SCU->ENAIO[obj->num] |= (1 << obj->ch);
92+
} else {
93+
LPC_SCU->ENAIO[obj->num] &= ~(1 << obj->ch);
94+
}
6595

6696
// Calculate minimum clock divider
6797
// clkdiv = divider - 1

0 commit comments

Comments
 (0)