From 5a4dba22d9c3b56e12b103b44af85fbcd5d8733a Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Sun, 21 Mar 2021 22:31:45 +1300 Subject: [PATCH] Merge pull request #10612 from hydra/bf-h7adc2-fix --- src/main/drivers/adc.c | 13 +++++++++---- src/main/drivers/adc.h | 8 +++++--- src/main/drivers/adc_stm32h7xx.c | 14 ++++++++++++-- src/main/pg/adc.c | 10 ++++++++-- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/drivers/adc.c b/src/main/drivers/adc.c index 93978a17a3..39edbb5944 100644 --- a/src/main/drivers/adc.c +++ b/src/main/drivers/adc.c @@ -61,21 +61,26 @@ ADCDevice adcDeviceByInstance(ADC_TypeDef *instance) return ADCDEV_1; } -#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) +#if defined(ADC2) if (instance == ADC2) { return ADCDEV_2; } - +#endif +#if defined(ADC3) if (instance == ADC3) { return ADCDEV_3; } #endif - -#ifdef STM32F3 +#if defined(ADC4) if (instance == ADC4) { return ADCDEV_4; } #endif +#if defined(ADC5) + if (instance == ADC5) { + return ADCDEV_5; + } +#endif return ADCINVALID; } diff --git a/src/main/drivers/adc.h b/src/main/drivers/adc.h index 943026b9fa..15abf7fdb5 100644 --- a/src/main/drivers/adc.h +++ b/src/main/drivers/adc.h @@ -46,14 +46,16 @@ typedef enum ADCDevice { ADCINVALID = -1, ADCDEV_1 = 0, -#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) +#if defined(ADC2) ADCDEV_2, +#endif +#if defined(ADC3) ADCDEV_3, #endif -#if defined(STM32F3) || defined(STM32G4) +#if defined(ADC4) ADCDEV_4, #endif -#if defined(STM32G4) +#if defined(ADC5) ADCDEV_5, #endif ADCDEV_COUNT diff --git a/src/main/drivers/adc_stm32h7xx.c b/src/main/drivers/adc_stm32h7xx.c index 6e5c2cfc41..435004f0a7 100644 --- a/src/main/drivers/adc_stm32h7xx.c +++ b/src/main/drivers/adc_stm32h7xx.c @@ -79,7 +79,9 @@ const adcDevice_t adcHardware[ADCDEV_COUNT] = { .channel = DMA_REQUEST_ADC2, #endif }, - // ADC3 can be serviced by BDMA also, but we settle for DMA1 or 2 (for now). +#if defined(ADC3) + // ADC3 is not available on all H7 MCUs, e.g. H7A3 + // On H743 and H750, ADC3 can be serviced by BDMA also, but we settle for DMA1 or 2 (for now). { .ADCx = ADC3_INSTANCE, .rccADC = RCC_AHB4(ADC3), @@ -88,6 +90,7 @@ const adcDevice_t adcHardware[ADCDEV_COUNT] = { .channel = DMA_REQUEST_ADC3, #endif } +#endif // ADC3 }; adcDevice_t adcDevice[ADCDEV_COUNT]; @@ -102,11 +105,18 @@ const adcTagMap_t adcTagMap[] = { { DEFIO_TAG_E__NONE, ADC_DEVICES_3, ADC_CHANNEL_VREFINT, 18 }, { DEFIO_TAG_E__NONE, ADC_DEVICES_3, ADC_CHANNEL_TEMPSENSOR, 19 }, #endif - // Inputs available for all packages +#if defined(STM32H7A3xx) || defined(STM32H7A3xxQ) + // See DS13195 Rev 6 Page 51/52 + { DEFIO_TAG_E__PC0, ADC_DEVICES_12, ADC_CHANNEL_10, 10 }, + { DEFIO_TAG_E__PC1, ADC_DEVICES_12, ADC_CHANNEL_11, 11 }, + { DEFIO_TAG_E__PC2, ADC_DEVICES_12, ADC_CHANNEL_12, 0 }, + { DEFIO_TAG_E__PC3, ADC_DEVICES_12, ADC_CHANNEL_13, 1 }, +#else { DEFIO_TAG_E__PC0, ADC_DEVICES_123, ADC_CHANNEL_10, 10 }, { DEFIO_TAG_E__PC1, ADC_DEVICES_123, ADC_CHANNEL_11, 11 }, { DEFIO_TAG_E__PC2, ADC_DEVICES_3, ADC_CHANNEL_0, 0 }, { DEFIO_TAG_E__PC3, ADC_DEVICES_3, ADC_CHANNEL_1, 1 }, +#endif { DEFIO_TAG_E__PC4, ADC_DEVICES_12, ADC_CHANNEL_4, 4 }, { DEFIO_TAG_E__PC5, ADC_DEVICES_12, ADC_CHANNEL_8, 8 }, { DEFIO_TAG_E__PB0, ADC_DEVICES_12, ADC_CHANNEL_9, 9 }, diff --git a/src/main/pg/adc.c b/src/main/pg/adc.c index 1e4c05aada..01ab1e23e2 100644 --- a/src/main/pg/adc.c +++ b/src/main/pg/adc.c @@ -43,13 +43,19 @@ void pgResetFn_adcConfig(adcConfig_t *adcConfig) adcConfig->device = ADC_DEV_TO_CFG(adcDeviceByInstance(ADC_INSTANCE)); adcConfig->dmaopt[ADCDEV_1] = ADC1_DMA_OPT; -#ifndef STM32F1 +// These conditionals need to match the ones used in 'src/main/drivers/adc.h'. +#if defined(ADC2) adcConfig->dmaopt[ADCDEV_2] = ADC2_DMA_OPT; +#endif +#if defined(ADC3) adcConfig->dmaopt[ADCDEV_3] = ADC3_DMA_OPT; #endif -#ifdef STM32F3 +#if defined(ADC4) adcConfig->dmaopt[ADCDEV_4] = ADC4_DMA_OPT; #endif +#if defined(ADC5) + adcConfig->dmaopt[ADCDEV_5] = ADC5_DMA_OPT; +#endif #ifdef VBAT_ADC_PIN adcConfig->vbat.enabled = true;