From 62878bd2fabecbe6787eeff291a3e8155ab1142f Mon Sep 17 00:00:00 2001 From: jflyper Date: Thu, 18 Jun 2020 03:40:36 +0900 Subject: [PATCH] [G4][ADC] Batch call DeInit() for all used devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HAL_ADC_DeInit() initializes ADCx_COMMON registers, so it shouldn’t be called once device configuration starts. --- src/main/drivers/adc_stm32g4xx.c | 37 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/drivers/adc_stm32g4xx.c b/src/main/drivers/adc_stm32g4xx.c index f9a308fda5..6a12bdf94f 100644 --- a/src/main/drivers/adc_stm32g4xx.c +++ b/src/main/drivers/adc_stm32g4xx.c @@ -205,11 +205,7 @@ void adcInitDevice(adcDevice_t *adcdev, int channelCount) hadc->Instance = adcdev->ADCx; - if (HAL_ADC_DeInit(hadc) != HAL_OK) - { - // ADC de-initialization Error - handleError(); - } + // DeInit is done in adcInit(). hadc->Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; hadc->Init.Resolution = ADC_RESOLUTION_12B; @@ -231,19 +227,6 @@ void adcInitDevice(adcDevice_t *adcdev, int channelCount) handleError(); } - // Configure the ADC multi-mode - ADC_MultiModeTypeDef multimode = { 0 }; - multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(hadc, &multimode) != HAL_OK) { - handleError(); - } - - ADC_AnalogWDGConfTypeDef AnalogWDGConfig = { 0 }; - AnalogWDGConfig.Channel = ADC_CHANNEL_1; - if (HAL_ADC_AnalogWDGConfig(hadc, &AnalogWDGConfig) != HAL_OK) { - handleError(); - } - if (HAL_ADCEx_Calibration_Start(hadc, ADC_SINGLE_ENDED) != HAL_OK) { handleError(); } @@ -358,6 +341,24 @@ void adcInit(const adcConfig_t *config) } } + // DeInit ADCx with inputs + // We have to batch call DeInit() for all devices as DeInit() initializes ADCx_COMMON register. + + for (int dev = 0; dev < ADCDEV_COUNT; dev++) { + adcDevice_t *adc = &adcDevice[dev]; + + if (!(adc->ADCx && adc->channelBits)) { + continue; + } + + adc->ADCHandle.Instance = adc->ADCx; + + if (HAL_ADC_DeInit(&adc->ADCHandle) != HAL_OK) { + // ADC de-initialization Error + handleError(); + } + } + // Configure ADCx with inputs int dmaBufferIndex = 0;