From 2e2744ccbe284fa95aa03e2a4eec30e238d3dc8c Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 13:07:35 +0100 Subject: [PATCH 01/14] STM32F0 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32F0/analogin_api.c | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c index bfa8adc443..3ebefb4830 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c @@ -33,12 +33,12 @@ #include "mbed_wait_api.h" #include "cmsis.h" #include "pinmap.h" -#include "PeripheralPins.h" #include "mbed_error.h" +#include "PeripheralPins.h" -int adc_inited = 0; - -void analogin_init(analogin_t *obj, PinName pin) { +void analogin_init(analogin_t *obj, PinName pin) +{ + static int adc_calibrated = 0; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -47,14 +47,14 @@ void analogin_init(analogin_t *obj, PinName pin) { if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -66,40 +66,38 @@ void analogin_init(analogin_t *obj, PinName pin) { // Save pin number for the read function obj->pin = pin; - // The ADC initialization is done once - if (adc_inited == 0) { - adc_inited = 1; + // Configure ADC object structures + obj->handle.State = HAL_ADC_STATE_RESET; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + obj->handle.Init.Resolution = ADC_RESOLUTION_12B; + obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; + obj->handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; + obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; + obj->handle.Init.LowPowerAutoWait = DISABLE; + obj->handle.Init.LowPowerAutoPowerOff = DISABLE; + obj->handle.Init.ContinuousConvMode = DISABLE; + obj->handle.Init.DiscontinuousConvMode = DISABLE; + obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; + obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + obj->handle.Init.DMAContinuousRequests = DISABLE; + obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN; - // Enable ADC clock - __ADC1_CLK_ENABLE(); + __HAL_RCC_ADC1_CLK_ENABLE(); - // Configure ADC - obj->handle.State = HAL_ADC_STATE_RESET; - obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - obj->handle.Init.Resolution = ADC_RESOLUTION12b; - obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; - obj->handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; - obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; - obj->handle.Init.LowPowerAutoWait = DISABLE; - obj->handle.Init.LowPowerAutoPowerOff = DISABLE; - obj->handle.Init.ContinuousConvMode = DISABLE; - obj->handle.Init.DiscontinuousConvMode = DISABLE; - obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; - obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - obj->handle.Init.DMAContinuousRequests = DISABLE; - obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN; - if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC"); - } - // Run the ADC calibration - if (HAL_ADCEx_Calibration_Start(&obj->handle) != HAL_OK) { - error("Cannot Start ADC_Calibration"); - } + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { + error("Cannot initialize ADC"); + } + + // ADC calibration is done only once + if (adc_calibrated == 0) { + adc_calibrated = 1; + HAL_ADCEx_Calibration_Start(&obj->handle); } } -static inline uint16_t adc_read(analogin_t *obj) { - ADC_ChannelConfTypeDef sConfig; +static inline uint16_t adc_read(analogin_t *obj) +{ + ADC_ChannelConfTypeDef sConfig = {0}; // Configure ADC channel sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; @@ -182,20 +180,22 @@ static inline uint16_t adc_read(analogin_t *obj) { // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } } -uint16_t analogin_read_u16(analogin_t *obj) { +uint16_t analogin_read_u16(analogin_t *obj) +{ uint16_t value = adc_read(obj); // 12-bit to 16-bit conversion value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); return value; } -float analogin_read(analogin_t *obj) { +float analogin_read(analogin_t *obj) +{ uint16_t value = adc_read(obj); return (float)value * (1.0f / (float)0xFFF); // 12 bits range } From 36110e10cfd27bdfbd6aa7a570f21e05f8741c3b Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 13:20:21 +0100 Subject: [PATCH 02/14] STM32F1 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32F1/analogin_api.c | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c index 172a513d4b..816e800d76 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c @@ -36,10 +36,9 @@ #include "mbed_error.h" #include "PeripheralPins.h" -int adc_inited = 0; - void analogin_init(analogin_t *obj, PinName pin) { + static int adc_calibrated = 0; RCC_PeriphCLKInitTypeDef PeriphClkInit; uint32_t function = (uint32_t)NC; @@ -49,14 +48,14 @@ void analogin_init(analogin_t *obj, PinName pin) if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -68,13 +67,26 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // The ADC initialization is done once - if (adc_inited == 0) { - adc_inited = 1; + // Enable ADC clock + __HAL_RCC_ADC1_CLK_ENABLE(); - // Enable ADC clock - __HAL_RCC_ADC1_CLK_ENABLE(); + // Configure ADC object structures + obj->handle.State = HAL_ADC_STATE_RESET; + obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; + obj->handle.Init.ScanConvMode = DISABLE; + obj->handle.Init.ContinuousConvMode = DISABLE; + obj->handle.Init.NbrOfConversion = 1; + obj->handle.Init.DiscontinuousConvMode = DISABLE; + obj->handle.Init.NbrOfDiscConversion = 0; + obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { + error("Cannot initialize ADC"); + } + + // This section is done only once + if (adc_calibrated == 0) { + adc_calibrated = 1; // Configure ADC clock prescaler // Caution: On STM32F1, ADC clock frequency max is 14 MHz (refer to device datasheet). // Therefore, ADC clock prescaler must be configured in function @@ -84,29 +96,14 @@ void analogin_init(analogin_t *obj, PinName pin) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); - - // Configure ADC - obj->handle.State = HAL_ADC_STATE_RESET; - obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; - obj->handle.Init.ScanConvMode = DISABLE; - obj->handle.Init.ContinuousConvMode = DISABLE; - obj->handle.Init.NbrOfConversion = 1; - obj->handle.Init.DiscontinuousConvMode = DISABLE; - obj->handle.Init.NbrOfDiscConversion = 0; - obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; - - if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC\n"); - } - - // Calibrate ADC + // Calibration HAL_ADCEx_Calibration_Start(&obj->handle); } } static inline uint16_t adc_read(analogin_t *obj) { - ADC_ChannelConfTypeDef sConfig; + ADC_ChannelConfTypeDef sConfig = {0}; // Configure ADC channel sConfig.Rank = 1; @@ -177,7 +174,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From f12391ad2518352530dc63d96419fb9a40a68f7e Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 13:37:02 +0100 Subject: [PATCH 03/14] STM32F2 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32F2/analogin_api.c | 65 +++++++------------ 1 file changed, 25 insertions(+), 40 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c index 19c82c2036..9abb252e84 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c @@ -40,29 +40,20 @@ void analogin_init(analogin_t *obj, PinName pin) { uint32_t function = (uint32_t)NC; -#if defined(ADC1) - static int adc1_inited = 0; -#endif -#if defined(ADC2) - static int adc2_inited = 0; -#endif -#if defined(ADC3) - static int adc3_inited = 0; -#endif // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) // are described in PinNames.h and PeripheralPins.c // Pin value must be between 0xF0 and 0xFF if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -74,33 +65,10 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // Check if ADC is already initialized - // Enable ADC clock -#if defined(ADC1) - if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return; - if ((ADCName)obj->handle.Instance == ADC_1) { - __ADC1_CLK_ENABLE(); - adc1_inited = 1; - } -#endif -#if defined(ADC2) - if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return; - if ((ADCName)obj->handle.Instance == ADC_2) { - __ADC2_CLK_ENABLE(); - adc2_inited = 1; - } -#endif -#if defined(ADC3) - if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return; - if ((ADCName)obj->handle.Instance == ADC_3) { - __ADC3_CLK_ENABLE(); - adc3_inited = 1; - } -#endif - // Configure ADC + // Configure ADC object structures obj->handle.State = HAL_ADC_STATE_RESET; - obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; - obj->handle.Init.Resolution = ADC_RESOLUTION12b; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; + obj->handle.Init.Resolution = ADC_RESOLUTION_12B; obj->handle.Init.ScanConvMode = DISABLE; obj->handle.Init.ContinuousConvMode = DISABLE; obj->handle.Init.DiscontinuousConvMode = DISABLE; @@ -111,8 +79,25 @@ void analogin_init(analogin_t *obj, PinName pin) obj->handle.Init.NbrOfConversion = 1; obj->handle.Init.DMAContinuousRequests = DISABLE; obj->handle.Init.EOCSelection = DISABLE; + +#if defined(ADC1) + if ((ADCName)obj->handle.Instance == ADC_1) { + __HAL_RCC_ADC1_CLK_ENABLE(); + } +#endif +#if defined(ADC2) + if ((ADCName)obj->handle.Instance == ADC_2) { + __HAL_RCC_ADC2_CLK_ENABLE(); + } +#endif +#if defined(ADC3) + if ((ADCName)obj->handle.Instance == ADC_3) { + __HAL_RCC_ADC3_CLK_ENABLE(); + } +#endif + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC\n"); + error("Cannot initialize ADC"); } } @@ -122,7 +107,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Configure ADC channel sConfig.Rank = 1; - sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; + sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES; sConfig.Offset = 0; switch (obj->channel) { @@ -193,7 +178,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From 7005bc21d719931784f57456980e527f3745afe0 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 14:03:21 +0100 Subject: [PATCH 04/14] STM32F3 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32F3/analogin_api.c | 86 +++++++------------ 1 file changed, 33 insertions(+), 53 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c index 63c4681235..fc43939153 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c @@ -36,22 +36,9 @@ #include "mbed_error.h" #include "PeripheralPins.h" - void analogin_init(analogin_t *obj, PinName pin) { -#if defined(ADC1) - static int adc1_inited = 0; -#endif -#if defined(ADC2) - static int adc2_inited = 0; -#endif -#if defined(ADC3) - static int adc3_inited = 0; -#endif -#if defined(ADC4) - static int adc4_inited = 0; -#endif - + static int adc_calibrated = 0; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -60,14 +47,14 @@ void analogin_init(analogin_t *obj, PinName pin) if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -79,41 +66,10 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // Check if ADC is already initialized - // Enable ADC clock -#if defined(ADC1) - if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return; - if ((ADCName)obj->handle.Instance == ADC_1) { - __ADC1_CLK_ENABLE(); - adc1_inited = 1; - } -#endif -#if defined(ADC2) - if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return; - if ((ADCName)obj->handle.Instance == ADC_2) { - __ADC2_CLK_ENABLE(); - adc2_inited = 1; - } -#endif -#if defined(ADC3) - if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return; - if ((ADCName)obj->handle.Instance == ADC_3) { - __ADC34_CLK_ENABLE(); - adc3_inited = 1; - } -#endif -#if defined(ADC4) - if (((ADCName)obj->handle.Instance == ADC_4) && adc4_inited) return; - if ((ADCName)obj->handle.Instance == ADC_4) { - __ADC34_CLK_ENABLE(); - adc4_inited = 1; - } -#endif - - // Configure ADC + // Configure ADC object structures obj->handle.State = HAL_ADC_STATE_RESET; - obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; - obj->handle.Init.Resolution = ADC_RESOLUTION12b; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; + obj->handle.Init.Resolution = ADC_RESOLUTION_12B; obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; obj->handle.Init.ScanConvMode = DISABLE; obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; @@ -127,12 +83,36 @@ void analogin_init(analogin_t *obj, PinName pin) obj->handle.Init.DMAContinuousRequests = DISABLE; obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN; +#if defined(ADC1) + if ((ADCName)obj->handle.Instance == ADC_1) { + __HAL_RCC_ADC1_CLK_ENABLE(); + } +#endif +#if defined(ADC2) + if ((ADCName)obj->handle.Instance == ADC_2) { + __HAL_RCC_ADC2_CLK_ENABLE(); + } +#endif +#if defined(ADC3) + if ((ADCName)obj->handle.Instance == ADC_3) { + __HAL_RCC_ADC34_CLK_ENABLE(); + } +#endif +#if defined(ADC4) + if ((ADCName)obj->handle.Instance == ADC_4) { + __HAL_RCC_ADC34_CLK_ENABLE(); + } +#endif + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { error("Cannot initialize ADC"); } - // Calibrate ADC - HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); + // ADC calibration is done only once + if (adc_calibrated == 0) { + adc_calibrated = 1; + HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); + } } static inline uint16_t adc_read(analogin_t *obj) @@ -211,7 +191,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From d5ff05a03b3ad4072bcb453652cc750aa03c8c78 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 11:30:59 +0100 Subject: [PATCH 05/14] STM32F4 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32F4/analogin_api.c | 56 +++++++------------ 1 file changed, 20 insertions(+), 36 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c index ada98bc4d7..08598dc0e6 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c @@ -40,29 +40,20 @@ void analogin_init(analogin_t *obj, PinName pin) { uint32_t function = (uint32_t)NC; -#if defined(ADC1) - static int adc1_inited = 0; -#endif -#if defined(ADC2) - static int adc2_inited = 0; -#endif -#if defined(ADC3) - static int adc3_inited = 0; -#endif // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) // are described in PinNames.h and PeripheralPins.c // Pin value must be between 0xF0 and 0xFF if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -74,30 +65,7 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // Check if ADC is already initialized - // Enable ADC clock -#if defined(ADC1) - if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return; - if ((ADCName)obj->handle.Instance == ADC_1) { - __HAL_RCC_ADC1_CLK_ENABLE(); - adc1_inited = 1; - } -#endif -#if defined(ADC2) - if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return; - if ((ADCName)obj->handle.Instance == ADC_2) { - __HAL_RCC_ADC2_CLK_ENABLE(); - adc2_inited = 1; - } -#endif -#if defined(ADC3) - if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return; - if ((ADCName)obj->handle.Instance == ADC_3) { - __HAL_RCC_ADC3_CLK_ENABLE(); - adc3_inited = 1; - } -#endif - // Configure ADC + // Configure ADC object structures obj->handle.State = HAL_ADC_STATE_RESET; obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; obj->handle.Init.Resolution = ADC_RESOLUTION_12B; @@ -112,8 +80,24 @@ void analogin_init(analogin_t *obj, PinName pin) obj->handle.Init.DMAContinuousRequests = DISABLE; obj->handle.Init.EOCSelection = DISABLE; +#if defined(ADC1) + if ((ADCName)obj->handle.Instance == ADC_1) { + __HAL_RCC_ADC1_CLK_ENABLE(); + } +#endif +#if defined(ADC2) + if ((ADCName)obj->handle.Instance == ADC_2) { + __HAL_RCC_ADC2_CLK_ENABLE(); + } +#endif +#if defined(ADC3) + if ((ADCName)obj->handle.Instance == ADC_3) { + __HAL_RCC_ADC3_CLK_ENABLE(); + } +#endif + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC\n"); + error("Cannot initialize ADC"); } } From 75f80abddca5c8577b294151fa4a06f22c7ab19a Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 14:31:49 +0100 Subject: [PATCH 06/14] STM32F7 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32F7/analogin_api.c | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c index b0b566bd58..cc37b0b2cf 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c @@ -33,35 +33,27 @@ #include "mbed_wait_api.h" #include "cmsis.h" #include "pinmap.h" -#include "PeripheralPins.h" #include "mbed_error.h" +#include "PeripheralPins.h" void analogin_init(analogin_t *obj, PinName pin) { uint32_t function = (uint32_t)NC; -#if defined(ADC1) - static int adc1_inited = 0; -#endif -#if defined(ADC2) - static int adc2_inited = 0; -#endif -#if defined(ADC3) - static int adc3_inited = 0; -#endif // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) // are described in PinNames.h and PeripheralPins.c // Pin value must be between 0xF0 and 0xFF if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); + // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -73,33 +65,9 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // Check if ADC is already initialized - // Enable ADC clock -#if defined(ADC1) - if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return; - if ((ADCName)obj->handle.Instance == ADC_1) { - __HAL_RCC_ADC1_CLK_ENABLE(); - adc1_inited = 1; - } -#endif -#if defined(ADC2) - if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return; - if ((ADCName)obj->handle.Instance == ADC_2) { - __HAL_RCC_ADC2_CLK_ENABLE(); - adc2_inited = 1; - } -#endif -#if defined(ADC3) - if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return; - if ((ADCName)obj->handle.Instance == ADC_3) { - __HAL_RCC_ADC3_CLK_ENABLE(); - adc3_inited = 1; - } -#endif - - // Configure ADC + // Configure ADC object structures obj->handle.State = HAL_ADC_STATE_RESET; - obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; obj->handle.Init.Resolution = ADC_RESOLUTION_12B; obj->handle.Init.ScanConvMode = DISABLE; obj->handle.Init.ContinuousConvMode = DISABLE; @@ -112,6 +80,22 @@ void analogin_init(analogin_t *obj, PinName pin) obj->handle.Init.DMAContinuousRequests = DISABLE; obj->handle.Init.EOCSelection = DISABLE; +#if defined(ADC1) + if ((ADCName)obj->handle.Instance == ADC_1) { + __HAL_RCC_ADC1_CLK_ENABLE(); + } +#endif +#if defined(ADC2) + if ((ADCName)obj->handle.Instance == ADC_2) { + __HAL_RCC_ADC2_CLK_ENABLE(); + } +#endif +#if defined(ADC3) + if ((ADCName)obj->handle.Instance == ADC_3) { + __HAL_RCC_ADC3_CLK_ENABLE(); + } +#endif + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { error("Cannot initialize ADC"); } @@ -188,16 +172,13 @@ static inline uint16_t adc_read(analogin_t *obj) return 0; } - if (HAL_ADC_ConfigChannel(&obj->handle, &sConfig) != HAL_OK) { - error("Cannot configure ADC channel"); - } + HAL_ADC_ConfigChannel(&obj->handle, &sConfig); HAL_ADC_Start(&obj->handle); // Start conversion // Wait end of conversion and get value - HAL_ADC_PollForConversion(&obj->handle, 10); - if (HAL_ADC_GetState(&obj->handle) & HAL_ADC_STATE_EOC_REG) { - return (HAL_ADC_GetValue(&obj->handle)); + if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From 4b82479175cb400888ebff145b4a74e2a7f9adf0 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 7 Nov 2017 16:54:19 +0100 Subject: [PATCH 07/14] STM32L0 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32L0/analogin_api.c | 67 +++++++++---------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c b/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c index e6d68e29cf..6bc993d0ae 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c @@ -36,12 +36,10 @@ #include "mbed_error.h" #include "PeripheralPins.h" -int adc_inited = 0; - void analogin_init(analogin_t *obj, PinName pin) { + static int adc_calibrated = 0; uint32_t function = (uint32_t)NC; - obj->handle.Instance = (ADC_TypeDef *)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) // are described in PinNames.h and PeripheralPins.c @@ -68,41 +66,38 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // The ADC initialization is done once - if (adc_inited == 0) { - adc_inited = 1; + // Configure ADC object structures + obj->handle.State = HAL_ADC_STATE_RESET; + obj->handle.Init.OversamplingMode = DISABLE; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1; + obj->handle.Init.Resolution = ADC_RESOLUTION_12B; + obj->handle.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; + obj->handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; + obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; + obj->handle.Init.ContinuousConvMode = DISABLE; + obj->handle.Init.DiscontinuousConvMode = DISABLE; + obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE; + obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG0_T6_TRGO; // Not used here + obj->handle.Init.DMAContinuousRequests = DISABLE; + obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; + obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN; + obj->handle.Init.LowPowerAutoWait = ENABLE; + obj->handle.Init.LowPowerFrequencyMode = DISABLE; // To be enabled only if ADC clock < 2.8 MHz + obj->handle.Init.LowPowerAutoPowerOff = DISABLE; - obj->handle.State = HAL_ADC_STATE_RESET; - // Enable ADC clock - __ADC1_CLK_ENABLE(); + __HAL_RCC_ADC1_CLK_ENABLE(); - // Configure ADC - obj->handle.Init.OversamplingMode = DISABLE; - obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1; - obj->handle.Init.Resolution = ADC_RESOLUTION12b; - obj->handle.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; - obj->handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; - obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; - obj->handle.Init.ContinuousConvMode = DISABLE; - obj->handle.Init.DiscontinuousConvMode = DISABLE; - obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE; - obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG0_T6_TRGO; // Not used here - obj->handle.Init.DMAContinuousRequests = DISABLE; - obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; - obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN; - obj->handle.Init.LowPowerAutoWait = ENABLE; - obj->handle.Init.LowPowerFrequencyMode = DISABLE; // To be enabled only if ADC clock < 2.8 MHz - obj->handle.Init.LowPowerAutoPowerOff = DISABLE; - - if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC"); - } - - // Calibration - HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); - - __HAL_ADC_ENABLE(&obj->handle); + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { + error("Cannot initialize ADC"); } + + // ADC calibration is done only once + if (adc_calibrated == 0) { + adc_calibrated = 1; + HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); + } + + __HAL_ADC_ENABLE(&obj->handle); } static inline uint16_t adc_read(analogin_t *obj) @@ -182,7 +177,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From 52d942e2d21775bd62ba1a5d02d46f7057c89dd4 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 14:55:28 +0100 Subject: [PATCH 08/14] STM32L1 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32L1/analogin_api.c | 63 +++++++++---------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c index d4eead2bbb..b9d4694d4f 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c @@ -36,10 +36,9 @@ #include "mbed_error.h" #include "PeripheralPins.h" -int adc_inited = 0; - void analogin_init(analogin_t *obj, PinName pin) { + static int adc_hsi_inited = 0; RCC_OscInitTypeDef RCC_OscInitStruct; uint32_t function = (uint32_t)NC; @@ -49,14 +48,14 @@ void analogin_init(analogin_t *obj, PinName pin) if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -68,41 +67,39 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // The ADC initialization is done once - if (adc_inited == 0) { - adc_inited = 1; + // Configure ADC object structures + obj->handle.State = HAL_ADC_STATE_RESET; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; + obj->handle.Init.Resolution = ADC_RESOLUTION_12B; + obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; + obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) + obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example). + obj->handle.Init.LowPowerAutoWait = ADC_AUTOWAIT_UNTIL_DATA_READ; // Enable the dynamic low power Auto Delay: new conversion start only when the previous conversion (for regular group) or previous sequence (for injected group) has been treated by user software. + obj->handle.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_IDLE_PHASE; // Enable the auto-off mode: the ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered (with startup time between trigger and start of sampling). + obj->handle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; + obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig + obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled + obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled + obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled + obj->handle.Init.ExternalTrigConv = 0; // Not used + obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + obj->handle.Init.DMAContinuousRequests = DISABLE; + __HAL_RCC_ADC1_CLK_ENABLE(); + + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { + error("Cannot initialize ADC"); + } + + // This section is done only once + if (adc_hsi_inited == 0) { + adc_hsi_inited = 1; // Enable the HSI (to clock the ADC) RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; HAL_RCC_OscConfig(&RCC_OscInitStruct); - - obj->handle.State = HAL_ADC_STATE_RESET; - // Enable ADC clock - __ADC1_CLK_ENABLE(); - - // Configure ADC - obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; - obj->handle.Init.Resolution = ADC_RESOLUTION12b; - obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; - obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) - obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example). - obj->handle.Init.LowPowerAutoWait = ADC_AUTOWAIT_UNTIL_DATA_READ; // Enable the dynamic low power Auto Delay: new conversion start only when the previous conversion (for regular group) or previous sequence (for injected group) has been treated by user software. - obj->handle.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_IDLE_PHASE; // Enable the auto-off mode: the ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered (with startup time between trigger and start of sampling). - obj->handle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; - obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig - obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled - obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled - obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled - obj->handle.Init.ExternalTrigConv = 0; // Not used - obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - obj->handle.Init.DMAContinuousRequests = DISABLE; - - if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC"); - } } } @@ -231,7 +228,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From 072ec2e76564121c5a27dfe7db6ccf853eceaf8f Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 15:27:41 +0100 Subject: [PATCH 09/14] STM32L4 ADC: remove adc_inited flag --- .../TARGET_STM/TARGET_STM32L4/analogin_api.c | 63 +++++++++---------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c b/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c index 9fc5e1ff00..c162604caf 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c @@ -36,10 +36,9 @@ #include "mbed_error.h" #include "PeripheralPins.h" -int adc_inited = 0; - void analogin_init(analogin_t *obj, PinName pin) { + static int adc_calibrated = 0; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -48,14 +47,14 @@ void analogin_init(analogin_t *obj, PinName pin) if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels - obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal); + obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } @@ -67,37 +66,35 @@ void analogin_init(analogin_t *obj, PinName pin) // Save pin number for the read function obj->pin = pin; - // The ADC initialization is done once - if (adc_inited == 0) { - adc_inited = 1; + // Configure ADC object structures + obj->handle.State = HAL_ADC_STATE_RESET; + obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; // Asynchronous clock mode, input ADC clock + obj->handle.Init.Resolution = ADC_RESOLUTION_12B; + obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; + obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) + obj->handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example). + obj->handle.Init.LowPowerAutoWait = DISABLE; + obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig + obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled + obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled + obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled + obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Software start to trig the 1st conversion manually, without external event + obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + obj->handle.Init.DMAContinuousRequests = DISABLE; + obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; // DR register is overwritten with the last conversion result in case of overrun + obj->handle.Init.OversamplingMode = DISABLE; // No oversampling - // Enable ADC clock - __HAL_RCC_ADC_CLK_ENABLE(); - __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK); + // Enable ADC clock + __HAL_RCC_ADC_CLK_ENABLE(); + __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK); - obj->handle.State = HAL_ADC_STATE_RESET; - // Configure ADC - obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; // Asynchronous clock mode, input ADC clock - obj->handle.Init.Resolution = ADC_RESOLUTION_12B; - obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; - obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) - obj->handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example). - obj->handle.Init.LowPowerAutoWait = DISABLE; - obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig - obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled - obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled - obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled - obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Software start to trig the 1st conversion manually, without external event - obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - obj->handle.Init.DMAContinuousRequests = DISABLE; - obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; // DR register is overwritten with the last conversion result in case of overrun - obj->handle.Init.OversamplingMode = DISABLE; // No oversampling + if (HAL_ADC_Init(&obj->handle) != HAL_OK) { + error("Cannot initialize ADC"); + } - if (HAL_ADC_Init(&obj->handle) != HAL_OK) { - error("Cannot initialize ADC\n"); - } - - // Calibrate ADC + // ADC calibration is done only once + if (adc_calibrated == 0) { + adc_calibrated = 1; HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); } } @@ -181,7 +178,7 @@ static inline uint16_t adc_read(analogin_t *obj) // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&obj->handle)); + return (uint16_t)HAL_ADC_GetValue(&obj->handle); } else { return 0; } From 4dbe95dded22613c85ce1e5bf6de28d0b81568a9 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 15:33:17 +0100 Subject: [PATCH 10/14] STM32: rename analogin_api.c in analogin_device.c --- .../TARGET_STM32F0/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32F1/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32F2/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32F3/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32F4/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32F7/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32L0/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32L1/{analogin_api.c => analogin_device.c} | 0 .../TARGET_STM32L4/{analogin_api.c => analogin_device.c} | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename targets/TARGET_STM/TARGET_STM32F0/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32F1/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32F2/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32F3/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32F4/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32F7/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32L0/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32L1/{analogin_api.c => analogin_device.c} (100%) rename targets/TARGET_STM/TARGET_STM32L4/{analogin_api.c => analogin_device.c} (100%) diff --git a/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F0/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32F0/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F1/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32F1/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F2/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32F2/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F3/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32F3/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32F4/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F7/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32F7/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32L0/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32L0/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32L1/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32L1/analogin_device.c diff --git a/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32L4/analogin_api.c rename to targets/TARGET_STM/TARGET_STM32L4/analogin_device.c From 34fdcc926b1cc58a237dc229fb8e6be03a276898 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 15:39:35 +0100 Subject: [PATCH 11/14] STM32: move analogin_read functions in a common file --- .../TARGET_STM/TARGET_STM32F0/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32F1/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32F2/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32F3/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32F4/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32F7/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32L0/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32L1/analogin_device.c | 14 -------------- .../TARGET_STM/TARGET_STM32L4/analogin_device.c | 14 -------------- 9 files changed, 126 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c index 3ebefb4830..2c72796525 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c @@ -186,18 +186,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c index 816e800d76..ee09ff6573 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c @@ -180,18 +180,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c index 9abb252e84..1447394fb3 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c @@ -184,18 +184,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c index fc43939153..2b462667d2 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c @@ -197,18 +197,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c index 08598dc0e6..91e6e1bdd4 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c @@ -194,18 +194,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c index cc37b0b2cf..ead01c073c 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c @@ -184,18 +184,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c index 6bc993d0ae..0431173177 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c @@ -183,18 +183,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c index b9d4694d4f..4aad95ff56 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c @@ -234,18 +234,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif diff --git a/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c index c162604caf..b7a75ec4dc 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c @@ -184,18 +184,4 @@ static inline uint16_t adc_read(analogin_t *obj) } } -uint16_t analogin_read_u16(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - // 12-bit to 16-bit conversion - value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); - return value; -} - -float analogin_read(analogin_t *obj) -{ - uint16_t value = adc_read(obj); - return (float)value * (1.0f / (float)0xFFF); // 12 bits range -} - #endif From 2bbedabf7db13c0f17af79e1ecd7f910cf4ebfe3 Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 15:41:59 +0100 Subject: [PATCH 12/14] STM32: add analogin_api.c file in STM folder --- targets/TARGET_STM/analogin_api.c | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 targets/TARGET_STM/analogin_api.c diff --git a/targets/TARGET_STM/analogin_api.c b/targets/TARGET_STM/analogin_api.c new file mode 100644 index 0000000000..370f0d7902 --- /dev/null +++ b/targets/TARGET_STM/analogin_api.c @@ -0,0 +1,46 @@ +/* mbed Microcontroller Library + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "analogin_api.h" + +#if DEVICE_ANALOGIN + +uint16_t analogin_read_u16(analogin_t *obj) +{ + uint16_t value = adc_read(obj); + // 12-bit to 16-bit conversion + value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); + return value; +} + +float analogin_read(analogin_t *obj) +{ + uint16_t value = adc_read(obj); + return (float)value * (1.0f / (float)0xFFF); // 12 bits range +} + +#endif From 1d3eb508bf28210eba855b1d8fb47c269ab00b8d Mon Sep 17 00:00:00 2001 From: bcostm Date: Tue, 14 Nov 2017 15:59:18 +0100 Subject: [PATCH 13/14] STM32: fix linker error with adc_read() --- targets/TARGET_STM/TARGET_STM32F0/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32F1/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32F2/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32F3/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32F4/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32F7/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32L0/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32L1/analogin_device.c | 2 +- targets/TARGET_STM/TARGET_STM32L4/analogin_device.c | 2 +- targets/TARGET_STM/analogin_api.c | 2 ++ 10 files changed, 11 insertions(+), 9 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c index 2c72796525..907256431f 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c @@ -95,7 +95,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c index ee09ff6573..dfc6379c4e 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c @@ -101,7 +101,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c index 1447394fb3..c014c2f572 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F2/analogin_device.c @@ -101,7 +101,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c index 2b462667d2..dfc0ea3be5 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c @@ -115,7 +115,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c index 91e6e1bdd4..54d266e4c1 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F4/analogin_device.c @@ -101,7 +101,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c index ead01c073c..6592383e19 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F7/analogin_device.c @@ -101,7 +101,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c index 0431173177..981da65895 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c @@ -100,7 +100,7 @@ void analogin_init(analogin_t *obj, PinName pin) __HAL_ADC_ENABLE(&obj->handle); } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c index 4aad95ff56..029044fa85 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c @@ -103,7 +103,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c index b7a75ec4dc..cf2da5df44 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c @@ -99,7 +99,7 @@ void analogin_init(analogin_t *obj, PinName pin) } } -static inline uint16_t adc_read(analogin_t *obj) +uint16_t adc_read(analogin_t *obj) { ADC_ChannelConfTypeDef sConfig = {0}; diff --git a/targets/TARGET_STM/analogin_api.c b/targets/TARGET_STM/analogin_api.c index 370f0d7902..bb16c62816 100644 --- a/targets/TARGET_STM/analogin_api.c +++ b/targets/TARGET_STM/analogin_api.c @@ -29,6 +29,8 @@ #if DEVICE_ANALOGIN +uint16_t adc_read(analogin_t *obj); + uint16_t analogin_read_u16(analogin_t *obj) { uint16_t value = adc_read(obj); From c54e9079b899f3ad97a4777b3e8f716dbfda190f Mon Sep 17 00:00:00 2001 From: bcostm Date: Fri, 17 Nov 2017 13:50:38 +0100 Subject: [PATCH 14/14] STM32 ADC: replace flags type from int to bool --- targets/TARGET_STM/TARGET_STM32F0/analogin_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32F1/analogin_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32F3/analogin_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32L0/analogin_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32L1/analogin_device.c | 7 ++++--- targets/TARGET_STM/TARGET_STM32L4/analogin_device.c | 7 ++++--- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c index 907256431f..f60f6bc02c 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/analogin_device.c @@ -35,10 +35,11 @@ #include "pinmap.h" #include "mbed_error.h" #include "PeripheralPins.h" +#include void analogin_init(analogin_t *obj, PinName pin) { - static int adc_calibrated = 0; + static bool adc_calibrated = false; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -89,8 +90,8 @@ void analogin_init(analogin_t *obj, PinName pin) } // ADC calibration is done only once - if (adc_calibrated == 0) { - adc_calibrated = 1; + if (!adc_calibrated) { + adc_calibrated = true; HAL_ADCEx_Calibration_Start(&obj->handle); } } diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c index dfc6379c4e..4dd0e6cdec 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_device.c @@ -35,10 +35,11 @@ #include "pinmap.h" #include "mbed_error.h" #include "PeripheralPins.h" +#include void analogin_init(analogin_t *obj, PinName pin) { - static int adc_calibrated = 0; + static bool adc_calibrated = false; RCC_PeriphCLKInitTypeDef PeriphClkInit; uint32_t function = (uint32_t)NC; @@ -85,8 +86,8 @@ void analogin_init(analogin_t *obj, PinName pin) } // This section is done only once - if (adc_calibrated == 0) { - adc_calibrated = 1; + if (!adc_calibrated) { + adc_calibrated = true; // Configure ADC clock prescaler // Caution: On STM32F1, ADC clock frequency max is 14 MHz (refer to device datasheet). // Therefore, ADC clock prescaler must be configured in function diff --git a/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c index dfc0ea3be5..ba4970e3a8 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/analogin_device.c @@ -35,10 +35,11 @@ #include "pinmap.h" #include "mbed_error.h" #include "PeripheralPins.h" +#include void analogin_init(analogin_t *obj, PinName pin) { - static int adc_calibrated = 0; + static bool adc_calibrated = false; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -109,8 +110,8 @@ void analogin_init(analogin_t *obj, PinName pin) } // ADC calibration is done only once - if (adc_calibrated == 0) { - adc_calibrated = 1; + if (!adc_calibrated) { + adc_calibrated = true; HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); } } diff --git a/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c index 981da65895..f1ac6a8764 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/analogin_device.c @@ -35,10 +35,11 @@ #include "pinmap.h" #include "mbed_error.h" #include "PeripheralPins.h" +#include void analogin_init(analogin_t *obj, PinName pin) { - static int adc_calibrated = 0; + static bool adc_calibrated = false; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -92,8 +93,8 @@ void analogin_init(analogin_t *obj, PinName pin) } // ADC calibration is done only once - if (adc_calibrated == 0) { - adc_calibrated = 1; + if (!adc_calibrated) { + adc_calibrated = true; HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); } diff --git a/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c index 029044fa85..dfef3a3eb0 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/analogin_device.c @@ -35,10 +35,11 @@ #include "pinmap.h" #include "mbed_error.h" #include "PeripheralPins.h" +#include void analogin_init(analogin_t *obj, PinName pin) { - static int adc_hsi_inited = 0; + static bool adc_hsi_inited = false; RCC_OscInitTypeDef RCC_OscInitStruct; uint32_t function = (uint32_t)NC; @@ -92,8 +93,8 @@ void analogin_init(analogin_t *obj, PinName pin) } // This section is done only once - if (adc_hsi_inited == 0) { - adc_hsi_inited = 1; + if (!adc_hsi_inited) { + adc_hsi_inited = true; // Enable the HSI (to clock the ADC) RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; diff --git a/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c index cf2da5df44..550589f311 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/analogin_device.c @@ -35,10 +35,11 @@ #include "pinmap.h" #include "mbed_error.h" #include "PeripheralPins.h" +#include void analogin_init(analogin_t *obj, PinName pin) { - static int adc_calibrated = 0; + static bool adc_calibrated = false; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) @@ -93,8 +94,8 @@ void analogin_init(analogin_t *obj, PinName pin) } // ADC calibration is done only once - if (adc_calibrated == 0) { - adc_calibrated = 1; + if (!adc_calibrated) { + adc_calibrated = true; HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED); } }