37
37
38
38
ADC_HandleTypeDef AdcHandle ;
39
39
40
- int adc1_inited = 0 ;
41
- int adc2_inited = 0 ;
42
-
43
40
void analogin_init (analogin_t * obj , PinName pin )
44
41
{
42
+ static int adc1_inited = 0 ;
43
+ static int adc2_inited = 0 ;
44
+
45
45
// Get the peripheral name from the pin and assign it to the object
46
46
obj -> adc = (ADCName )pinmap_peripheral (pin , PinMap_ADC );
47
47
MBED_ASSERT (obj -> adc != (ADCName )NC );
@@ -52,33 +52,30 @@ void analogin_init(analogin_t *obj, PinName pin)
52
52
// Save pin number for the read function
53
53
obj -> pin = pin ;
54
54
55
- // The ADC initialization is done only once for each ADC
56
- if ((adc1_inited == 0 ) || (adc2_inited == 0 )) {
57
- if (obj -> adc == ADC_1 ) {
58
- __ADC12_CLK_ENABLE ();
59
- adc1_inited = 1 ;
60
- }
61
- if (obj -> adc == ADC_2 ) {
62
- __ADC12_CLK_ENABLE ();
63
- adc2_inited = 1 ;
64
- }
65
-
66
- // Configure ADC
67
- AdcHandle .Instance = (ADC_TypeDef * )(obj -> adc );
68
- AdcHandle .Init .ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2 ;
69
- AdcHandle .Init .Resolution = ADC_RESOLUTION12b ;
70
- AdcHandle .Init .ScanConvMode = DISABLE ;
71
- AdcHandle .Init .ContinuousConvMode = DISABLE ;
72
- AdcHandle .Init .DiscontinuousConvMode = DISABLE ;
73
- AdcHandle .Init .NbrOfDiscConversion = 0 ;
74
- AdcHandle .Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE ;
75
- AdcHandle .Init .ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1 ;
76
- AdcHandle .Init .DataAlign = ADC_DATAALIGN_RIGHT ;
77
- AdcHandle .Init .NbrOfConversion = 1 ;
78
- AdcHandle .Init .DMAContinuousRequests = DISABLE ;
79
- AdcHandle .Init .EOCSelection = DISABLE ;
80
- HAL_ADC_Init (& AdcHandle );
81
- }
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 );
82
79
}
83
80
84
81
static inline uint16_t adc_read (analogin_t * obj )
0 commit comments