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; } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy