Skip to content

Commit 2acefb6

Browse files
committed
Merge pull request #809 from bcostm/master
NUCLEO_F334R8 - Fix issue with multiple ADC initialization
2 parents bef4690 + f2a6eec commit 2acefb6

File tree

1 file changed

+27
-26
lines changed
  • libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8

1 file changed

+27
-26
lines changed

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

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@
3737

3838
ADC_HandleTypeDef AdcHandle;
3939

40-
int adc_inited = 0;
41-
4240
void analogin_init(analogin_t *obj, PinName pin)
4341
{
42+
static int adc1_inited = 0;
43+
static int adc2_inited = 0;
44+
4445
// Get the peripheral name from the pin and assign it to the object
4546
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
4647
MBED_ASSERT(obj->adc != (ADCName)NC);
@@ -51,30 +52,30 @@ void analogin_init(analogin_t *obj, PinName pin)
5152
// Save pin number for the read function
5253
obj->pin = pin;
5354

54-
// The ADC initialization is done once
55-
if (adc_inited == 0) {
56-
adc_inited = 1;
57-
58-
// Enable ADC clock
59-
if (obj->adc == ADC_1) __ADC1_CLK_ENABLE();
60-
if (obj->adc == ADC_2) __ADC2_CLK_ENABLE();
61-
62-
// Configure ADC
63-
AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
64-
AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
65-
AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
66-
AdcHandle.Init.ScanConvMode = DISABLE;
67-
AdcHandle.Init.ContinuousConvMode = DISABLE;
68-
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
69-
AdcHandle.Init.NbrOfDiscConversion = 0;
70-
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
71-
AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
72-
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
73-
AdcHandle.Init.NbrOfConversion = 1;
74-
AdcHandle.Init.DMAContinuousRequests = DISABLE;
75-
AdcHandle.Init.EOCSelection = DISABLE;
76-
HAL_ADC_Init(&AdcHandle);
77-
}
55+
// Check if ADC is already initialized
56+
if ((obj->adc == ADC_1) && adc1_inited) return;
57+
if ((obj->adc == ADC_2) && adc2_inited) return;
58+
if (obj->adc == ADC_1) adc1_inited = 1;
59+
if (obj->adc == ADC_2) adc2_inited = 1;
60+
61+
// Enable ADC clock
62+
__ADC12_CLK_ENABLE();
63+
64+
// Configure ADC
65+
AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
66+
AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
67+
AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
68+
AdcHandle.Init.ScanConvMode = DISABLE;
69+
AdcHandle.Init.ContinuousConvMode = DISABLE;
70+
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
71+
AdcHandle.Init.NbrOfDiscConversion = 0;
72+
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
73+
AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
74+
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
75+
AdcHandle.Init.NbrOfConversion = 1;
76+
AdcHandle.Init.DMAContinuousRequests = DISABLE;
77+
AdcHandle.Init.EOCSelection = DISABLE;
78+
HAL_ADC_Init(&AdcHandle);
7879
}
7980

8081
static inline uint16_t adc_read(analogin_t *obj)

0 commit comments

Comments
 (0)