mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-15 12:25:20 +03:00
ADC converted to new IO mapping
This commit is contained in:
parent
d4037e05e4
commit
7e6fb8db65
30 changed files with 263 additions and 281 deletions
|
@ -29,17 +29,31 @@
|
|||
|
||||
#include "sensor.h"
|
||||
#include "accgyro.h"
|
||||
|
||||
#include "adc.h"
|
||||
#include "adc_impl.h"
|
||||
#include "io.h"
|
||||
#include "rcc.h"
|
||||
|
||||
#ifndef ADC_INSTANCE
|
||||
#define ADC_INSTANCE ADC1
|
||||
#define ADC_ABP2_PERIPHERAL RCC_APB2Periph_ADC1
|
||||
#define ADC_AHB_PERIPHERAL RCC_AHBPeriph_DMA1
|
||||
#define ADC_DMA_CHANNEL DMA1_Channel1
|
||||
#define ADC_INSTANCE ADC1
|
||||
#endif
|
||||
|
||||
const adcDevice_t adcHardware[] = {
|
||||
{ .ADCx = ADC1, .rccADC = RCC_APB2(ADC1), .rccDMA = RCC_AHB(DMA1), .DMAy_Channelx = DMA1_Channel1 }
|
||||
};
|
||||
|
||||
ADCDevice adcDeviceByInstance(ADC_TypeDef *instance)
|
||||
{
|
||||
if (instance == ADC1)
|
||||
return ADCDEV_1;
|
||||
|
||||
/* TODO -- ADC2 available on large 10x devices.
|
||||
if (instance == ADC2)
|
||||
return ADCDEV_2;
|
||||
*/
|
||||
return ADCINVALID;
|
||||
}
|
||||
|
||||
// Driver for STM32F103CB onboard ADC
|
||||
//
|
||||
// Naze32
|
||||
|
@ -50,27 +64,22 @@
|
|||
// NAZE rev.5 hardware has PA5 (ADC1_IN5) on breakout pad on bottom of board
|
||||
//
|
||||
|
||||
|
||||
void adcInit(drv_adc_config_t *init)
|
||||
{
|
||||
#if defined(CJMCU) || defined(CC3D)
|
||||
UNUSED(init);
|
||||
|
||||
#if !defined(VBAT_ADC_PIN) && !defined(EXTERNAL1_ADC_PIN) && !defined(RSSI_ADC_PIN) && !defined(CURRENT_METER_ADC_PIN)
|
||||
UNUSED(init);
|
||||
#endif
|
||||
|
||||
|
||||
uint8_t i;
|
||||
uint8_t configuredAdcChannels = 0;
|
||||
|
||||
memset(&adcConfig, 0, sizeof(adcConfig));
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
GPIO_StructInit(&GPIO_InitStructure);
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
||||
|
||||
#ifdef VBAT_ADC_GPIO
|
||||
#ifdef VBAT_ADC_PIN
|
||||
if (init->enableVBat) {
|
||||
GPIO_InitStructure.GPIO_Pin = VBAT_ADC_GPIO_PIN;
|
||||
GPIO_Init(VBAT_ADC_GPIO, &GPIO_InitStructure);
|
||||
IOInit(IOGetByTag(IO_TAG(VBAT_ADC_PIN)), OWNER_SYSTEM, RESOURCE_ADC);
|
||||
IOConfigGPIO(IOGetByTag(IO_TAG(VBAT_ADC_PIN)), IO_CONFIG(GPIO_Mode_AIN, 0));
|
||||
adcConfig[ADC_BATTERY].adcChannel = VBAT_ADC_CHANNEL;
|
||||
adcConfig[ADC_BATTERY].dmaIndex = configuredAdcChannels++;
|
||||
adcConfig[ADC_BATTERY].enabled = true;
|
||||
|
@ -78,10 +87,10 @@ void adcInit(drv_adc_config_t *init)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef RSSI_ADC_GPIO
|
||||
#ifdef RSSI_ADC_PIN
|
||||
if (init->enableRSSI) {
|
||||
GPIO_InitStructure.GPIO_Pin = RSSI_ADC_GPIO_PIN;
|
||||
GPIO_Init(RSSI_ADC_GPIO, &GPIO_InitStructure);
|
||||
IOInit(IOGetByTag(IO_TAG(RSSI_ADC_PIN)), OWNER_SYSTEM, RESOURCE_ADC);
|
||||
IOConfigGPIO(IOGetByTag(IO_TAG(RSSI_ADC_PIN)), IO_CONFIG(GPIO_Mode_AIN, 0));
|
||||
adcConfig[ADC_RSSI].adcChannel = RSSI_ADC_CHANNEL;
|
||||
adcConfig[ADC_RSSI].dmaIndex = configuredAdcChannels++;
|
||||
adcConfig[ADC_RSSI].enabled = true;
|
||||
|
@ -89,10 +98,10 @@ void adcInit(drv_adc_config_t *init)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef EXTERNAL1_ADC_GPIO
|
||||
#ifdef EXTERNAL1_ADC_PIN
|
||||
if (init->enableExternal1) {
|
||||
GPIO_InitStructure.GPIO_Pin = EXTERNAL1_ADC_GPIO_PIN;
|
||||
GPIO_Init(EXTERNAL1_ADC_GPIO, &GPIO_InitStructure);
|
||||
IOInit(IOGetByTag(IO_TAG(EXTERNAL1_ADC_PIN)), OWNER_SYSTEM, RESOURCE_ADC);
|
||||
IOConfigGPIO(IOGetByTag(IO_TAG(EXTERNAL1_ADC_PIN)), IO_CONFIG(GPIO_Mode_AIN, 0));
|
||||
adcConfig[ADC_EXTERNAL1].adcChannel = EXTERNAL1_ADC_CHANNEL;
|
||||
adcConfig[ADC_EXTERNAL1].dmaIndex = configuredAdcChannels++;
|
||||
adcConfig[ADC_EXTERNAL1].enabled = true;
|
||||
|
@ -100,10 +109,10 @@ void adcInit(drv_adc_config_t *init)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CURRENT_METER_ADC_GPIO
|
||||
#ifdef CURRENT_METER_ADC_PIN
|
||||
if (init->enableCurrentMeter) {
|
||||
GPIO_InitStructure.GPIO_Pin = CURRENT_METER_ADC_GPIO_PIN;
|
||||
GPIO_Init(CURRENT_METER_ADC_GPIO, &GPIO_InitStructure);
|
||||
IOInit(IOGetByTag(IO_TAG(CURRENT_METER_ADC_PIN)), OWNER_SYSTEM, RESOURCE_ADC);
|
||||
IOConfigGPIO(IOGetByTag(IO_TAG(CURRENT_METER_ADC_PIN)), IO_CONFIG(GPIO_Mode_AIN, 0));
|
||||
adcConfig[ADC_CURRENT].adcChannel = CURRENT_METER_ADC_CHANNEL;
|
||||
adcConfig[ADC_CURRENT].dmaIndex = configuredAdcChannels++;
|
||||
adcConfig[ADC_CURRENT].enabled = true;
|
||||
|
@ -111,16 +120,22 @@ void adcInit(drv_adc_config_t *init)
|
|||
}
|
||||
#endif
|
||||
|
||||
ADCDevice device = adcDeviceByInstance(ADC_INSTANCE);
|
||||
if (device == ADCINVALID)
|
||||
return;
|
||||
|
||||
adcDevice_t adc = adcHardware[device];
|
||||
|
||||
RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 9MHz from 72MHz APB2 clock(HSE), 8MHz from 64MHz (HSI)
|
||||
RCC_AHBPeriphClockCmd(ADC_AHB_PERIPHERAL, ENABLE);
|
||||
RCC_APB2PeriphClockCmd(ADC_ABP2_PERIPHERAL, ENABLE);
|
||||
|
||||
RCC_ClockCmd(adc.rccADC, ENABLE);
|
||||
RCC_ClockCmd(adc.rccDMA, ENABLE);
|
||||
|
||||
// FIXME ADC driver assumes all the GPIO was already placed in 'AIN' mode
|
||||
|
||||
DMA_DeInit(ADC_DMA_CHANNEL);
|
||||
DMA_DeInit(adc.DMAy_Channelx);
|
||||
DMA_InitTypeDef DMA_InitStructure;
|
||||
DMA_StructInit(&DMA_InitStructure);
|
||||
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC_INSTANCE->DR;
|
||||
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&adc.ADCx->DR;
|
||||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adcValues;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
||||
DMA_InitStructure.DMA_BufferSize = configuredAdcChannels;
|
||||
|
@ -131,8 +146,8 @@ void adcInit(drv_adc_config_t *init)
|
|||
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
|
||||
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
|
||||
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
||||
DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure);
|
||||
DMA_Cmd(ADC_DMA_CHANNEL, ENABLE);
|
||||
DMA_Init(adc.DMAy_Channelx, &DMA_InitStructure);
|
||||
DMA_Cmd(adc.DMAy_Channelx, ENABLE);
|
||||
|
||||
ADC_InitTypeDef ADC_InitStructure;
|
||||
ADC_StructInit(&ADC_InitStructure);
|
||||
|
@ -142,23 +157,23 @@ void adcInit(drv_adc_config_t *init)
|
|||
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
|
||||
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
|
||||
ADC_InitStructure.ADC_NbrOfChannel = configuredAdcChannels;
|
||||
ADC_Init(ADC_INSTANCE, &ADC_InitStructure);
|
||||
ADC_Init(adc.ADCx, &ADC_InitStructure);
|
||||
|
||||
uint8_t rank = 1;
|
||||
for (i = 0; i < ADC_CHANNEL_COUNT; i++) {
|
||||
if (!adcConfig[i].enabled) {
|
||||
continue;
|
||||
}
|
||||
ADC_RegularChannelConfig(ADC_INSTANCE, adcConfig[i].adcChannel, rank++, adcConfig[i].sampleTime);
|
||||
ADC_RegularChannelConfig(adc.ADCx, adcConfig[i].adcChannel, rank++, adcConfig[i].sampleTime);
|
||||
}
|
||||
|
||||
ADC_DMACmd(ADC_INSTANCE, ENABLE);
|
||||
ADC_Cmd(ADC_INSTANCE, ENABLE);
|
||||
ADC_DMACmd(adc.ADCx, ENABLE);
|
||||
ADC_Cmd(adc.ADCx, ENABLE);
|
||||
|
||||
ADC_ResetCalibration(ADC_INSTANCE);
|
||||
while(ADC_GetResetCalibrationStatus(ADC_INSTANCE));
|
||||
ADC_StartCalibration(ADC_INSTANCE);
|
||||
while(ADC_GetCalibrationStatus(ADC_INSTANCE));
|
||||
ADC_ResetCalibration(adc.ADCx);
|
||||
while (ADC_GetResetCalibrationStatus(adc.ADCx));
|
||||
ADC_StartCalibration(adc.ADCx);
|
||||
while (ADC_GetCalibrationStatus(adc.ADCx));
|
||||
|
||||
ADC_SoftwareStartConvCmd(ADC_INSTANCE, ENABLE);
|
||||
ADC_SoftwareStartConvCmd(adc.ADCx, ENABLE);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue