diff --git a/src/drivers/adc_common.c b/src/drivers/adc_common.c index eb6e6a4e60..0d380b0113 100755 --- a/src/drivers/adc_common.c +++ b/src/drivers/adc_common.c @@ -10,25 +10,20 @@ adc_config_t adcConfig[ADC_CHANNEL_COUNT]; volatile uint16_t adcValues[ADC_CHANNEL_COUNT]; -uint8_t adcChannelCount = 0; extern int16_t debug[4]; uint16_t adcGetChannel(uint8_t channel) { -#if 0 - switch (adcChannelCount) { - case 3: - debug[2] = adcValues[adcConfig[2].dmaIndex]; - /* no break */ - case 2: - debug[1] = adcValues[adcConfig[1].dmaIndex]; - /* no break */ - case 1: - debug[0] = adcValues[adcConfig[0].dmaIndex]; - /* no break */ - default: - break; +#if 1 + if (adcConfig[0].enabled) { + debug[0] = adcValues[adcConfig[0].dmaIndex]; + } + if (adcConfig[1].enabled) { + debug[1] = adcValues[adcConfig[1].dmaIndex]; + } + if (adcConfig[2].enabled) { + debug[2] = adcValues[adcConfig[2].dmaIndex]; } #endif return adcValues[adcConfig[channel].dmaIndex]; diff --git a/src/drivers/adc_common.h b/src/drivers/adc_common.h index 2b4d2271f3..6219234ce4 100755 --- a/src/drivers/adc_common.h +++ b/src/drivers/adc_common.h @@ -12,6 +12,7 @@ typedef enum { typedef struct adc_config_t { uint8_t adcChannel; // ADC1_INxx channel number uint8_t dmaIndex; // index into DMA buffer in case of sparse channels + bool enabled; } adc_config_t; typedef struct drv_adc_config_t { diff --git a/src/drivers/adc_stm32f10x.c b/src/drivers/adc_stm32f10x.c index 1fefed5982..79d0ee2225 100644 --- a/src/drivers/adc_stm32f10x.c +++ b/src/drivers/adc_stm32f10x.c @@ -1,5 +1,6 @@ #include #include +#include #include "platform.h" #include "system_common.h" @@ -19,30 +20,31 @@ extern adc_config_t adcConfig[ADC_CHANNEL_COUNT]; extern volatile uint16_t adcValues[ADC_CHANNEL_COUNT]; -extern uint8_t adcChannelCount; - void adcInit(drv_adc_config_t *init) { ADC_InitTypeDef adc; DMA_InitTypeDef dma; uint8_t i; + uint8_t configuredAdcChannels = 0; + memset(&adcConfig, 0, sizeof(adcConfig)); + // configure always-present battery index (ADC4) adcConfig[ADC_BATTERY].adcChannel = ADC_Channel_4; - adcConfig[ADC_BATTERY].dmaIndex = adcChannelCount; - adcChannelCount++; + adcConfig[ADC_BATTERY].dmaIndex = configuredAdcChannels++; + adcConfig[ADC_BATTERY].enabled = true; // optional ADC5 input on rev.5 hardware if (hse_value == 12000000) { adcConfig[ADC_EXTERNAL1].adcChannel = ADC_Channel_5; - adcConfig[ADC_EXTERNAL1].dmaIndex = adcChannelCount; - adcChannelCount++; + adcConfig[ADC_EXTERNAL1].dmaIndex = configuredAdcChannels++; + adcConfig[ADC_EXTERNAL1].enabled = true; } // another channel can be stolen from PWM for current measurement or other things if (init->powerAdcChannel > 0) { - adcConfig[ADC_EXTERNAL2].adcChannel = init->powerAdcChannel; - adcConfig[ADC_EXTERNAL2].dmaIndex = adcChannelCount; - adcChannelCount++; + adcConfig[ADC_EXTERNAL2].adcChannel = ADC_Channel_1; // init->powerAdcChannel; + adcConfig[ADC_EXTERNAL2].dmaIndex = configuredAdcChannels++; + adcConfig[ADC_EXTERNAL2].enabled = true; } // ADC driver assumes all the GPIO was already placed in 'AIN' mode @@ -50,9 +52,9 @@ void adcInit(drv_adc_config_t *init) dma.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; dma.DMA_MemoryBaseAddr = (uint32_t)adcValues; dma.DMA_DIR = DMA_DIR_PeripheralSRC; - dma.DMA_BufferSize = adcChannelCount; + dma.DMA_BufferSize = configuredAdcChannels; dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - dma.DMA_MemoryInc = adcChannelCount > 1 ? DMA_MemoryInc_Enable : DMA_MemoryInc_Disable; + dma.DMA_MemoryInc = configuredAdcChannels > 1 ? DMA_MemoryInc_Enable : DMA_MemoryInc_Disable; dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; dma.DMA_Mode = DMA_Mode_Circular; @@ -62,15 +64,20 @@ void adcInit(drv_adc_config_t *init) DMA_Cmd(DMA1_Channel1, ENABLE); adc.ADC_Mode = ADC_Mode_Independent; - adc.ADC_ScanConvMode = adcChannelCount > 1 ? ENABLE : DISABLE; + adc.ADC_ScanConvMode = configuredAdcChannels > 1 ? ENABLE : DISABLE; adc.ADC_ContinuousConvMode = ENABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; - adc.ADC_NbrOfChannel = adcChannelCount; + adc.ADC_NbrOfChannel = configuredAdcChannels; ADC_Init(ADC1, &adc); - for (i = 0; i < adcChannelCount; i++) - ADC_RegularChannelConfig(ADC1, adcConfig[i].adcChannel, i + 1, ADC_SampleTime_28Cycles5); + uint8_t rank = 1; + for (i = 0; i < ADC_CHANNEL_COUNT; i++) { + if (!adcConfig[i].enabled) { + continue; + } + ADC_RegularChannelConfig(ADC1, adcConfig[i].adcChannel, rank++, ADC_SampleTime_28Cycles5); + } ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE);