@@ -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
172175static 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
183191const char * platform_target_voltage (void )
0 commit comments