Skip to content

Commit ec00ea5

Browse files
committed
STM32 ADC INTERNAL CHANNEL reset after read
Internal channels use is enabling ADC "internal path" which needs to be disabled after measurement
1 parent 8e819de commit ec00ea5

File tree

12 files changed

+42
-35
lines changed

12 files changed

+42
-35
lines changed

targets/TARGET_STM/TARGET_STM32F0/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,12 @@ uint16_t adc_read(analogin_t *obj)
175175
HAL_ADC_Start(&obj->handle); // Start conversion
176176

177177
// Wait end of conversion and get value
178+
uint16_t adcValue = 0;
178179
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
179-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
180-
} else {
181-
return 0;
180+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
182181
}
182+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
183+
return adcValue;
183184
}
184185

185186
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32F1/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,12 @@ uint16_t adc_read(analogin_t *obj)
173173
HAL_ADC_Start(&obj->handle); // Start conversion
174174

175175
// Wait end of conversion and get value
176+
uint16_t adcValue = 0;
176177
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
177-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
178-
} else {
179-
return 0;
178+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
180179
}
180+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
181+
return adcValue;
181182
}
182183

183184
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32F1/device/stm32f1xx_hal_adc.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343

4444
/* Includes ------------------------------------------------------------------*/
4545
#include "stm32f1xx_hal_def.h"
46+
47+
/* Include low level driver */
48+
#include "stm32f1xx_ll_adc.h"
49+
4650
/** @addtogroup STM32F1xx_HAL_Driver
4751
* @{
4852
*/

targets/TARGET_STM/TARGET_STM32F2/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,12 @@ uint16_t adc_read(analogin_t *obj)
180180
HAL_ADC_Start(&obj->handle); // Start conversion
181181

182182
// Wait end of conversion and get value
183+
uint16_t adcValue = 0;
183184
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
184-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
185-
} else {
186-
return 0;
185+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
187186
}
187+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
188+
return adcValue;
188189
}
189190

190191
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32F2/device/stm32f2xx_hal_adc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
/* Includes ------------------------------------------------------------------*/
4747
#include "stm32f2xx_hal_def.h"
4848

49+
/* Include low level driver */
50+
#include "stm32f2xx_ll_adc.h"
51+
4952
/** @addtogroup STM32F2xx_HAL_Driver
5053
* @{
5154
*/

targets/TARGET_STM/TARGET_STM32F3/analogin_device.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ uint16_t adc_read(analogin_t *obj)
227227
} else {
228228
debug("HAL_ADC_PollForConversion issue\n");
229229
}
230-
230+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
231231
if (HAL_ADC_Stop(&obj->handle) != HAL_OK) {
232232
debug("HAL_ADC_Stop issue\n");;
233233
}

targets/TARGET_STM/TARGET_STM32F4/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,12 @@ uint16_t adc_read(analogin_t *obj)
186186
HAL_ADC_Start(&obj->handle); // Start conversion
187187

188188
// Wait end of conversion and get value
189+
uint16_t adcValue = 0;
189190
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
190-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
191-
} else {
192-
return 0;
191+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
193192
}
193+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
194+
return adcValue;
194195
}
195196

196197
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32F7/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,12 @@ uint16_t adc_read(analogin_t *obj)
186186
HAL_ADC_Start(&obj->handle); // Start conversion
187187

188188
// Wait end of conversion and get value
189+
uint16_t adcValue = 0;
189190
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
190-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
191-
} else {
192-
return 0;
191+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
193192
}
193+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
194+
return adcValue;
194195
}
195196

196197
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32H7/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,12 @@ uint16_t adc_read(analogin_t *obj)
223223
HAL_ADC_Start(&obj->handle); // Start conversion
224224

225225
// Wait end of conversion and get value
226+
uint16_t adcValue = 0;
226227
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
227-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
228-
} else {
229-
return 0;
228+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
230229
}
230+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
231+
return adcValue;
231232
}
232233

233234
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32L0/analogin_device.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,8 @@ uint16_t adc_read(analogin_t *obj)
179179
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
180180
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
181181
}
182-
sConfig.Rank = ADC_RANK_NONE;
183-
HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
184-
return adcValue;
182+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
183+
return adcValue;
185184
}
186185

187186
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32L1/analogin_device.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,12 @@ uint16_t adc_read(analogin_t *obj)
226226
HAL_ADC_Start(&obj->handle); // Start conversion
227227

228228
// Wait end of conversion and get value
229+
uint16_t adcValue = 0;
229230
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
230-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
231-
} else {
232-
return 0;
231+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
233232
}
233+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
234+
return adcValue;
234235
}
235236

236237
const PinMap *analogin_pinmap()

targets/TARGET_STM/TARGET_STM32L4/analogin_device.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -192,18 +192,12 @@ uint16_t adc_read(analogin_t *obj)
192192
HAL_ADC_Start(&obj->handle); // Start conversion
193193

194194
// Wait end of conversion and get value
195+
uint16_t adcValue = 0;
195196
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
196-
197-
/* Ref Manual: To prevent any unwanted consumption on the battery,
198-
it is recommended to enable the bridge divider only when needed for ADC conversion */
199-
if (sConfig.Channel == ADC_CHANNEL_VBAT) {
200-
CLEAR_BIT(__LL_ADC_COMMON_INSTANCE(obj->handle.Instance)->CCR, LL_ADC_PATH_INTERNAL_VBAT);
201-
}
202-
203-
return (uint16_t)HAL_ADC_GetValue(&obj->handle);
204-
} else {
205-
return 0;
197+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
206198
}
199+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
200+
return adcValue;
207201
}
208202

209203
const PinMap *analogin_pinmap()

0 commit comments

Comments
 (0)