35
35
#include "pinmap.h"
36
36
#include "mbed_error.h"
37
37
#include "PeripheralPins.h"
38
- #include <stdbool.h>
39
38
40
39
void analogin_init (analogin_t * obj , PinName pin )
41
40
{
42
- static bool adc_calibrated = false;
43
- RCC_PeriphCLKInitTypeDef PeriphClkInit ;
44
41
uint32_t function = (uint32_t )NC ;
45
42
46
43
// ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
@@ -86,8 +83,8 @@ void analogin_init(analogin_t *obj, PinName pin)
86
83
}
87
84
88
85
// This section is done only once
89
- if (! adc_calibrated ) {
90
- adc_calibrated = true ;
86
+ if (__HAL_RCC_GET_ADC_SOURCE () != RCC_ADCPCLK2_DIV6 ) {
87
+ RCC_PeriphCLKInitTypeDef PeriphClkInit ;
91
88
// Configure ADC clock prescaler
92
89
// Caution: On STM32F1, ADC clock frequency max is 14 MHz (refer to device datasheet).
93
90
// Therefore, ADC clock prescaler must be configured in function
@@ -108,7 +105,7 @@ uint16_t adc_read(analogin_t *obj)
108
105
109
106
// Configure ADC channel
110
107
sConfig .Rank = 1 ;
111
- sConfig .SamplingTime = ADC_SAMPLETIME_7CYCLES_5 ;
108
+ sConfig .SamplingTime = ADC_SAMPLETIME_41CYCLES_5 ;
112
109
113
110
switch (obj -> channel ) {
114
111
case 0 :
@@ -161,9 +158,11 @@ uint16_t adc_read(analogin_t *obj)
161
158
break ;
162
159
case 16 :
163
160
sConfig .Channel = ADC_CHANNEL_TEMPSENSOR ;
161
+ sConfig .SamplingTime = ADC_SAMPLETIME_239CYCLES_5 ;
164
162
break ;
165
163
case 17 :
166
164
sConfig .Channel = ADC_CHANNEL_VREFINT ;
165
+ sConfig .SamplingTime = ADC_SAMPLETIME_239CYCLES_5 ;
167
166
break ;
168
167
default :
169
168
return 0 ;
0 commit comments