From fdb81ed3b96df93844d97fdb3970cff8c27262f7 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Wed, 4 Feb 2015 21:48:14 +0000 Subject: [PATCH] SPRACINGF3 - Enable ADC for VBAT, Current and RSSI. --- src/main/drivers/adc_stm32f30x.c | 42 +++++++++++++---------- src/main/target/CHEBUZZF3/target.h | 4 +++ src/main/target/SPRACINGF3/target.h | 22 ++++++++++++ src/main/target/STM32F3DISCOVERY/target.h | 4 +++ 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/src/main/drivers/adc_stm32f30x.c b/src/main/drivers/adc_stm32f30x.c index ecaa1c0003..c18b37417b 100644 --- a/src/main/drivers/adc_stm32f30x.c +++ b/src/main/drivers/adc_stm32f30x.c @@ -32,6 +32,12 @@ extern adc_config_t adcConfig[ADC_CHANNEL_COUNT]; extern volatile uint16_t adcValues[ADC_CHANNEL_COUNT]; +#ifndef ADC_INSTANCE +#define ADC_INSTANCE ADC1 +#define ADC_AHB_PERIPHERAL RCC_AHBPeriph_DMA1 +#define ADC_DMA_CHANNEL DMA1_Channel1 +#endif + void adcInit(drv_adc_config_t *init) { ADC_InitTypeDef ADC_InitStructure; @@ -96,12 +102,12 @@ void adcInit(drv_adc_config_t *init) #endif RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div256); // 72 MHz divided by 256 = 281.25 kHz - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_ADC12, ENABLE); + RCC_AHBPeriphClockCmd(ADC_AHB_PERIPHERAL | RCC_AHBPeriph_ADC12, ENABLE); - DMA_DeInit(DMA1_Channel1); + DMA_DeInit(ADC_DMA_CHANNEL); DMA_StructInit(&DMA_InitStructure); - DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC_INSTANCE->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adcValues; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = adcChannelCount; @@ -113,19 +119,19 @@ void adcInit(drv_adc_config_t *init) DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA1_Channel1, &DMA_InitStructure); + DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure); - DMA_Cmd(DMA1_Channel1, ENABLE); + DMA_Cmd(ADC_DMA_CHANNEL, ENABLE); // calibrate - ADC_VoltageRegulatorCmd(ADC1, ENABLE); + ADC_VoltageRegulatorCmd(ADC_INSTANCE, ENABLE); delay(10); - ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single); - ADC_StartCalibration(ADC1); - while(ADC_GetCalibrationStatus(ADC1) != RESET); - ADC_VoltageRegulatorCmd(ADC1, DISABLE); + ADC_SelectCalibrationMode(ADC_INSTANCE, ADC_CalibrationMode_Single); + ADC_StartCalibration(ADC_INSTANCE); + while(ADC_GetCalibrationStatus(ADC_INSTANCE) != RESET); + ADC_VoltageRegulatorCmd(ADC_INSTANCE, DISABLE); ADC_CommonInitTypeDef ADC_CommonInitStructure; @@ -136,7 +142,7 @@ void adcInit(drv_adc_config_t *init) ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular; ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0; - ADC_CommonInit(ADC1, &ADC_CommonInitStructure); + ADC_CommonInit(ADC_INSTANCE, &ADC_CommonInitStructure); ADC_StructInit(&ADC_InitStructure); @@ -149,24 +155,24 @@ void adcInit(drv_adc_config_t *init) ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; ADC_InitStructure.ADC_NbrOfRegChannel = adcChannelCount; - ADC_Init(ADC1, &ADC_InitStructure); + ADC_Init(ADC_INSTANCE, &ADC_InitStructure); uint8_t rank = 1; for (i = 0; i < ADC_CHANNEL_COUNT; i++) { if (!adcConfig[i].enabled) { continue; } - ADC_RegularChannelConfig(ADC1, adcConfig[i].adcChannel, rank++, adcConfig[i].sampleTime); + ADC_RegularChannelConfig(ADC_INSTANCE, adcConfig[i].adcChannel, rank++, adcConfig[i].sampleTime); } - ADC_Cmd(ADC1, ENABLE); + ADC_Cmd(ADC_INSTANCE, ENABLE); - while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY)); + while(!ADC_GetFlagStatus(ADC_INSTANCE, ADC_FLAG_RDY)); - ADC_DMAConfig(ADC1, ADC_DMAMode_Circular); + ADC_DMAConfig(ADC_INSTANCE, ADC_DMAMode_Circular); - ADC_DMACmd(ADC1, ENABLE); + ADC_DMACmd(ADC_INSTANCE, ENABLE); - ADC_StartConversion(ADC1); + ADC_StartConversion(ADC_INSTANCE); } diff --git a/src/main/target/CHEBUZZF3/target.h b/src/main/target/CHEBUZZF3/target.h index c5f896f3c1..e27951b9fd 100644 --- a/src/main/target/CHEBUZZF3/target.h +++ b/src/main/target/CHEBUZZF3/target.h @@ -70,6 +70,10 @@ #define USE_ADC +#define ADC_INSTANCE ADC1 +#define ADC_AHB_PERIPHERAL RCC_AHBPeriph_DMA1 +#define ADC_DMA_CHANNEL DMA1_Channel1 + #define VBAT_ADC_GPIO GPIOC #define VBAT_ADC_GPIO_PIN GPIO_Pin_0 #define VBAT_ADC_CHANNEL ADC_Channel_6 diff --git a/src/main/target/SPRACINGF3/target.h b/src/main/target/SPRACINGF3/target.h index af35c8a182..4fd50c96b2 100644 --- a/src/main/target/SPRACINGF3/target.h +++ b/src/main/target/SPRACINGF3/target.h @@ -62,6 +62,28 @@ //#define USE_SPI //#define USE_SPI_DEVICE_2 // PB12,13,14,15 on AF5 +#define USE_ADC + +#define ADC_INSTANCE ADC2 +#define ADC_DMA_CHANNEL DMA2_Channel1 +#define ADC_AHB_PERIPHERAL RCC_AHBPeriph_DMA2 + +#define VBAT_ADC_GPIO GPIOA +#define VBAT_ADC_GPIO_PIN GPIO_Pin_4 +#define VBAT_ADC_CHANNEL ADC_Channel_1 + +#define CURRENT_METER_ADC_GPIO GPIOA +#define CURRENT_METER_ADC_GPIO_PIN GPIO_Pin_5 +#define CURRENT_METER_ADC_CHANNEL ADC_Channel_2 + +#define RSSI_ADC_GPIO GPIOB +#define RSSI_ADC_GPIO_PIN GPIO_Pin_2 +#define RSSI_ADC_CHANNEL ADC_Channel_12 + +#define RSSI_ADC_GPIO GPIOB +#define RSSI_ADC_GPIO_PIN GPIO_Pin_2 +#define RSSI_ADC_CHANNEL ADC_Channel_12 + #define LED_STRIP #define LED_STRIP_TIMER TIM1 diff --git a/src/main/target/STM32F3DISCOVERY/target.h b/src/main/target/STM32F3DISCOVERY/target.h index 2990341ea1..29f5f39e82 100644 --- a/src/main/target/STM32F3DISCOVERY/target.h +++ b/src/main/target/STM32F3DISCOVERY/target.h @@ -61,6 +61,10 @@ #define USE_ADC +#define ADC_INSTANCE ADC1 +#define ADC_AHB_PERIPHERAL RCC_AHBPeriph_DMA1 +#define ADC_DMA_CHANNEL DMA1_Channel1 + #define VBAT_ADC_GPIO GPIOC #define VBAT_ADC_GPIO_PIN GPIO_Pin_0 #define VBAT_ADC_CHANNEL ADC_Channel_6