Skip to content

Commit 7005bc2

Browse files
committed
STM32F3 ADC: remove adc_inited flag
1 parent f12391a commit 7005bc2

File tree

1 file changed

+30
-50
lines changed

1 file changed

+30
-50
lines changed

targets/TARGET_STM/TARGET_STM32F3/analogin_api.c

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,9 @@
3636
#include "mbed_error.h"
3737
#include "PeripheralPins.h"
3838

39-
4039
void analogin_init(analogin_t *obj, PinName pin)
4140
{
42-
#if defined(ADC1)
43-
static int adc1_inited = 0;
44-
#endif
45-
#if defined(ADC2)
46-
static int adc2_inited = 0;
47-
#endif
48-
#if defined(ADC3)
49-
static int adc3_inited = 0;
50-
#endif
51-
#if defined(ADC4)
52-
static int adc4_inited = 0;
53-
#endif
54-
41+
static int adc_calibrated = 0;
5542
uint32_t function = (uint32_t)NC;
5643

5744
// ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
@@ -60,14 +47,14 @@ void analogin_init(analogin_t *obj, PinName pin)
6047
if ((pin < 0xF0) || (pin >= 0x100)) {
6148
// Normal channels
6249
// Get the peripheral name from the pin and assign it to the object
63-
obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
50+
obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC);
6451
// Get the functions (adc channel) from the pin and assign it to the object
6552
function = pinmap_function(pin, PinMap_ADC);
6653
// Configure GPIO
6754
pinmap_pinout(pin, PinMap_ADC);
6855
} else {
6956
// Internal channels
70-
obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal);
57+
obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal);
7158
function = pinmap_function(pin, PinMap_ADC_Internal);
7259
// No GPIO configuration for internal channels
7360
}
@@ -79,60 +66,53 @@ void analogin_init(analogin_t *obj, PinName pin)
7966
// Save pin number for the read function
8067
obj->pin = pin;
8168

82-
// Check if ADC is already initialized
83-
// Enable ADC clock
69+
// Configure ADC object structures
70+
obj->handle.State = HAL_ADC_STATE_RESET;
71+
obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
72+
obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
73+
obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
74+
obj->handle.Init.ScanConvMode = DISABLE;
75+
obj->handle.Init.EOCSelection = EOC_SINGLE_CONV;
76+
obj->handle.Init.LowPowerAutoWait = DISABLE;
77+
obj->handle.Init.ContinuousConvMode = DISABLE;
78+
obj->handle.Init.NbrOfConversion = 1;
79+
obj->handle.Init.DiscontinuousConvMode = DISABLE;
80+
obj->handle.Init.NbrOfDiscConversion = 0;
81+
obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
82+
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
83+
obj->handle.Init.DMAContinuousRequests = DISABLE;
84+
obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN;
85+
8486
#if defined(ADC1)
85-
if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return;
8687
if ((ADCName)obj->handle.Instance == ADC_1) {
87-
__ADC1_CLK_ENABLE();
88-
adc1_inited = 1;
88+
__HAL_RCC_ADC1_CLK_ENABLE();
8989
}
9090
#endif
9191
#if defined(ADC2)
92-
if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return;
9392
if ((ADCName)obj->handle.Instance == ADC_2) {
94-
__ADC2_CLK_ENABLE();
95-
adc2_inited = 1;
93+
__HAL_RCC_ADC2_CLK_ENABLE();
9694
}
9795
#endif
9896
#if defined(ADC3)
99-
if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return;
10097
if ((ADCName)obj->handle.Instance == ADC_3) {
101-
__ADC34_CLK_ENABLE();
102-
adc3_inited = 1;
98+
__HAL_RCC_ADC34_CLK_ENABLE();
10399
}
104100
#endif
105101
#if defined(ADC4)
106-
if (((ADCName)obj->handle.Instance == ADC_4) && adc4_inited) return;
107102
if ((ADCName)obj->handle.Instance == ADC_4) {
108-
__ADC34_CLK_ENABLE();
109-
adc4_inited = 1;
103+
__HAL_RCC_ADC34_CLK_ENABLE();
110104
}
111105
#endif
112106

113-
// Configure ADC
114-
obj->handle.State = HAL_ADC_STATE_RESET;
115-
obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
116-
obj->handle.Init.Resolution = ADC_RESOLUTION12b;
117-
obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
118-
obj->handle.Init.ScanConvMode = DISABLE;
119-
obj->handle.Init.EOCSelection = EOC_SINGLE_CONV;
120-
obj->handle.Init.LowPowerAutoWait = DISABLE;
121-
obj->handle.Init.ContinuousConvMode = DISABLE;
122-
obj->handle.Init.NbrOfConversion = 1;
123-
obj->handle.Init.DiscontinuousConvMode = DISABLE;
124-
obj->handle.Init.NbrOfDiscConversion = 0;
125-
obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
126-
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
127-
obj->handle.Init.DMAContinuousRequests = DISABLE;
128-
obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN;
129-
130107
if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
131108
error("Cannot initialize ADC");
132109
}
133110

134-
// Calibrate ADC
135-
HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED);
111+
// ADC calibration is done only once
112+
if (adc_calibrated == 0) {
113+
adc_calibrated = 1;
114+
HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED);
115+
}
136116
}
137117

138118
static inline uint16_t adc_read(analogin_t *obj)
@@ -211,7 +191,7 @@ static inline uint16_t adc_read(analogin_t *obj)
211191

212192
// Wait end of conversion and get value
213193
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
214-
return (HAL_ADC_GetValue(&obj->handle));
194+
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
215195
} else {
216196
return 0;
217197
}

0 commit comments

Comments
 (0)