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