1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-21 15:25:17 +03:00

[Horus] ADC driver by Mike

+ new CLI command repeat <interval> <other command>
This commit is contained in:
Bertrand Songis 2015-11-06 17:03:55 +01:00
parent bca18f5938
commit b1f5ea115c
6 changed files with 252 additions and 118 deletions

View file

@ -44,8 +44,12 @@ OS_TID cliTaskId;
TaskStack<CLI_STACK_SIZE> cliStack; TaskStack<CLI_STACK_SIZE> cliStack;
Fifo<256> cliRxFifo; Fifo<256> cliRxFifo;
uint8_t cliTracesEnabled = true; uint8_t cliTracesEnabled = true;
// char cliLastLine[CLI_COMMAND_MAX_LEN+1];
typedef int (* CliFunction) (const char ** args); typedef int (* CliFunction) (const char ** args);
int cliExecLine(char * line);
int cliExecCommand(const char ** argv);
int cliHelp(const char ** argv);
struct CliCommand struct CliCommand
{ {
@ -326,7 +330,27 @@ int cliDebugVars(const char ** argv)
return 0; return 0;
} }
int cliHelp(const char ** argv); int cliRepeat(const char ** argv)
{
int interval = 0;
int counter = 0;
if (toInt(argv, 1, &interval) > 0 && argv[2]) {
interval *= 50;
counter = interval;
uint8_t c;
while (!cliRxFifo.pop(c) || !(c == '\r' || c == '\n' || c == ' ')) {
CoTickDelay(10); // 20ms
if (++counter >= interval) {
cliExecCommand(&argv[2]);
counter = 0;
}
}
}
else {
serialPrint("%s: Invalid arguments", argv[0]);
}
return 0;
}
const CliCommand cliCommands[] = { const CliCommand cliCommands[] = {
{ "beep", cliBeep, "[<frequency>] [<duration>]" }, { "beep", cliBeep, "[<frequency>] [<duration>]" },
@ -342,6 +366,7 @@ const CliCommand cliCommands[] = {
#endif #endif
{ "help", cliHelp, "[<command>]" }, { "help", cliHelp, "[<command>]" },
{ "debugvars", cliDebugVars, "" }, { "debugvars", cliDebugVars, "" },
{ "repeat", cliRepeat, "<interval> <command>" },
{ NULL, NULL, NULL } /* sentinel */ { NULL, NULL, NULL } /* sentinel */
}; };
@ -423,6 +448,7 @@ void cliTask(void * pdata)
// enter // enter
serialCrlf(); serialCrlf();
line[pos] = '\0'; line[pos] = '\0';
// strcpy(cliLastLine, line);
cliExecLine(line); cliExecLine(line);
pos = 0; pos = 0;
cliPrompt(); cliPrompt();

View file

@ -1005,7 +1005,16 @@ enum Analogs {
STICK2, STICK2,
STICK3, STICK3,
STICK4, STICK4,
#if defined(PCBFLAMENCO) #if defined(PCBHORUS)
POT1,
POT2,
POT3,
POT_LAST=POT3,
SLIDER1,
SLIDER2,
SLIDER3,
SLIDER4,
#elif defined(PCBFLAMENCO)
POT1, POT1,
POT2, POT2,
POT_LAST = POT2, POT_LAST = POT2,
@ -1049,6 +1058,10 @@ enum Analogs {
TX_VOLTAGE, TX_VOLTAGE,
#if defined(PCBSKY9X) && !defined(REVA) #if defined(PCBSKY9X) && !defined(REVA)
TX_CURRENT, TX_CURRENT,
#endif
#if defined(PCBHORUS)
MOUSE1,
MOUSE2,
#endif #endif
NUMBER_ANALOG NUMBER_ANALOG
}; };

View file

@ -36,87 +36,189 @@
#include "../../opentx.h" #include "../../opentx.h"
#define STICK_LV 3 #define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS)
#define STICK_LH 2 #define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS)
#define STICK_RV 0
#define STICK_RH 1
#define POT_L 13
#define POT_R 5
#define SLIDE_L 9
#define SLIDE_R 8
#define SWITCHES1 11
#define SWITCHES2 7
#define SWITCHES3 10
#define SWITCHES4 6
#define BATTERY 14
// Sample time should exceed 1uS #define RESETCMD 0x4000
#define SAMPTIME 2 // sample time = 28 cycles #define MANUAL_MODE 0x1000 // manual mode channel 0
#define SAMPTIME 2 // sample time = 28 cycles
uint16_t Analog_values[NUMBER_ANALOG] __DMA; uint16_t Analog_values[NUMBER_ANALOG] __DMA;
#define NUMBER_ANALOG_ADC1 13 static u16 SPIx_ReadWriteByte(uint16_t value)
{
while(SPI_I2S_GetFlagStatus(ADC_SPI,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(ADC_SPI,value);
#if 0 while(SPI_I2S_GetFlagStatus(ADC_SPI,SPI_I2S_FLAG_RXNE) ==RESET);
const int8_t ana_direction[NUMBER_ANALOG] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; return SPI_I2S_ReceiveData(ADC_SPI);
#endif }
static void ADS7952_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitStructure.GPIO_Pin = ADC_SPI_PIN_MISO|ADC_SPI_PIN_SCK|ADC_SPI_PIN_MOSI;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(ADC_SPI_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ADC_SPI_PIN_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(ADC_SPI_GPIO, &GPIO_InitStructure);
GPIO_PinAFConfig(ADC_SPI_GPIO, ADC_SPI_PinSource_SCK, ADC_GPIO_AF);
GPIO_PinAFConfig(ADC_SPI_GPIO, ADC_SPI_PinSource_MISO, ADC_GPIO_AF);
GPIO_PinAFConfig(ADC_SPI_GPIO, ADC_SPI_PinSource_MOSI, ADC_GPIO_AF);
SPI_I2S_DeInit(ADC_SPI);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(ADC_SPI,&SPI_InitStructure);
SPI_Cmd(ADC_SPI,ENABLE);
SPI_I2S_ITConfig(ADC_SPI,SPI_I2S_IT_TXE,DISABLE);
SPI_I2S_ITConfig(ADC_SPI,SPI_I2S_IT_RXNE,DISABLE);
ADC_CS_HIGH();
delay_01us(1);
ADC_CS_LOW();
SPIx_ReadWriteByte(RESETCMD);
ADC_CS_HIGH();
delay_01us(1);
ADC_CS_LOW();
SPIx_ReadWriteByte(MANUAL_MODE);
ADC_CS_HIGH();
// SPIx_ReadWriteByte(ProgramReg_Auto2 );
// ADC_CS_HIGH();
// asm("nop");
// ADC_CS_LOW();
// SPIx_ReadWriteByte(AutoMode_2);
// ADC_CS_HIGH();
// asm("nop");
// ADC_CS_LOW();
// SPIx_ReadWriteByte(ContinuedSelectMode);
// ADC_CS_HIGH();
// asm("nop");
}
void adcInit() void adcInit()
{ {
return ; RCC_AHB1PeriphClockCmd(ADC_RCC_AHB1Periph, ENABLE);
RCC_APB2PeriphClockCmd(ADC_RCC_APB2Periph, ENABLE);
// Enable clocks ADS7952_Init();
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->AHB1ENR |= ADC_RCC_AHB1Periph_GPIO | RCC_AHB1ENR_DMA2EN;
configure_pins(ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | configure_pins( ADC_GPIO_PIN_MOUSE1 | ADC_GPIO_PIN_MOUSE2, PIN_ANALOG | PIN_PORTF );
ADC_GPIO_PIN_POT_R1 | ADC_GPIO_SWITCHES_PIN_R3 | ADC_GPIO_SWITCHES_PIN_R4, PIN_ANALOG | PIN_PORTA);
ADC3->CR1 = ADC_CR1_SCAN;
configure_pins(ADC_GPIO_PIN_POT_R2 | ADC_GPIO_PIN_POT_L2, PIN_ANALOG | PIN_PORTB); ADC3->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS;
ADC3->SQR1 = (2-1) << 20; // NUMBER_ANALOG Channels
configure_pins(ADC_GPIO_PIN_POT_L1 | ADC_GPIO_SWITCHES_PIN_L3 | ADC_GPIO_SWITCHES_PIN_L4 | ADC_GPIO_PIN_BATT, PIN_ANALOG | PIN_PORTC); ADC3->SQR3 = ADC_IN_MOUSE1 + (ADC_IN_MOUSE2<<5);
ADC3->SMPR1 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12)
ADC1->CR1 = ADC_CR1_SCAN; + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24);
ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; ADC3->SMPR2 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12)
ADC1->SQR1 = (BATTERY<<0) + ((NUMBER_ANALOG_ADC1-1) << 20); // bits 23:20 = number of conversions + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24) + (SAMPTIME<<27);
ADC1->SQR2 = (SLIDE_L<<0) + (SLIDE_R<<5) + (SWITCHES1<<10) + (SWITCHES2<<15) + (SWITCHES3<<20) + (SWITCHES4<<25); // conversions 7 to 12 ADC->CCR = 0; // ADC_CCR_ADCPRE_0; Clock div 2
ADC1->SQR3 = (STICK_LH<<0) + (STICK_LV<<5) + (STICK_RV<<10) + (STICK_RH<<15) + (POT_L<<20) + (POT_R<<25); // conversions 1 to 6
ADC1->SMPR1 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24); // Enable the DMA channel here, DMA2 stream 1, channel 2
ADC1->SMPR2 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24) + (SAMPTIME<<27) ; DMA2_Stream1->CR = DMA_SxCR_PL | DMA_SxCR_CHSEL_1 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC;
DMA2_Stream1->PAR = (uint32_t) &ADC3->DR;
ADC->CCR = 0 ; //ADC_CCR_ADCPRE_0 ; // Clock div 2 DMA2_Stream1->M0AR = (uint32_t) &Analog_values[MOUSE1];
DMA2_Stream1->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
DMA2_Stream0->CR = DMA_SxCR_PL | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC;
DMA2_Stream0->PAR = CONVERT_PTR_UINT(&ADC1->DR);
DMA2_Stream0->M0AR = CONVERT_PTR_UINT(Analog_values);
DMA2_Stream0->NDTR = NUMBER_ANALOG_ADC1;
DMA2_Stream0->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0 ;
} }
#define SPI_STICK1 0
#define SPI_STICK2 1
#define SPI_STICK3 2
#define SPI_STICK4 3
#define SPI_POT1 4
#define SPI_POT2 5
#define SPI_POT3 6
#define SPI_SLIDER1 7
#define SPI_SLIDER2 8
#define SPI_TX_VOLTAGE 9
#define SPI_SLIDER3 10
#define SPI_SLIDER4 11
const uint16_t adcCommands[MOUSE1+2] =
{
MANUAL_MODE | ( SPI_STICK1 << 7 ),
MANUAL_MODE | ( SPI_STICK2 << 7 ),
MANUAL_MODE | ( SPI_STICK3 << 7 ),
MANUAL_MODE | ( SPI_STICK4 << 7 ),
MANUAL_MODE | ( SPI_POT1 << 7 ),
MANUAL_MODE | ( SPI_POT2 << 7 ),
MANUAL_MODE | ( SPI_POT3 << 7 ),
MANUAL_MODE | ( SPI_SLIDER1 << 7 ),
MANUAL_MODE | ( SPI_SLIDER2 << 7 ),
MANUAL_MODE | ( SPI_SLIDER3 << 7 ),
MANUAL_MODE | ( SPI_SLIDER4 << 7 ),
MANUAL_MODE | ( SPI_TX_VOLTAGE << 7 ),
MANUAL_MODE | ( 0 << 7 ),
MANUAL_MODE | ( 0 << 7 )
};
void adcRead() void adcRead()
{ {
return ; const uint16_t * command = adcCommands;
DMA2_Stream0->CR &= ~DMA_SxCR_EN ; // Disable DMA // Start on chip ADC read
ADC1->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR ) ; DMA2_Stream1->CR &= ~DMA_SxCR_EN; // Disable DMA
DMA2->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 |DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0 ; // Write ones to clear bits ADC3->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR );
DMA2_Stream0->CR |= DMA_SxCR_EN ; // Enable DMA DMA2->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 |DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1; // Write ones to clear bits
ADC1->CR2 |= (uint32_t)ADC_CR2_SWSTART ; DMA2_Stream1->M0AR = (uint32_t) &Analog_values[MOUSE1];
for (unsigned int i=0; i<10000; i++) { DMA2_Stream1->NDTR = 2;
if (DMA2->LISR & DMA_LISR_TCIF0) { DMA2_Stream1->CR |= DMA_SxCR_EN; // Enable DMA
ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART;
ADC_CS_LOW();
delay_01us(1);
SPIx_ReadWriteByte(*command++); // Discard
ADC_CS_HIGH();
delay_01us(1);
ADC_CS_LOW();
delay_01us(1);
SPIx_ReadWriteByte(*command++); // Discard
ADC_CS_HIGH();
delay_01us(1);
for (uint32_t adcIndex=0; adcIndex<MOUSE1; adcIndex++) {
ADC_CS_LOW();
delay_01us(1);
Analog_values[adcIndex] = (0x0fff & SPIx_ReadWriteByte(*command++));
ADC_CS_HIGH();
delay_01us(1);
}
for (uint32_t i=0; i<20000; i++) {
if (DMA2->LISR & DMA_LISR_TCIF1) {
break; break;
} }
} }
DMA2_Stream0->CR &= ~DMA_SxCR_EN ; // Disable DMA
}
// TODO // On chip ADC read should have finished
void adcStop()
{
} }
uint16_t getAnalogValue(uint32_t value) uint16_t getAnalogValue(uint32_t value)
{ {
// return Analog_values[ana_mapping[value]]; return Analog_values[value];
return 0; // Analog_values[value];
} }

View file

@ -167,7 +167,7 @@ void boardInit()
TRACE("Horus started :)"); TRACE("Horus started :)");
keysInit(); keysInit();
// adcInit(); adcInit();
lcdInit(); lcdInit();
audioInit(); audioInit();
i2cInit(); i2cInit();

View file

@ -77,39 +77,40 @@ extern "C" {
} }
#endif #endif
#define FLASHSIZE 0x80000 #define FLASHSIZE 0x80000
#define BOOTLOADER_SIZE 0x8000 #define BOOTLOADER_SIZE 0x8000
#define FIRMWARE_ADDRESS 0x08000000 #define FIRMWARE_ADDRESS 0x08000000
#define PERI1_FREQUENCY 45000000 #define PERI1_FREQUENCY 45000000
#define PERI2_FREQUENCY 90000000 #define PERI2_FREQUENCY 90000000
#define TIMER_MULT_APB1 4 #define TIMER_MULT_APB1 4
#define TIMER_MULT_APB2 2 #define TIMER_MULT_APB2 2
#define PIN_MODE_MASK 0x0003 #define PIN_MODE_MASK 0x0003
#define PIN_INPUT 0x0000 #define PIN_INPUT 0x0000
#define PIN_OUTPUT 0x0001 #define PIN_OUTPUT 0x0001
#define PIN_PERIPHERAL 0x0002 #define PIN_PERIPHERAL 0x0002
#define PIN_ANALOG 0x0003 #define PIN_ANALOG 0x0003
#define PIN_PULL_MASK 0x000C #define PIN_PULL_MASK 0x000C
#define PIN_PULLUP 0x0004 #define PIN_PULLUP 0x0004
#define PIN_NO_PULLUP 0x0000 #define PIN_NO_PULLUP 0x0000
#define PIN_PULLDOWN 0x0008 #define PIN_PULLDOWN 0x0008
#define PIN_NO_PULLDOWN 0x0000 #define PIN_NO_PULLDOWN 0x0000
#define PIN_PERI_MASK 0x00F0 #define PIN_PERI_MASK 0x00F0
#define PIN_PUSHPULL 0x0000 #define PIN_PUSHPULL 0x0000
#define PIN_ODRAIN 0x8000 #define PIN_ODRAIN 0x8000
#define PIN_PORT_MASK 0x0700 #define PIN_PORT_MASK 0x0700
#define PIN_SPEED_MASK 0x6000 #define PIN_SPEED_MASK 0x6000
#define PIN_PORTA 0x0000 #define PIN_PORTA 0x0000
#define PIN_PORTB 0x0100 #define PIN_PORTB 0x0100
#define PIN_PORTC 0x0200 #define PIN_PORTC 0x0200
#define PIN_PER_1 0x0010 #define PIN_PORTF 0x0500
#define PIN_PER_2 0x0020 #define PIN_PER_1 0x0010
#define PIN_PER_3 0x0030 #define PIN_PER_2 0x0020
#define PIN_OS25 0x2000 #define PIN_PER_3 0x0030
#define PIN_OS50 0x4000 #define PIN_OS25 0x2000
#define PIN_OS100 0x6000 #define PIN_OS50 0x4000
#define PIN_OS100 0x6000
void configure_pins( uint32_t pins, uint16_t config ); void configure_pins( uint32_t pins, uint16_t config );

