Skip to content

Commit 5bec05e

Browse files
committed
blackpill-f4: Implement Vrefint-based ADC correction
1 parent a652e12 commit 5bec05e

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/platforms/common/blackpill-f4/blackpill-f4.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,19 +159,27 @@ static void adc_init(void)
159159
gpio_mode_setup(VTREF_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VTREF_PIN);
160160
adc_power_off(ADC1);
161161
adc_disable_scan_mode(ADC1);
162+
adc_set_resolution(ADC1, ADC_CR1_RES_12BIT);
162163
adc_set_sample_time(ADC1, VTREF_CHANNEL, ADC_SMPR_SMP_480CYC);
164+
adc_set_sample_time(ADC1, ADC_CHANNEL_VREF, ADC_SMPR_SMP_480CYC);
165+
adc_enable_temperature_sensor();
163166
adc_power_on(ADC1);
164167
}
165168

166169
static uint16_t platform_adc_read(void)
167170
{
168-
const uint8_t channel = VTREF_CHANNEL;
169-
adc_set_regular_sequence(ADC1, 1, &channel);
171+
const uint8_t channels[] = {ADC_CHANNEL_VREF, VTREF_CHANNEL};
172+
adc_set_regular_sequence(ADC1, ARRAY_LENGTH(channels), channels);
170173
adc_start_conversion_regular(ADC1);
171174
while (!adc_eoc(ADC1))
172175
continue;
173-
uint32_t value = adc_read_regular(ADC1);
174-
return value;
176+
const uint16_t vrefint_sample = adc_read_regular(ADC1);
177+
const uint16_t value = adc_read_regular(ADC1);
178+
/* Vrefint = 1.21V typ, Vdda = 3.3V, expected code of 1501 */
179+
const uint16_t vrefint_expected = 1210U * 4095U / 3300U;
180+
const uint16_t value_adj = value * vrefint_expected / vrefint_sample;
181+
DEBUG_INFO("%s: Vrefint=%u, VTref=%u, returning %u", __func__, vrefint_sample, value, value_adj);
182+
return value_adj;
175183
}
176184

177185
const char *platform_target_voltage(void)

0 commit comments

Comments
 (0)