From 2ae748910b961fd74d1f1e9bad94a470958bf5ed Mon Sep 17 00:00:00 2001 From: bcostm Date: Mon, 21 Nov 2016 13:07:26 +0100 Subject: [PATCH 1/2] STM32F4 - Clear VBATE and TSVREFE bits before configuring ADC channels --- targets/TARGET_STM/TARGET_STM32F4/analogin_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c index f2204a1551..4cc67f0bf4 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c @@ -183,13 +183,14 @@ static inline uint16_t adc_read(analogin_t *obj) return 0; } + ADC->CCR &= ~(ADC_CCR_VBATE | ADC_CCR_TSVREFE); // Workaround HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); HAL_ADC_Start(&AdcHandle); // Start conversion // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&AdcHandle)); + return (uint16_t)HAL_ADC_GetValue(&AdcHandle); } else { return 0; } From a3baf2d7bf4f16df5d7fa4d81db557f923ed3984 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 22 Nov 2016 11:03:44 +0100 Subject: [PATCH 2/2] Add more comment on the modified line --- targets/TARGET_STM/TARGET_STM32F4/analogin_api.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c index 4cc67f0bf4..7dff9c986c 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c @@ -183,7 +183,12 @@ static inline uint16_t adc_read(analogin_t *obj) return 0; } - ADC->CCR &= ~(ADC_CCR_VBATE | ADC_CCR_TSVREFE); // Workaround + // Measuring VBAT sets the ADC_CCR_VBATE bit in ADC->CCR, and there is not + // possibility with the ST HAL driver to clear it. If it isn't cleared, + // VBAT remains connected to the ADC channel in preference to temperature, + // so VBAT readings are returned in place of temperature. + ADC->CCR &= ~(ADC_CCR_VBATE | ADC_CCR_TSVREFE); + HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); HAL_ADC_Start(&AdcHandle); // Start conversion