From cc785a9505b66320b8e80d555135e9d212fc24b1 Mon Sep 17 00:00:00 2001 From: candas Date: Mon, 18 Sep 2023 23:52:28 +0200 Subject: [PATCH 01/12] Initialize each ADC only one in Analogread --- libraries/SrcWrapper/src/stm32/analog.cpp | 61 +++++++++++++++-------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 63ff690c47..7e215d1024 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -101,6 +101,20 @@ static PinName g_current_pin = NC; #define ADC_REGULAR_RANK_1 1 #endif +#if defined(ADC5) +#define ADC_COUNT 5 +#elif defined(ADC4) +#define ADC_COUNT 4 +#elif defined(ADC3) +#define ADC_COUNT 3 +#elif defined(ADC2) +#define ADC_COUNT 2 +#elif defined(ADC1) +#define ADC_COUNT 1 +#endif + +uint8_t adc_is_active[ADC_COUNT] = {0}; + /* Exported Functions */ /** * @brief Return ADC HAL channel linked to a PinName @@ -773,6 +787,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) uint32_t samplingTime = ADC_SAMPLINGTIME; uint32_t channel = 0; uint32_t bank = 0; + uint8_t adc_index = 0; if ((pin & PADC_BASE) && (pin < ANA_START)) { #if defined(STM32H7xx) || defined(STM32MP1xx) @@ -806,9 +821,23 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #endif } - if (AdcHandle.Instance == NP) { - return 0; - } + if (AdcHandle.Instance == NP) return 0; + else if(AdcHandle.Instance == ADC1) adc_index = 0; + #ifdef ADC2 + else if(AdcHandle.Instance == ADC2) adc_index = 1; + #endif + #ifdef ADC3 + else if(AdcHandle.Instance == ADC3) adc_index = 2; + #endif + #ifdef ADC4 + else if(AdcHandle.Instance == ADC4) adc_index = 3; + #endif + #ifdef ADC5 + else if(AdcHandle.Instance == ADC5) adc_index = 4; + #endif + + if(!adc_is_active[adc_index]){ + adc_is_active[adc_index] = true; #ifdef ADC_CLOCK_DIV AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */ @@ -975,12 +1004,6 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */ #endif - /*##-2- Configure ADC regular channel ######################################*/ - if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) { - /* Channel Configuration Error */ - return 0; - } - #if defined(ADC_CR_ADCAL) || defined(ADC_CR2_RSTCAL) /*##-2.1- Calibrate ADC then Start the conversion process ####################*/ #if defined(ADC_CALIB_OFFSET) @@ -995,6 +1018,14 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) return 0; } #endif + + } // Initialize ADC only once + + /*##-2- Configure ADC regular channel ######################################*/ + if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) { + /* Channel Configuration Error */ + return 0; + } /*##-3- Start the conversion process ####################*/ if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { @@ -1017,18 +1048,6 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle); } - if (HAL_ADC_Stop(&AdcHandle) != HAL_OK) { - /* Stop Conversation Error */ - return 0; - } - - if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { - return 0; - } - - if (__LL_ADC_COMMON_INSTANCE(AdcHandle.Instance) != 0U) { - LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(AdcHandle.Instance), LL_ADC_PATH_INTERNAL_NONE); - } return uhADCxConvertedValue; } #endif /* HAL_ADC_MODULE_ENABLED && !HAL_ADC_MODULE_ONLY*/ From df887ebf43aec7dccb301d2e3c50470994719e39 Mon Sep 17 00:00:00 2001 From: candas Date: Tue, 19 Sep 2023 11:24:58 +0200 Subject: [PATCH 02/12] Fix style issues --- libraries/SrcWrapper/src/stm32/analog.cpp | 209 ++++++++++++---------- 1 file changed, 110 insertions(+), 99 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 7e215d1024..16f5500c4f 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -821,204 +821,215 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #endif } - if (AdcHandle.Instance == NP) return 0; - else if(AdcHandle.Instance == ADC1) adc_index = 0; - #ifdef ADC2 - else if(AdcHandle.Instance == ADC2) adc_index = 1; - #endif - #ifdef ADC3 - else if(AdcHandle.Instance == ADC3) adc_index = 2; - #endif - #ifdef ADC4 - else if(AdcHandle.Instance == ADC4) adc_index = 3; - #endif - #ifdef ADC5 - else if(AdcHandle.Instance == ADC5) adc_index = 4; - #endif + if (AdcHandle.Instance == NP) { + return 0; + } else if (AdcHandle.Instance == ADC1) { + adc_index = 0; + } +#ifdef ADC2 + else if (AdcHandle.Instance == ADC2) { + adc_index = 1; + } +#endif +#ifdef ADC3 + else if (AdcHandle.Instance == ADC3) { + adc_index = 2; + } +#endif +#ifdef ADC4 + else if (AdcHandle.Instance == ADC4) { + adc_index = 3; + } +#endif +#ifdef ADC5 + else if (AdcHandle.Instance == ADC5) { + adc_index = 4; + } +#endif - if(!adc_is_active[adc_index]){ + if (!adc_is_active[adc_index]) { adc_is_active[adc_index] = true; #ifdef ADC_CLOCK_DIV - AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */ + AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */ #endif #ifdef ADC_RESOLUTION_12B - switch (resolution) { + switch (resolution) { #ifdef ADC_RESOLUTION_6B - case 6: - AdcHandle.Init.Resolution = ADC_RESOLUTION_6B; /* resolution for converted data */ - break; -#endif - case 8: - AdcHandle.Init.Resolution = ADC_RESOLUTION_8B; /* resolution for converted data */ - break; - case 10: - AdcHandle.Init.Resolution = ADC_RESOLUTION_10B; /* resolution for converted data */ - break; - case 12: - default: - AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* resolution for converted data */ - break; + case 6: + AdcHandle.Init.Resolution = ADC_RESOLUTION_6B; /* resolution for converted data */ + break; +#endif + case 8: + AdcHandle.Init.Resolution = ADC_RESOLUTION_8B; /* resolution for converted data */ + break; + case 10: + AdcHandle.Init.Resolution = ADC_RESOLUTION_10B; /* resolution for converted data */ + break; + case 12: + default: + AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* resolution for converted data */ + break; #ifdef ADC_RESOLUTION_14B - case 14: - AdcHandle.Init.Resolution = ADC_RESOLUTION_14B; /* resolution for converted data */ - break; + case 14: + AdcHandle.Init.Resolution = ADC_RESOLUTION_14B; /* resolution for converted data */ + break; #endif #ifdef ADC_RESOLUTION_16B - case 16: - AdcHandle.Init.Resolution = ADC_RESOLUTION_16B; /* resolution for converted data */ - break; + case 16: + AdcHandle.Init.Resolution = ADC_RESOLUTION_16B; /* resolution for converted data */ + break; #endif - } + } #else - UNUSED(resolution); + UNUSED(resolution); #endif #ifdef ADC_DATAALIGN_RIGHT - AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ + AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ #endif #ifdef ADC_SCAN_SEQ_FIXED - AdcHandle.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandle.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ #else - AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ #endif #ifdef ADC_EOC_SINGLE_CONV - AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */ + AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */ #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F4xx) && \ !defined(STM32F7xx) && !defined(ADC1_V2_5) - AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */ + AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */ #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F3xx) && \ !defined(STM32F4xx) && !defined(STM32F7xx) && !defined(STM32G4xx) && \ !defined(STM32H5xx) && !defined(STM32H7xx) && !defined(STM32L4xx) && \ !defined(STM32L5xx) && !defined(STM32MP1xx) && !defined(STM32WBxx) || \ defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ + AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ #endif #ifdef ADC_CHANNELS_BANK_B - AdcHandle.Init.ChannelsBank = bank; + AdcHandle.Init.ChannelsBank = bank; #elif defined(ADC_CHANNELS_BANK_A) - AdcHandle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; + AdcHandle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; #endif - AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ + AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ #if !defined(STM32F0xx) && !defined(STM32L0xx) - AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */ + AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */ #endif - AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ + AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ #if !defined(STM32C0xx) && !defined(STM32F0xx) && !defined(STM32G0xx) && \ !defined(STM32L0xx) && !defined(STM32WLxx) && !defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ + AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ #endif - AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */ + AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */ #if !defined(STM32F1xx) && !defined(ADC1_V2_5) - AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */ + AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */ #endif #if !defined(STM32F1xx) && !defined(STM32H7xx) && !defined(STM32MP1xx) && \ !defined(ADC1_V2_5) - AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */ + AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */ #endif #ifdef ADC_CONVERSIONDATA_DR - AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; /* Regular Conversion data stored in DR register only */ + AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; /* Regular Conversion data stored in DR register only */ #endif #ifdef ADC_OVR_DATA_OVERWRITTEN - AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */ + AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */ #endif #ifdef ADC_LEFTBITSHIFT_NONE - AdcHandle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; /* No bit shift left applied on the final ADC conversion data */ + AdcHandle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; /* No bit shift left applied on the final ADC conversion data */ #endif #if defined(STM32F0xx) - AdcHandle.Init.SamplingTimeCommon = samplingTime; + AdcHandle.Init.SamplingTimeCommon = samplingTime; #endif #if defined(STM32C0xx) || defined(STM32G0xx) || defined(STM32U5xx) || \ defined(STM32WLxx) || defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.SamplingTimeCommon1 = samplingTime; /* Set sampling time common to a group of channels. */ - AdcHandle.Init.SamplingTimeCommon2 = samplingTime; /* Set sampling time common to a group of channels, second common setting possible.*/ + AdcHandle.Init.SamplingTimeCommon1 = samplingTime; /* Set sampling time common to a group of channels. */ + AdcHandle.Init.SamplingTimeCommon2 = samplingTime; /* Set sampling time common to a group of channels, second common setting possible.*/ #endif #if defined(STM32L0xx) - AdcHandle.Init.LowPowerFrequencyMode = DISABLE; /* To be enabled only if ADC clock < 2.8 MHz */ - AdcHandle.Init.SamplingTime = samplingTime; + AdcHandle.Init.LowPowerFrequencyMode = DISABLE; /* To be enabled only if ADC clock < 2.8 MHz */ + AdcHandle.Init.SamplingTime = samplingTime; #endif #if !defined(STM32F0xx) && !defined(STM32F1xx) && !defined(STM32F2xx) && \ !defined(STM32F3xx) && !defined(STM32F4xx) && !defined(STM32F7xx) && \ !defined(STM32L1xx) && !defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.OversamplingMode = DISABLE; - /* AdcHandle.Init.Oversample ignore for STM32L0xx as oversampling disabled */ - /* AdcHandle.Init.Oversampling ignored for other as oversampling disabled */ + AdcHandle.Init.OversamplingMode = DISABLE; + /* AdcHandle.Init.Oversample ignore for STM32L0xx as oversampling disabled */ + /* AdcHandle.Init.Oversampling ignored for other as oversampling disabled */ #endif #if defined(ADC_CFGR_DFSDMCFG) && defined(DFSDM1_Channel0) - AdcHandle.Init.DFSDMConfig = ADC_DFSDM_MODE_DISABLE; /* ADC conversions are not transferred by DFSDM. */ + AdcHandle.Init.DFSDMConfig = ADC_DFSDM_MODE_DISABLE; /* ADC conversions are not transferred by DFSDM. */ #endif #ifdef ADC_TRIGGER_FREQ_HIGH - AdcHandle.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; + AdcHandle.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; #endif #ifdef ADC_VREF_PPROT_NONE - AdcHandle.Init.VrefProtection = ADC_VREF_PPROT_NONE; + AdcHandle.Init.VrefProtection = ADC_VREF_PPROT_NONE; #endif - AdcHandle.State = HAL_ADC_STATE_RESET; - AdcHandle.DMA_Handle = NULL; - AdcHandle.Lock = HAL_UNLOCKED; - /* Some other ADC_HandleTypeDef fields exists but not required */ + AdcHandle.State = HAL_ADC_STATE_RESET; + AdcHandle.DMA_Handle = NULL; + AdcHandle.Lock = HAL_UNLOCKED; + /* Some other ADC_HandleTypeDef fields exists but not required */ - g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/ + g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/ - if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { - return 0; - } + if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { + return 0; + } - AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ + AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ #if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ defined(STM32L5xx) || defined(STM32WBxx) - if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { + if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { #else - if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { + if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { #endif - return 0; - } + return 0; + } #if defined(ADC_SCAN_SEQ_FIXED) && defined(ADC_RANK_CHANNEL_NUMBER) - AdcChannelConf.Rank = ADC_RANK_CHANNEL_NUMBER; /* Enable the rank of the selected channels when not fully configurable */ + AdcChannelConf.Rank = ADC_RANK_CHANNEL_NUMBER; /* Enable the rank of the selected channels when not fully configurable */ #else - AdcChannelConf.Rank = ADC_REGULAR_RANK_1; /* Specifies the rank in the regular group sequencer */ + AdcChannelConf.Rank = ADC_REGULAR_RANK_1; /* Specifies the rank in the regular group sequencer */ #endif #if !defined(STM32L0xx) #if !defined(STM32G0xx) - AdcChannelConf.SamplingTime = samplingTime; /* Sampling time value to be set for the selected channel */ + AdcChannelConf.SamplingTime = samplingTime; /* Sampling time value to be set for the selected channel */ #else - AdcChannelConf.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; /* Sampling time value to be set for the selected channel */ + AdcChannelConf.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; /* Sampling time value to be set for the selected channel */ #endif #endif #if defined(ADC_DIFFERENTIAL_ENDED) && !defined(ADC1_V2_5) - AdcChannelConf.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */ - AdcChannelConf.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */ + AdcChannelConf.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */ + AdcChannelConf.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */ #endif #if !defined(STM32C0xx) && !defined(STM32F0xx) && !defined(STM32F1xx) && \ !defined(STM32F2xx) && !defined(STM32G0xx) && !defined(STM32L0xx) && \ !defined(STM32L1xx) && !defined(STM32WBxx) && !defined(STM32WLxx) && \ !defined(ADC1_V2_5) - AdcChannelConf.Offset = 0; /* Parameter discarded because offset correction is disabled */ + AdcChannelConf.Offset = 0; /* Parameter discarded because offset correction is disabled */ #endif #if defined (STM32H7xx) || defined(STM32MP1xx) - AdcChannelConf.OffsetRightShift = DISABLE; /* No Right Offset Shift */ - AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */ + AdcChannelConf.OffsetRightShift = DISABLE; /* No Right Offset Shift */ + AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */ #endif #if defined(ADC_CR_ADCAL) || defined(ADC_CR2_RSTCAL) - /*##-2.1- Calibrate ADC then Start the conversion process ####################*/ + /*##-2.1- Calibrate ADC then Start the conversion process ####################*/ #if defined(ADC_CALIB_OFFSET) - if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK) + if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK) #elif defined(ADC_SINGLE_ENDED) && !defined(ADC1_V2_5) - if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK) + if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK) #else - if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK) + if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK) #endif - { - /* ADC Calibration Error */ - return 0; - } + { + /* ADC Calibration Error */ + return 0; + } #endif - + } // Initialize ADC only once /*##-2- Configure ADC regular channel ######################################*/ From bb93fa7512cfddbfeee3f729a3e4f1cd60d78ab8 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sat, 17 Feb 2024 21:56:45 +0100 Subject: [PATCH 03/12] Update analog.cpp Use LL functions instead Signed-off-by: Candas1 --- libraries/SrcWrapper/src/stm32/analog.cpp | 215 +++++++++------------- 1 file changed, 92 insertions(+), 123 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 16f5500c4f..57b2926446 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -101,20 +101,6 @@ static PinName g_current_pin = NC; #define ADC_REGULAR_RANK_1 1 #endif -#if defined(ADC5) -#define ADC_COUNT 5 -#elif defined(ADC4) -#define ADC_COUNT 4 -#elif defined(ADC3) -#define ADC_COUNT 3 -#elif defined(ADC2) -#define ADC_COUNT 2 -#elif defined(ADC1) -#define ADC_COUNT 1 -#endif - -uint8_t adc_is_active[ADC_COUNT] = {0}; - /* Exported Functions */ /** * @brief Return ADC HAL channel linked to a PinName @@ -787,7 +773,6 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) uint32_t samplingTime = ADC_SAMPLINGTIME; uint32_t channel = 0; uint32_t bank = 0; - uint8_t adc_index = 0; if ((pin & PADC_BASE) && (pin < ANA_START)) { #if defined(STM32H7xx) || defined(STM32MP1xx) @@ -823,150 +808,125 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) if (AdcHandle.Instance == NP) { return 0; - } else if (AdcHandle.Instance == ADC1) { - adc_index = 0; - } -#ifdef ADC2 - else if (AdcHandle.Instance == ADC2) { - adc_index = 1; - } -#endif -#ifdef ADC3 - else if (AdcHandle.Instance == ADC3) { - adc_index = 2; - } -#endif -#ifdef ADC4 - else if (AdcHandle.Instance == ADC4) { - adc_index = 3; - } -#endif -#ifdef ADC5 - else if (AdcHandle.Instance == ADC5) { - adc_index = 4; } -#endif - - if (!adc_is_active[adc_index]) { - adc_is_active[adc_index] = true; #ifdef ADC_CLOCK_DIV - AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */ + AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */ #endif #ifdef ADC_RESOLUTION_12B - switch (resolution) { + switch (resolution) { #ifdef ADC_RESOLUTION_6B - case 6: - AdcHandle.Init.Resolution = ADC_RESOLUTION_6B; /* resolution for converted data */ - break; -#endif - case 8: - AdcHandle.Init.Resolution = ADC_RESOLUTION_8B; /* resolution for converted data */ - break; - case 10: - AdcHandle.Init.Resolution = ADC_RESOLUTION_10B; /* resolution for converted data */ - break; - case 12: - default: - AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* resolution for converted data */ - break; + case 6: + AdcHandle.Init.Resolution = ADC_RESOLUTION_6B; /* resolution for converted data */ + break; +#endif + case 8: + AdcHandle.Init.Resolution = ADC_RESOLUTION_8B; /* resolution for converted data */ + break; + case 10: + AdcHandle.Init.Resolution = ADC_RESOLUTION_10B; /* resolution for converted data */ + break; + case 12: + default: + AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* resolution for converted data */ + break; #ifdef ADC_RESOLUTION_14B - case 14: - AdcHandle.Init.Resolution = ADC_RESOLUTION_14B; /* resolution for converted data */ - break; + case 14: + AdcHandle.Init.Resolution = ADC_RESOLUTION_14B; /* resolution for converted data */ + break; #endif #ifdef ADC_RESOLUTION_16B - case 16: - AdcHandle.Init.Resolution = ADC_RESOLUTION_16B; /* resolution for converted data */ - break; + case 16: + AdcHandle.Init.Resolution = ADC_RESOLUTION_16B; /* resolution for converted data */ + break; #endif - } + } #else - UNUSED(resolution); + UNUSED(resolution); #endif #ifdef ADC_DATAALIGN_RIGHT - AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ + AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ #endif #ifdef ADC_SCAN_SEQ_FIXED - AdcHandle.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandle.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ #else - AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ #endif #ifdef ADC_EOC_SINGLE_CONV - AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */ + AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */ #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F4xx) && \ !defined(STM32F7xx) && !defined(ADC1_V2_5) - AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */ + AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */ #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F3xx) && \ !defined(STM32F4xx) && !defined(STM32F7xx) && !defined(STM32G4xx) && \ - !defined(STM32H5xx) && !defined(STM32H7xx) && !defined(STM32L4xx) && \ - !defined(STM32L5xx) && !defined(STM32MP1xx) && !defined(STM32WBxx) || \ - defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ + !defined(STM32H7xx) && !defined(STM32L4xx) && !defined(STM32L5xx) && \ + !defined(STM32MP1xx) && !defined(STM32WBxx) || defined(ADC_SUPPORT_2_5_MSPS) + AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ #endif #ifdef ADC_CHANNELS_BANK_B - AdcHandle.Init.ChannelsBank = bank; + AdcHandle.Init.ChannelsBank = bank; #elif defined(ADC_CHANNELS_BANK_A) - AdcHandle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; + AdcHandle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; #endif - AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ + AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ #if !defined(STM32F0xx) && !defined(STM32L0xx) - AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */ + AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */ #endif - AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ + AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ #if !defined(STM32C0xx) && !defined(STM32F0xx) && !defined(STM32G0xx) && \ !defined(STM32L0xx) && !defined(STM32WLxx) && !defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ + AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ #endif - AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */ + AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */ #if !defined(STM32F1xx) && !defined(ADC1_V2_5) - AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */ + AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */ #endif #if !defined(STM32F1xx) && !defined(STM32H7xx) && !defined(STM32MP1xx) && \ !defined(ADC1_V2_5) - AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */ + AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */ #endif #ifdef ADC_CONVERSIONDATA_DR - AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; /* Regular Conversion data stored in DR register only */ + AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; /* Regular Conversion data stored in DR register only */ #endif #ifdef ADC_OVR_DATA_OVERWRITTEN - AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */ + AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */ #endif #ifdef ADC_LEFTBITSHIFT_NONE - AdcHandle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; /* No bit shift left applied on the final ADC conversion data */ + AdcHandle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; /* No bit shift left applied on the final ADC conversion data */ #endif #if defined(STM32F0xx) - AdcHandle.Init.SamplingTimeCommon = samplingTime; + AdcHandle.Init.SamplingTimeCommon = samplingTime; #endif #if defined(STM32C0xx) || defined(STM32G0xx) || defined(STM32U5xx) || \ defined(STM32WLxx) || defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.SamplingTimeCommon1 = samplingTime; /* Set sampling time common to a group of channels. */ - AdcHandle.Init.SamplingTimeCommon2 = samplingTime; /* Set sampling time common to a group of channels, second common setting possible.*/ + AdcHandle.Init.SamplingTimeCommon1 = samplingTime; /* Set sampling time common to a group of channels. */ + AdcHandle.Init.SamplingTimeCommon2 = samplingTime; /* Set sampling time common to a group of channels, second common setting possible.*/ #endif #if defined(STM32L0xx) - AdcHandle.Init.LowPowerFrequencyMode = DISABLE; /* To be enabled only if ADC clock < 2.8 MHz */ - AdcHandle.Init.SamplingTime = samplingTime; + AdcHandle.Init.LowPowerFrequencyMode = DISABLE; /* To be enabled only if ADC clock < 2.8 MHz */ + AdcHandle.Init.SamplingTime = samplingTime; #endif #if !defined(STM32F0xx) && !defined(STM32F1xx) && !defined(STM32F2xx) && \ !defined(STM32F3xx) && !defined(STM32F4xx) && !defined(STM32F7xx) && \ !defined(STM32L1xx) && !defined(ADC_SUPPORT_2_5_MSPS) - AdcHandle.Init.OversamplingMode = DISABLE; - /* AdcHandle.Init.Oversample ignore for STM32L0xx as oversampling disabled */ - /* AdcHandle.Init.Oversampling ignored for other as oversampling disabled */ + AdcHandle.Init.OversamplingMode = DISABLE; + /* AdcHandle.Init.Oversample ignore for STM32L0xx as oversampling disabled */ + /* AdcHandle.Init.Oversampling ignored for other as oversampling disabled */ #endif #if defined(ADC_CFGR_DFSDMCFG) && defined(DFSDM1_Channel0) - AdcHandle.Init.DFSDMConfig = ADC_DFSDM_MODE_DISABLE; /* ADC conversions are not transferred by DFSDM. */ + AdcHandle.Init.DFSDMConfig = ADC_DFSDM_MODE_DISABLE; /* ADC conversions are not transferred by DFSDM. */ #endif #ifdef ADC_TRIGGER_FREQ_HIGH - AdcHandle.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; + AdcHandle.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; #endif #ifdef ADC_VREF_PPROT_NONE - AdcHandle.Init.VrefProtection = ADC_VREF_PPROT_NONE; + AdcHandle.Init.VrefProtection = ADC_VREF_PPROT_NONE; #endif + if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { AdcHandle.State = HAL_ADC_STATE_RESET; AdcHandle.DMA_Handle = NULL; AdcHandle.Lock = HAL_UNLOCKED; @@ -977,44 +937,52 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { return 0; } + } - AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ + AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ -#if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ - defined(STM32L5xx) || defined(STM32WBxx) - if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { +#if defined(STM32G4xx) || defined(STM32L4xx) || defined(STM32L5xx) || \ + defined(STM32WBxx) + if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { #else - if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { + if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { #endif - return 0; - } + return 0; + } #if defined(ADC_SCAN_SEQ_FIXED) && defined(ADC_RANK_CHANNEL_NUMBER) - AdcChannelConf.Rank = ADC_RANK_CHANNEL_NUMBER; /* Enable the rank of the selected channels when not fully configurable */ + AdcChannelConf.Rank = ADC_RANK_CHANNEL_NUMBER; /* Enable the rank of the selected channels when not fully configurable */ #else - AdcChannelConf.Rank = ADC_REGULAR_RANK_1; /* Specifies the rank in the regular group sequencer */ + AdcChannelConf.Rank = ADC_REGULAR_RANK_1; /* Specifies the rank in the regular group sequencer */ #endif #if !defined(STM32L0xx) #if !defined(STM32G0xx) - AdcChannelConf.SamplingTime = samplingTime; /* Sampling time value to be set for the selected channel */ + AdcChannelConf.SamplingTime = samplingTime; /* Sampling time value to be set for the selected channel */ #else - AdcChannelConf.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; /* Sampling time value to be set for the selected channel */ + AdcChannelConf.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; /* Sampling time value to be set for the selected channel */ #endif #endif #if defined(ADC_DIFFERENTIAL_ENDED) && !defined(ADC1_V2_5) - AdcChannelConf.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */ - AdcChannelConf.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */ + AdcChannelConf.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */ + AdcChannelConf.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */ #endif #if !defined(STM32C0xx) && !defined(STM32F0xx) && !defined(STM32F1xx) && \ !defined(STM32F2xx) && !defined(STM32G0xx) && !defined(STM32L0xx) && \ !defined(STM32L1xx) && !defined(STM32WBxx) && !defined(STM32WLxx) && \ !defined(ADC1_V2_5) - AdcChannelConf.Offset = 0; /* Parameter discarded because offset correction is disabled */ + AdcChannelConf.Offset = 0; /* Parameter discarded because offset correction is disabled */ #endif #if defined (STM32H7xx) || defined(STM32MP1xx) - AdcChannelConf.OffsetRightShift = DISABLE; /* No Right Offset Shift */ - AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */ + AdcChannelConf.OffsetRightShift = DISABLE; /* No Right Offset Shift */ + AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */ #endif + /*##-2- Configure ADC regular channel ######################################*/ + if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) { + /* Channel Configuration Error */ + return 0; + } + + if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { #if defined(ADC_CR_ADCAL) || defined(ADC_CR2_RSTCAL) /*##-2.1- Calibrate ADC then Start the conversion process ####################*/ #if defined(ADC_CALIB_OFFSET) @@ -1029,19 +997,20 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) return 0; } #endif - - } // Initialize ADC only once - - /*##-2- Configure ADC regular channel ######################################*/ - if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) { - /* Channel Configuration Error */ - return 0; } - /*##-3- Start the conversion process ####################*/ - if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { - /* Start Conversion Error */ - return 0; + if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { + /*##-3- Start the conversion process ####################*/ + if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { + /* Start Conversion Error */ + return 0; + } + } else { +#if defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F3xx) || defined(STM32F4xx) + LL_ADC_REG_StartConversionSWstart(AdcHandle.Instance); +#else + LL_ADC_REG_StartConversion(AdcHandle.Instance); +#endif } /*##-4- Wait for the end of conversion #####################################*/ From 0a274de9c58d02082e1a2ff7b5fd0c5ad41b2e00 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sat, 17 Feb 2024 22:31:35 +0100 Subject: [PATCH 04/12] Update analog.cpp modify for F1/F2/F4/F7/L1 Signed-off-by: Candas1 --- libraries/SrcWrapper/src/stm32/analog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 57b2926446..5c33134c90 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -1006,8 +1006,8 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) return 0; } } else { -#if defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F3xx) || defined(STM32F4xx) - LL_ADC_REG_StartConversionSWstart(AdcHandle.Instance); +#if defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F7xx) || defined(STM32L1xx) + LL_ADC_REG_StartConversionSWStart(AdcHandle.Instance); #else LL_ADC_REG_StartConversion(AdcHandle.Instance); #endif From 5571b254a6136bcbfd47d887390fe0c999126b79 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 00:47:10 +0100 Subject: [PATCH 05/12] Update analog.cpp Even after synching some changes were missing somehow Signed-off-by: Candas1 --- libraries/SrcWrapper/src/stm32/analog.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 5c33134c90..f6bf31df5b 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -861,8 +861,9 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F3xx) && \ !defined(STM32F4xx) && !defined(STM32F7xx) && !defined(STM32G4xx) && \ - !defined(STM32H7xx) && !defined(STM32L4xx) && !defined(STM32L5xx) && \ - !defined(STM32MP1xx) && !defined(STM32WBxx) || defined(ADC_SUPPORT_2_5_MSPS) + !defined(STM32H5xx) && !defined(STM32H7xx) && !defined(STM32L4xx) && \ + !defined(STM32L5xx) && !defined(STM32MP1xx) && !defined(STM32WBxx) || \ + defined(ADC_SUPPORT_2_5_MSPS) AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ #endif #ifdef ADC_CHANNELS_BANK_B @@ -941,8 +942,8 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ -#if defined(STM32G4xx) || defined(STM32L4xx) || defined(STM32L5xx) || \ - defined(STM32WBxx) +#if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ + defined(STM32L5xx) || defined(STM32WBxx) if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { #else if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { From 535b942efe300093faa74af45ab225681eab08c1 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 19:23:49 +0100 Subject: [PATCH 06/12] Update analog.cpp HAL_ADC_Start is ok afterall Signed-off-by: Candas1 --- libraries/SrcWrapper/src/stm32/analog.cpp | 25 ++++++++--------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index f6bf31df5b..f59aac0e76 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -861,9 +861,8 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F3xx) && \ !defined(STM32F4xx) && !defined(STM32F7xx) && !defined(STM32G4xx) && \ - !defined(STM32H5xx) && !defined(STM32H7xx) && !defined(STM32L4xx) && \ - !defined(STM32L5xx) && !defined(STM32MP1xx) && !defined(STM32WBxx) || \ - defined(ADC_SUPPORT_2_5_MSPS) + !defined(STM32H7xx) && !defined(STM32L4xx) && !defined(STM32L5xx) && \ + !defined(STM32MP1xx) && !defined(STM32WBxx) || defined(ADC_SUPPORT_2_5_MSPS) AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ #endif #ifdef ADC_CHANNELS_BANK_B @@ -942,8 +941,8 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ -#if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ - defined(STM32L5xx) || defined(STM32WBxx) +#if defined(STM32G4xx) || defined(STM32L4xx) || defined(STM32L5xx) || \ + defined(STM32WBxx) if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { #else if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { @@ -1000,18 +999,10 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #endif } - if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { - /*##-3- Start the conversion process ####################*/ - if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { - /* Start Conversion Error */ - return 0; - } - } else { -#if defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F7xx) || defined(STM32L1xx) - LL_ADC_REG_StartConversionSWStart(AdcHandle.Instance); -#else - LL_ADC_REG_StartConversion(AdcHandle.Instance); -#endif + /*##-3- Start the conversion process ####################*/ + if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { + /* Start Conversion Error */ + return 0; } /*##-4- Wait for the end of conversion #####################################*/ From 2108d325bcc1f68637d1e0fa972ba0bae9f4a30c Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 19:27:48 +0100 Subject: [PATCH 07/12] Update analog.cpp Signed-off-by: Candas1 --- libraries/SrcWrapper/src/stm32/analog.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index f59aac0e76..1ee96ce9c6 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -861,8 +861,9 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #endif #if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F3xx) && \ !defined(STM32F4xx) && !defined(STM32F7xx) && !defined(STM32G4xx) && \ - !defined(STM32H7xx) && !defined(STM32L4xx) && !defined(STM32L5xx) && \ - !defined(STM32MP1xx) && !defined(STM32WBxx) || defined(ADC_SUPPORT_2_5_MSPS) + !defined(STM32H5xx) && !defined(STM32H7xx) && !defined(STM32L4xx) && \ + !defined(STM32L5xx) && !defined(STM32MP1xx) && !defined(STM32WBxx) || \ + defined(ADC_SUPPORT_2_5_MSPS) AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ #endif #ifdef ADC_CHANNELS_BANK_B From 065c9b31b21b9879e7407fab7b03b33e390f30c9 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 19:28:58 +0100 Subject: [PATCH 08/12] Update analog.cpp Signed-off-by: Candas1 --- libraries/SrcWrapper/src/stm32/analog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 1ee96ce9c6..c4897aaf39 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -942,8 +942,8 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ -#if defined(STM32G4xx) || defined(STM32L4xx) || defined(STM32L5xx) || \ - defined(STM32WBxx) +#if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ + defined(STM32L5xx) || defined(STM32WBxx) if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) { #else if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) { From 575ede584fcdf1f7c0d3f9a231dd475eddf55001 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 23:01:12 +0100 Subject: [PATCH 09/12] Fix --- libraries/SrcWrapper/src/stm32/analog.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index c4897aaf39..e72062cecf 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -929,17 +929,21 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { AdcHandle.State = HAL_ADC_STATE_RESET; - AdcHandle.DMA_Handle = NULL; - AdcHandle.Lock = HAL_UNLOCKED; - /* Some other ADC_HandleTypeDef fields exists but not required */ + } else { + AdcHandle.State = HAL_ADC_STATE_READY; + } + + AdcHandle.DMA_Handle = NULL; + AdcHandle.Lock = HAL_UNLOCKED; + /* Some other ADC_HandleTypeDef fields exists but not required */ - g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/ + g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/ - if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { - return 0; - } + if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { + return 0; } + AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ #if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ From aba0a082c748b144bd4e3ed97005c47dd6ade710 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 23:09:02 +0100 Subject: [PATCH 10/12] Enable scan mode --- libraries/SrcWrapper/src/stm32/analog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index e72062cecf..636bd5e625 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -850,7 +850,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) #ifdef ADC_SCAN_SEQ_FIXED AdcHandle.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ #else - AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandle.Init.ScanConvMode = ENABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ #endif #ifdef ADC_EOC_SINGLE_CONV AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */ @@ -932,7 +932,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) } else { AdcHandle.State = HAL_ADC_STATE_READY; } - + AdcHandle.DMA_Handle = NULL; AdcHandle.Lock = HAL_UNLOCKED; /* Some other ADC_HandleTypeDef fields exists but not required */ From 284bf264b273959a8269e01e57469cc890676180 Mon Sep 17 00:00:00 2001 From: Candas1 Date: Sun, 18 Feb 2024 23:10:56 +0100 Subject: [PATCH 11/12] space --- libraries/SrcWrapper/src/stm32/analog.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 636bd5e625..2e2a8352f8 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -943,7 +943,6 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) return 0; } - AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ #if defined(STM32G4xx) || defined(STM32H5xx) || defined(STM32L4xx) || \ From 2fb1b323b5ee11ce63bb20fa035a232e1836f7fe Mon Sep 17 00:00:00 2001 From: Candas1 Date: Mon, 19 Feb 2024 13:15:59 +0100 Subject: [PATCH 12/12] Set the pin each time --- libraries/SrcWrapper/src/stm32/analog.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/libraries/SrcWrapper/src/stm32/analog.cpp b/libraries/SrcWrapper/src/stm32/analog.cpp index 2e2a8352f8..e1703ea4e1 100644 --- a/libraries/SrcWrapper/src/stm32/analog.cpp +++ b/libraries/SrcWrapper/src/stm32/analog.cpp @@ -927,18 +927,22 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution) AdcHandle.Init.VrefProtection = ADC_VREF_PPROT_NONE; #endif - if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { - AdcHandle.State = HAL_ADC_STATE_RESET; - } else { - AdcHandle.State = HAL_ADC_STATE_READY; - } - AdcHandle.DMA_Handle = NULL; AdcHandle.Lock = HAL_UNLOCKED; /* Some other ADC_HandleTypeDef fields exists but not required */ g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/ + if (!LL_ADC_IsEnabled(AdcHandle.Instance)) { + AdcHandle.State = HAL_ADC_STATE_RESET; + } else { + AdcHandle.State = HAL_ADC_STATE_READY; + /* Configure ADC GPIO pin */ + if (!(g_current_pin & PADC_BASE)) { + pinmap_pinout(g_current_pin, PinMap_ADC); + } + } + if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { return 0; }