View file

@ -90,30 +90,22 @@
#define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD)
// ADC // ADC
#define ADC_RCC_AHB1Periph_GPIO (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2)
#define ADC_GPIO_STICKS GPIOA #define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC3)
#define ADC_GPIO_PIN_STICK_LV GPIO_Pin_0 // PA.00 #define ADC_SPI SPI4
#define ADC_GPIO_PIN_STICK_LH GPIO_Pin_1 // PA.01 #define ADC_GPIO_AF GPIO_AF_SPI4
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_2 // PA.02 #define ADC_SPI_GPIO GPIOE
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_3 // PA.03 #define ADC_SPI_PIN_SCK GPIO_Pin_2
#define ADC_GPIO_POT_L1 GPIOC #define ADC_SPI_PIN_CS GPIO_Pin_4
#define ADC_GPIO_PIN_POT_L1 GPIO_Pin_3 // PC.03 #define ADC_SPI_PIN_MOSI GPIO_Pin_6
#define ADC_GPIO_POT_R1 GPIOA #define ADC_SPI_PIN_MISO GPIO_Pin_5
#define ADC_GPIO_PIN_POT_R1 GPIO_Pin_5 // PA.05 #define ADC_SPI_PinSource_SCK GPIO_PinSource2
#define ADC_GPIO_POT_L2 GPIOB #define ADC_SPI_PinSource_MISO GPIO_PinSource5
#define ADC_GPIO_PIN_POT_L2 GPIO_Pin_1 // PB.01 #define ADC_SPI_PinSource_MOSI GPIO_PinSource6
#define ADC_GPIO_POT_R2 GPIOB #define ADC_GPIO_PIN_MOUSE1 GPIO_Pin_8 // PF.8 ADC3_IN6 J5 MOUSE_X
#define ADC_GPIO_PIN_POT_R2 GPIO_Pin_0 // PB.00 #define ADC_GPIO_PIN_MOUSE2 GPIO_Pin_9 // PF.9 ADC3_IN7 J6 MOUSE_Y
#define ADC_GPIO_SWITCHES_L3 GPIOC #define ADC_IN_MOUSE1 6
#define ADC_GPIO_SWITCHES_PIN_L3 GPIO_Pin_1 // PC.01 #define ADC_IN_MOUSE2 7
#define ADC_GPIO_SWITCHES_R3 GPIOA
#define ADC_GPIO_SWITCHES_PIN_R3 GPIO_Pin_7 // PA.07
#define ADC_GPIO_SWITCHES_L4 GPIOC
#define ADC_GPIO_SWITCHES_PIN_L4 GPIO_Pin_0 // PC.00
#define ADC_GPIO_SWITCHES_R4 GPIOA
#define ADC_GPIO_SWITCHES_PIN_R4 GPIO_Pin_6 // PA.06
#define ADC_GPIO_BATT GPIOC
#define ADC_GPIO_PIN_BATT GPIO_Pin_4 // PC.04
// Power // Power
#define PWR_RCC_AHB1Periph_GPIO RCC_AHB1Periph_GPIOJ #define PWR_RCC_AHB1Periph_GPIO RCC_AHB1Periph_GPIOJ