diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/PeripheralNames.h b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/PeripheralNames.h index de2378dfc99..94a7a8c6c21 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/PeripheralNames.h +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/PeripheralNames.h @@ -52,12 +52,15 @@ typedef enum { PWM_10 = (2 << TPM_SHIFT) | (1) // TPM2 CH1 } PWMName; +#define CHANNELS_A_SHIFT 5 typedef enum { ADC0_SE0 = 0, ADC0_SE3 = 3, + ADC0_SE4a = (1 << CHANNELS_A_SHIFT) | (4), ADC0_SE4b = 4, ADC0_SE5b = 5, ADC0_SE6b = 6, + ADC0_SE7a = (1 << CHANNELS_A_SHIFT) | (7), ADC0_SE7b = 7, ADC0_SE8 = 8, ADC0_SE9 = 9, diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/analogin_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/analogin_api.c index 6b374496989..9dcf436e45c 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/analogin_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/analogin_api.c @@ -22,8 +22,10 @@ static const PinMap PinMap_ADC[] = { {PTE20, ADC0_SE0, 0}, {PTE22, ADC0_SE3, 0}, + {PTE21, ADC0_SE4a, 0}, {PTE29, ADC0_SE4b, 0}, {PTE30, ADC0_SE23, 0}, + {PTE23, ADC0_SE7a, 0}, {PTB0, ADC0_SE8, 0}, {PTB1, ADC0_SE9, 0}, {PTB2, ADC0_SE12, 0}, @@ -48,7 +50,12 @@ void analogin_init(analogin_t *obj, PinName pin) { uint32_t port = (uint32_t)pin >> PORT_SHIFT; SIM->SCGC5 |= 1 << (SIM_SCGC5_PORTA_SHIFT + port); - ADC0->SC1[1] = ADC_SC1_ADCH(obj->adc); + uint32_t cfg2_muxsel = ADC_CFG2_MUXSEL_MASK; + if (obj->adc & (1 << CHANNELS_A_SHIFT)) { + cfg2_muxsel = 0; + } + + ADC0->SC1[1] = ADC_SC1_ADCH(obj->adc & ~(1 << CHANNELS_A_SHIFT)); ADC0->CFG1 = ADC_CFG1_ADLPC_MASK // Low-Power Configuration | ADC_CFG1_ADIV(3) // Clock Divide Select: (Input Clock)/8 @@ -56,7 +63,7 @@ void analogin_init(analogin_t *obj, PinName pin) { | ADC_CFG1_MODE(3) // (16)bits Resolution | ADC_CFG1_ADICLK(1); // Input Clock: (Bus Clock)/2 - ADC0->CFG2 = ADC_CFG2_MUXSEL_MASK // ADxxb channels are selected + ADC0->CFG2 = cfg2_muxsel // ADxxb or ADxxa channels | ADC_CFG2_ADACKEN_MASK // Asynchronous Clock Output Enable | ADC_CFG2_ADHSC_MASK // High-Speed Configuration | ADC_CFG2_ADLSTS(0); // Long Sample Time Select @@ -71,7 +78,7 @@ void analogin_init(analogin_t *obj, PinName pin) { uint16_t analogin_read_u16(analogin_t *obj) { // start conversion - ADC0->SC1[0] = ADC_SC1_ADCH(obj->adc); + ADC0->SC1[0] = ADC_SC1_ADCH(obj->adc & ~(1 << CHANNELS_A_SHIFT)); // Wait Conversion Complete while ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK);