37
37
38
38
ADC_HandleTypeDef AdcHandle ;
39
39
40
- int adc_inited = 0 ;
41
-
42
40
void analogin_init (analogin_t * obj , PinName pin )
43
41
{
42
+ static int adc1_inited = 0 ;
43
+ static int adc2_inited = 0 ;
44
+
44
45
// Get the peripheral name from the pin and assign it to the object
45
46
obj -> adc = (ADCName )pinmap_peripheral (pin , PinMap_ADC );
46
47
MBED_ASSERT (obj -> adc != (ADCName )NC );
@@ -51,30 +52,30 @@ void analogin_init(analogin_t *obj, PinName pin)
51
52
// Save pin number for the read function
52
53
obj -> pin = pin ;
53
54
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 );
78
79
}
79
80
80
81
static inline uint16_t adc_read (analogin_t * obj )
0 commit comments