Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit cb00a54

Browse files
committed
blackpill-f4: Implement Vrefint-based ADC correction
1 parent 7a77360 commit cb00a54

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,19 +165,27 @@ static void adc_init(void)
165165
gpio_mode_setup(VTREF_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VTREF_PIN);
166166
adc_power_off(ADC1);
167167
adc_disable_scan_mode(ADC1);
168+
adc_set_resolution(ADC1, ADC_CR1_RES_12BIT);
168169
adc_set_sample_time(ADC1, VTREF_CHANNEL, ADC_SMPR_SMP_480CYC);
170+
adc_set_sample_time(ADC1, ADC_CHANNEL_VREF, ADC_SMPR_SMP_480CYC);
171+
adc_enable_temperature_sensor();
169172
adc_power_on(ADC1);
170173
}
171174

172175
static uint16_t platform_adc_read(void)
173176
{
174-
const uint8_t channel = VTREF_CHANNEL;
175-
adc_set_regular_sequence(ADC1, 1, &channel);
177+
const uint8_t channels[] = {ADC_CHANNEL_VREF, VTREF_CHANNEL};
178+
adc_set_regular_sequence(ADC1, ARRAY_LENGTH(channels), channels);
176179
adc_start_conversion_regular(ADC1);
177180
while (!adc_eoc(ADC1))
178181
continue;
179-
uint32_t value = adc_read_regular(ADC1);
180-
return value;
182+
const uint16_t vrefint_sample = adc_read_regular(ADC1);
183+
const uint16_t value = adc_read_regular(ADC1);
184+
/* Vrefint = 1.21V typ, Vdda = 3.3V, expected code of 1501 */
185+
const uint16_t vrefint_expected = 1210U * 4095U / 3300U;
186+
const uint16_t value_adj = value * vrefint_expected / vrefint_sample;
187+
DEBUG_INFO("%s: Vrefint=%u, VTref=%u, returning %u", __func__, vrefint_sample, value, value_adj);
188+
return value_adj;
181189
}
182190

183191
const char *platform_target_voltage(void)

0 commit comments

Comments
 (0)