@@ -29,12 +29,14 @@ static const PinMap PinMap_ADC[] = {
29
29
{PA_0 , ADC_1 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
30
30
{PA_1 , ADC_1 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
31
31
{PA_4 , ADC_1 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
32
- {PB_0 , ADC_2 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
33
- {PC_1 , ADC_2 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
34
- {PC_0 , ADC_2 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
32
+ {PB_0 , ADC_1 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
33
+ {PC_1 , ADC_1 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
34
+ {PC_0 , ADC_1 , STM_PIN_DATA (GPIO_Mode_AIN , 0 )},
35
35
{NC , NC , 0 }
36
36
};
37
37
38
+ int adc_inited = 0 ;
39
+
38
40
void analogin_init (analogin_t * obj , PinName pin ) {
39
41
40
42
ADC_TypeDef * adc ;
@@ -47,48 +49,75 @@ void analogin_init(analogin_t *obj, PinName pin) {
47
49
error ("ADC pin mapping failed" );
48
50
}
49
51
50
- // Get ADC registers structure address
51
- adc = (ADC_TypeDef * )(obj -> adc );
52
-
53
- // Enable ADC clock
54
- RCC_ADCCLKConfig (RCC_PCLK2_Div4 );
55
- RCC_APB2PeriphClockCmd (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 , ENABLE );
56
-
57
52
// Configure GPIO
58
53
pinmap_pinout (pin , PinMap_ADC );
59
54
60
- // Configure ADC
61
- ADC_InitStructure .ADC_Mode = ADC_Mode_Independent ;
62
- ADC_InitStructure .ADC_ScanConvMode = DISABLE ;
63
- ADC_InitStructure .ADC_ContinuousConvMode = DISABLE ;
64
- ADC_InitStructure .ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
65
- ADC_InitStructure .ADC_DataAlign = ADC_DataAlign_Right ;
66
- ADC_InitStructure .ADC_NbrOfChannel = 1 ;
67
- ADC_Init (adc , & ADC_InitStructure );
68
-
69
- // Configure ADC channel
70
- if (pin == PA_0 ) { ADC_RegularChannelConfig (adc , ADC_Channel_0 , 1 , ADC_SampleTime_7Cycles5 ); }
71
- if (pin == PA_1 ) { ADC_RegularChannelConfig (adc , ADC_Channel_1 , 1 , ADC_SampleTime_7Cycles5 ); }
72
- if (pin == PA_4 ) { ADC_RegularChannelConfig (adc , ADC_Channel_4 , 1 , ADC_SampleTime_7Cycles5 ); }
73
- if (pin == PB_0 ) { ADC_RegularChannelConfig (adc , ADC_Channel_8 , 1 , ADC_SampleTime_7Cycles5 ); }
74
- if (pin == PC_1 ) { ADC_RegularChannelConfig (adc , ADC_Channel_11 , 1 , ADC_SampleTime_7Cycles5 ); }
75
- if (pin == PC_0 ) { ADC_RegularChannelConfig (adc , ADC_Channel_10 , 1 , ADC_SampleTime_7Cycles5 ); }
76
-
77
- // Enable ADC
78
- ADC_Cmd (adc , ENABLE );
79
-
80
- // Calibrate ADC
81
- ADC_ResetCalibration (adc );
82
- while (ADC_GetResetCalibrationStatus (adc ));
83
- ADC_StartCalibration (adc );
84
- while (ADC_GetCalibrationStatus (adc ));
55
+ // Save pin number for the read function
56
+ obj -> pin = pin ;
57
+
58
+ // The ADC initialization is done once
59
+ if (adc_inited == 0 ) {
60
+ adc_inited = 1 ;
61
+
62
+ // Get ADC registers structure address
63
+ adc = (ADC_TypeDef * )(obj -> adc );
64
+
65
+ // Enable ADC clock
66
+ RCC_ADCCLKConfig (RCC_PCLK2_Div4 );
67
+ RCC_APB2PeriphClockCmd (RCC_APB2Periph_ADC1 , ENABLE );
68
+
69
+ // Configure ADC
70
+ ADC_InitStructure .ADC_Mode = ADC_Mode_Independent ;
71
+ ADC_InitStructure .ADC_ScanConvMode = DISABLE ;
72
+ ADC_InitStructure .ADC_ContinuousConvMode = DISABLE ;
73
+ ADC_InitStructure .ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
74
+ ADC_InitStructure .ADC_DataAlign = ADC_DataAlign_Right ;
75
+ ADC_InitStructure .ADC_NbrOfChannel = 1 ;
76
+ ADC_Init (adc , & ADC_InitStructure );
77
+
78
+ // Enable ADC
79
+ ADC_Cmd (adc , ENABLE );
80
+
81
+ // Calibrate ADC
82
+ ADC_ResetCalibration (adc );
83
+ while (ADC_GetResetCalibrationStatus (adc ));
84
+ ADC_StartCalibration (adc );
85
+ while (ADC_GetCalibrationStatus (adc ));
86
+ }
85
87
}
86
88
87
89
static inline uint16_t adc_read (analogin_t * obj ) {
88
90
// Get ADC registers structure address
89
91
ADC_TypeDef * adc = (ADC_TypeDef * )(obj -> adc );
92
+
93
+ // Configure ADC channel
94
+ switch (obj -> pin ) {
95
+ case PA_0 :
96
+ ADC_RegularChannelConfig (adc , ADC_Channel_0 , 1 , ADC_SampleTime_7Cycles5 );
97
+ break ;
98
+ case PA_1 :
99
+ ADC_RegularChannelConfig (adc , ADC_Channel_1 , 1 , ADC_SampleTime_7Cycles5 );
100
+ break ;
101
+ case PA_4 :
102
+ ADC_RegularChannelConfig (adc , ADC_Channel_4 , 1 , ADC_SampleTime_7Cycles5 );
103
+ break ;
104
+ case PB_0 :
105
+ ADC_RegularChannelConfig (adc , ADC_Channel_8 , 1 , ADC_SampleTime_7Cycles5 );
106
+ break ;
107
+ case PC_1 :
108
+ ADC_RegularChannelConfig (adc , ADC_Channel_11 , 1 , ADC_SampleTime_7Cycles5 );
109
+ break ;
110
+ case PC_0 :
111
+ ADC_RegularChannelConfig (adc , ADC_Channel_10 , 1 , ADC_SampleTime_7Cycles5 );
112
+ break ;
113
+ default :
114
+ return 0 ;
115
+ }
116
+
90
117
ADC_SoftwareStartConvCmd (adc , ENABLE ); // Start conversion
118
+
91
119
while (ADC_GetFlagStatus (adc , ADC_FLAG_EOC ) == RESET ); // Wait end of conversion
120
+
92
121
return (ADC_GetConversionValue (adc )); // Get conversion value
93
122
}
94
123
0 commit comments