From cc785a9505b66320b8e80d555135e9d212fc24b1 Mon Sep 17 00:00:00 2001
From: candas <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
Date: Sat, 17 Feb 2024 21:56:45 +0100
Subject: [PATCH 03/12] Update analog.cpp

Use LL functions instead

Signed-off-by: Candas1 <candascraig@hotmail.com>
---
 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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
---
 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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
---
 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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
---
 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 <candascraig@hotmail.com>
Date: Sun, 18 Feb 2024 19:27:48 +0100
Subject: [PATCH 07/12] Update analog.cpp

Signed-off-by: Candas1 <candascraig@hotmail.com>
---
 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 <candascraig@hotmail.com>
Date: Sun, 18 Feb 2024 19:28:58 +0100
Subject: [PATCH 08/12] Update analog.cpp

Signed-off-by: Candas1 <candascraig@hotmail.com>
---
 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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
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 <candascraig@hotmail.com>
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;
   }