diff --git a/radio/src/cli.cpp b/radio/src/cli.cpp index f217cde9d..a555acf41 100644 --- a/radio/src/cli.cpp +++ b/radio/src/cli.cpp @@ -44,8 +44,12 @@ OS_TID cliTaskId; TaskStack cliStack; Fifo<256> cliRxFifo; uint8_t cliTracesEnabled = true; +// char cliLastLine[CLI_COMMAND_MAX_LEN+1]; typedef int (* CliFunction) (const char ** args); +int cliExecLine(char * line); +int cliExecCommand(const char ** argv); +int cliHelp(const char ** argv); struct CliCommand { @@ -326,7 +330,27 @@ int cliDebugVars(const char ** argv) 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[] = { { "beep", cliBeep, "[] []" }, @@ -342,6 +366,7 @@ const CliCommand cliCommands[] = { #endif { "help", cliHelp, "[]" }, { "debugvars", cliDebugVars, "" }, + { "repeat", cliRepeat, " " }, { NULL, NULL, NULL } /* sentinel */ }; @@ -423,6 +448,7 @@ void cliTask(void * pdata) // enter serialCrlf(); line[pos] = '\0'; + // strcpy(cliLastLine, line); cliExecLine(line); pos = 0; cliPrompt(); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c8bd19a54..9618e564b 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1005,7 +1005,16 @@ enum Analogs { STICK2, STICK3, STICK4, -#if defined(PCBFLAMENCO) +#if defined(PCBHORUS) + POT1, + POT2, + POT3, + POT_LAST=POT3, + SLIDER1, + SLIDER2, + SLIDER3, + SLIDER4, +#elif defined(PCBFLAMENCO) POT1, POT2, POT_LAST = POT2, @@ -1049,6 +1058,10 @@ enum Analogs { TX_VOLTAGE, #if defined(PCBSKY9X) && !defined(REVA) TX_CURRENT, +#endif +#if defined(PCBHORUS) + MOUSE1, + MOUSE2, #endif NUMBER_ANALOG }; diff --git a/radio/src/targets/Horus/adc_driver.cpp b/radio/src/targets/Horus/adc_driver.cpp index f84eda4e3..fd88831a6 100644 --- a/radio/src/targets/Horus/adc_driver.cpp +++ b/radio/src/targets/Horus/adc_driver.cpp @@ -36,87 +36,189 @@ #include "../../opentx.h" -#define STICK_LV 3 -#define STICK_LH 2 -#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 +#define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS) +#define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS) -// Sample time should exceed 1uS -#define SAMPTIME 2 // sample time = 28 cycles +#define RESETCMD 0x4000 +#define MANUAL_MODE 0x1000 // manual mode channel 0 + +#define SAMPTIME 2 // sample time = 28 cycles 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 -const int8_t ana_direction[NUMBER_ANALOG] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -#endif + while(SPI_I2S_GetFlagStatus(ADC_SPI,SPI_I2S_FLAG_RXNE) ==RESET); + return SPI_I2S_ReceiveData(ADC_SPI); +} + +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() { - return ; + RCC_AHB1PeriphClockCmd(ADC_RCC_AHB1Periph, ENABLE); + RCC_APB2PeriphClockCmd(ADC_RCC_APB2Periph, ENABLE); - // Enable clocks - RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; - RCC->AHB1ENR |= ADC_RCC_AHB1Periph_GPIO | RCC_AHB1ENR_DMA2EN; + ADS7952_Init(); - configure_pins(ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | - ADC_GPIO_PIN_POT_R1 | ADC_GPIO_SWITCHES_PIN_R3 | ADC_GPIO_SWITCHES_PIN_R4, PIN_ANALOG | PIN_PORTA); - - configure_pins(ADC_GPIO_PIN_POT_R2 | ADC_GPIO_PIN_POT_L2, PIN_ANALOG | PIN_PORTB); - - 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); - - ADC1->CR1 = ADC_CR1_SCAN; - ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC1->SQR1 = (BATTERY<<0) + ((NUMBER_ANALOG_ADC1-1) << 20); // bits 23:20 = number of conversions - ADC1->SQR2 = (SLIDE_L<<0) + (SLIDE_R<<5) + (SWITCHES1<<10) + (SWITCHES2<<15) + (SWITCHES3<<20) + (SWITCHES4<<25); // conversions 7 to 12 - 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); - ADC1->SMPR2 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24) + (SAMPTIME<<27) ; - - ADC->CCR = 0 ; //ADC_CCR_ADCPRE_0 ; // Clock div 2 - - 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 ; + configure_pins( ADC_GPIO_PIN_MOUSE1 | ADC_GPIO_PIN_MOUSE2, PIN_ANALOG | PIN_PORTF ); + + ADC3->CR1 = ADC_CR1_SCAN; + ADC3->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; + ADC3->SQR1 = (2-1) << 20; // NUMBER_ANALOG Channels + ADC3->SQR3 = ADC_IN_MOUSE1 + (ADC_IN_MOUSE2<<5); + ADC3->SMPR1 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24); + ADC3->SMPR2 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24) + (SAMPTIME<<27); + ADC->CCR = 0; // ADC_CCR_ADCPRE_0; Clock div 2 + + // Enable the DMA channel here, DMA2 stream 1, channel 2 + 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; + DMA2_Stream1->M0AR = (uint32_t) &Analog_values[MOUSE1]; + DMA2_Stream1->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() { - return ; + const uint16_t * command = adcCommands; - DMA2_Stream0->CR &= ~DMA_SxCR_EN ; // Disable DMA - ADC1->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR ) ; - DMA2->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 |DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0 ; // Write ones to clear bits - DMA2_Stream0->CR |= DMA_SxCR_EN ; // Enable DMA - ADC1->CR2 |= (uint32_t)ADC_CR2_SWSTART ; - for (unsigned int i=0; i<10000; i++) { - if (DMA2->LISR & DMA_LISR_TCIF0) { + // Start on chip ADC read + DMA2_Stream1->CR &= ~DMA_SxCR_EN; // Disable DMA + ADC3->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR ); + DMA2->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 |DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1; // Write ones to clear bits + DMA2_Stream1->M0AR = (uint32_t) &Analog_values[MOUSE1]; + DMA2_Stream1->NDTR = 2; + 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; adcIndexLISR & DMA_LISR_TCIF1) { break; } } - DMA2_Stream0->CR &= ~DMA_SxCR_EN ; // Disable DMA -} -// TODO -void adcStop() -{ + // On chip ADC read should have finished } uint16_t getAnalogValue(uint32_t value) { - // return Analog_values[ana_mapping[value]]; - return 0; // Analog_values[value]; + return Analog_values[value]; } diff --git a/radio/src/targets/Horus/board_horus.cpp b/radio/src/targets/Horus/board_horus.cpp index ed0d9742e..a3ef084b1 100644 --- a/radio/src/targets/Horus/board_horus.cpp +++ b/radio/src/targets/Horus/board_horus.cpp @@ -167,7 +167,7 @@ void boardInit() TRACE("Horus started :)"); keysInit(); - // adcInit(); + adcInit(); lcdInit(); audioInit(); i2cInit(); diff --git a/radio/src/targets/Horus/board_horus.h b/radio/src/targets/Horus/board_horus.h index 90298f462..12e5ec6f8 100644 --- a/radio/src/targets/Horus/board_horus.h +++ b/radio/src/targets/Horus/board_horus.h @@ -77,39 +77,40 @@ extern "C" { } #endif -#define FLASHSIZE 0x80000 -#define BOOTLOADER_SIZE 0x8000 -#define FIRMWARE_ADDRESS 0x08000000 +#define FLASHSIZE 0x80000 +#define BOOTLOADER_SIZE 0x8000 +#define FIRMWARE_ADDRESS 0x08000000 -#define PERI1_FREQUENCY 45000000 -#define PERI2_FREQUENCY 90000000 -#define TIMER_MULT_APB1 4 -#define TIMER_MULT_APB2 2 +#define PERI1_FREQUENCY 45000000 +#define PERI2_FREQUENCY 90000000 +#define TIMER_MULT_APB1 4 +#define TIMER_MULT_APB2 2 -#define PIN_MODE_MASK 0x0003 -#define PIN_INPUT 0x0000 -#define PIN_OUTPUT 0x0001 -#define PIN_PERIPHERAL 0x0002 -#define PIN_ANALOG 0x0003 -#define PIN_PULL_MASK 0x000C -#define PIN_PULLUP 0x0004 -#define PIN_NO_PULLUP 0x0000 -#define PIN_PULLDOWN 0x0008 -#define PIN_NO_PULLDOWN 0x0000 -#define PIN_PERI_MASK 0x00F0 -#define PIN_PUSHPULL 0x0000 -#define PIN_ODRAIN 0x8000 -#define PIN_PORT_MASK 0x0700 -#define PIN_SPEED_MASK 0x6000 -#define PIN_PORTA 0x0000 -#define PIN_PORTB 0x0100 -#define PIN_PORTC 0x0200 -#define PIN_PER_1 0x0010 -#define PIN_PER_2 0x0020 -#define PIN_PER_3 0x0030 -#define PIN_OS25 0x2000 -#define PIN_OS50 0x4000 -#define PIN_OS100 0x6000 +#define PIN_MODE_MASK 0x0003 +#define PIN_INPUT 0x0000 +#define PIN_OUTPUT 0x0001 +#define PIN_PERIPHERAL 0x0002 +#define PIN_ANALOG 0x0003 +#define PIN_PULL_MASK 0x000C +#define PIN_PULLUP 0x0004 +#define PIN_NO_PULLUP 0x0000 +#define PIN_PULLDOWN 0x0008 +#define PIN_NO_PULLDOWN 0x0000 +#define PIN_PERI_MASK 0x00F0 +#define PIN_PUSHPULL 0x0000 +#define PIN_ODRAIN 0x8000 +#define PIN_PORT_MASK 0x0700 +#define PIN_SPEED_MASK 0x6000 +#define PIN_PORTA 0x0000 +#define PIN_PORTB 0x0100 +#define PIN_PORTC 0x0200 +#define PIN_PORTF 0x0500 +#define PIN_PER_1 0x0010 +#define PIN_PER_2 0x0020 +#define PIN_PER_3 0x0030 +#define PIN_OS25 0x2000 +#define PIN_OS50 0x4000 +#define PIN_OS100 0x6000 void configure_pins( uint32_t pins, uint16_t config ); diff --git a/radio/src/targets/Horus/hal.h b/radio/src/targets/Horus/hal.h index 096a4fec7..19c84f484 100644 --- a/radio/src/targets/Horus/hal.h +++ b/radio/src/targets/Horus/hal.h @@ -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) // ADC -#define ADC_RCC_AHB1Periph_GPIO (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC) -#define ADC_GPIO_STICKS GPIOA -#define ADC_GPIO_PIN_STICK_LV GPIO_Pin_0 // PA.00 -#define ADC_GPIO_PIN_STICK_LH GPIO_Pin_1 // PA.01 -#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_2 // PA.02 -#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_3 // PA.03 -#define ADC_GPIO_POT_L1 GPIOC -#define ADC_GPIO_PIN_POT_L1 GPIO_Pin_3 // PC.03 -#define ADC_GPIO_POT_R1 GPIOA -#define ADC_GPIO_PIN_POT_R1 GPIO_Pin_5 // PA.05 -#define ADC_GPIO_POT_L2 GPIOB -#define ADC_GPIO_PIN_POT_L2 GPIO_Pin_1 // PB.01 -#define ADC_GPIO_POT_R2 GPIOB -#define ADC_GPIO_PIN_POT_R2 GPIO_Pin_0 // PB.00 -#define ADC_GPIO_SWITCHES_L3 GPIOC -#define ADC_GPIO_SWITCHES_PIN_L3 GPIO_Pin_1 // PC.01 -#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 +#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) +#define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC3) +#define ADC_SPI SPI4 +#define ADC_GPIO_AF GPIO_AF_SPI4 +#define ADC_SPI_GPIO GPIOE +#define ADC_SPI_PIN_SCK GPIO_Pin_2 +#define ADC_SPI_PIN_CS GPIO_Pin_4 +#define ADC_SPI_PIN_MOSI GPIO_Pin_6 +#define ADC_SPI_PIN_MISO GPIO_Pin_5 +#define ADC_SPI_PinSource_SCK GPIO_PinSource2 +#define ADC_SPI_PinSource_MISO GPIO_PinSource5 +#define ADC_SPI_PinSource_MOSI GPIO_PinSource6 +#define ADC_GPIO_PIN_MOUSE1 GPIO_Pin_8 // PF.8 ADC3_IN6 J5 MOUSE_X +#define ADC_GPIO_PIN_MOUSE2 GPIO_Pin_9 // PF.9 ADC3_IN7 J6 MOUSE_Y +#define ADC_IN_MOUSE1 6 +#define ADC_IN_MOUSE2 7 // Power #define PWR_RCC_AHB1Periph_GPIO RCC_AHB1Periph_GPIOJ