37
37
38
38
ADC_HandleTypeDef AdcHandle ;
39
39
40
- int adc1_inited = 0 ;
41
- int adc2_inited = 0 ;
42
- int adc3_inited = 0 ;
43
- int adc4_inited = 0 ;
44
-
45
40
void analogin_init (analogin_t * obj , PinName pin )
46
41
{
42
+ static int adc1_inited = 0 ;
43
+ static int adc2_inited = 0 ;
44
+ static int adc3_inited = 0 ;
45
+ static int adc4_inited = 0 ;
46
+
47
47
// Get the peripheral name from the pin and assign it to the object
48
48
obj -> adc = (ADCName )pinmap_peripheral (pin , PinMap_ADC );
49
49
MBED_ASSERT (obj -> adc != (ADCName )NC );
@@ -54,42 +54,49 @@ void analogin_init(analogin_t *obj, PinName pin)
54
54
// Save pin number for the read function
55
55
obj -> pin = pin ;
56
56
57
- // The ADC initialization is done only once for each ADC
58
- if ((adc1_inited == 0 ) || (adc2_inited == 0 ) || (adc3_inited == 0 ) || (adc4_inited == 0 )) {
59
- if (obj -> adc == ADC_1 ) {
60
- __ADC12_CLK_ENABLE ();
61
- adc1_inited = 1 ;
62
- }
63
- if (obj -> adc == ADC_2 ) {
64
- __ADC12_CLK_ENABLE ();
65
- adc2_inited = 1 ;
66
- }
67
- if (obj -> adc == ADC_3 ) {
68
- __ADC34_CLK_ENABLE ();
69
- adc3_inited = 1 ;
70
- }
71
- if (obj -> adc == ADC_4 ) {
72
- __ADC34_CLK_ENABLE ();
73
- adc4_inited = 1 ;
74
- }
75
- // Configure ADC
76
- AdcHandle .Instance = (ADC_TypeDef * )(obj -> adc );
77
- AdcHandle .Init .ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2 ;
78
- AdcHandle .Init .Resolution = ADC_RESOLUTION12b ;
79
- AdcHandle .Init .DataAlign = ADC_DATAALIGN_RIGHT ;
80
- AdcHandle .Init .ScanConvMode = DISABLE ;
81
- AdcHandle .Init .EOCSelection = DISABLE ;
82
- AdcHandle .Init .LowPowerAutoWait = DISABLE ;
83
- AdcHandle .Init .ContinuousConvMode = DISABLE ;
84
- AdcHandle .Init .NbrOfConversion = 1 ;
85
- AdcHandle .Init .DiscontinuousConvMode = DISABLE ;
86
- AdcHandle .Init .NbrOfDiscConversion = 0 ;
87
- AdcHandle .Init .ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1 ;
88
- AdcHandle .Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE ;
89
- AdcHandle .Init .DMAContinuousRequests = DISABLE ;
90
- AdcHandle .Init .Overrun = OVR_DATA_OVERWRITTEN ;
91
- HAL_ADC_Init (& AdcHandle );
57
+ // Check if ADC is already initialized
58
+ if ((obj -> adc == ADC_1 ) && adc1_inited ) return ;
59
+ if ((obj -> adc == ADC_2 ) && adc2_inited ) return ;
60
+ if ((obj -> adc == ADC_3 ) && adc3_inited ) return ;
61
+ if ((obj -> adc == ADC_4 ) && adc4_inited ) return ;
62
+
63
+ if (obj -> adc == ADC_1 ) {
64
+ __ADC12_CLK_ENABLE ();
65
+ adc1_inited = 1 ;
92
66
}
67
+
68
+ if (obj -> adc == ADC_2 ) {
69
+ __ADC12_CLK_ENABLE ();
70
+ adc2_inited = 1 ;
71
+ }
72
+
73
+ if (obj -> adc == ADC_3 ) {
74
+ __ADC34_CLK_ENABLE ();
75
+ adc3_inited = 1 ;
76
+ }
77
+
78
+ if (obj -> adc == ADC_4 ) {
79
+ __ADC34_CLK_ENABLE ();
80
+ adc4_inited = 1 ;
81
+ }
82
+
83
+ // Configure ADC
84
+ AdcHandle .Instance = (ADC_TypeDef * )(obj -> adc );
85
+ AdcHandle .Init .ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2 ;
86
+ AdcHandle .Init .Resolution = ADC_RESOLUTION12b ;
87
+ AdcHandle .Init .DataAlign = ADC_DATAALIGN_RIGHT ;
88
+ AdcHandle .Init .ScanConvMode = DISABLE ;
89
+ AdcHandle .Init .EOCSelection = DISABLE ;
90
+ AdcHandle .Init .LowPowerAutoWait = DISABLE ;
91
+ AdcHandle .Init .ContinuousConvMode = DISABLE ;
92
+ AdcHandle .Init .NbrOfConversion = 1 ;
93
+ AdcHandle .Init .DiscontinuousConvMode = DISABLE ;
94
+ AdcHandle .Init .NbrOfDiscConversion = 0 ;
95
+ AdcHandle .Init .ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1 ;
96
+ AdcHandle .Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE ;
97
+ AdcHandle .Init .DMAContinuousRequests = DISABLE ;
98
+ AdcHandle .Init .Overrun = OVR_DATA_OVERWRITTEN ;
99
+ HAL_ADC_Init (& AdcHandle );
93
100
}
94
101
95
102
static inline uint16_t adc_read (analogin_t * obj )
0 commit comments