From 0832a5c25439a37452a700951e2af12da2a726cc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 26 Jan 2018 18:50:39 +0100 Subject: [PATCH] X-Lite PWM sticks (#5632) X-Lite PWM sticks --- radio/src/gui/128x64/model_setup.cpp | 10 ++-- radio/src/opentx.cpp | 2 +- .../{adc_driver.cpp => analog_adc_driver.cpp} | 14 +++-- .../arm/stm32/analog_pwm_driver.cpp} | 51 +++---------------- radio/src/targets/horus/CMakeLists.txt | 4 +- radio/src/targets/horus/board.h | 6 +-- radio/src/targets/taranis/CMakeLists.txt | 9 +++- radio/src/targets/taranis/board.cpp | 2 +- radio/src/targets/taranis/board.h | 10 ++++ radio/src/targets/taranis/hal.h | 22 ++++++-- .../taranis/intmodule_pulses_driver.cpp | 2 +- 11 files changed, 65 insertions(+), 67 deletions(-) rename radio/src/targets/common/arm/stm32/{adc_driver.cpp => analog_adc_driver.cpp} (94%) rename radio/src/targets/{horus/pwm_driver.cpp => common/arm/stm32/analog_pwm_driver.cpp} (82%) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 78321969a..698fa2df1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1003,8 +1003,9 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); } if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { - if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); - if (attr && l_posHorz==0) { + if (xOffsetBind) + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + if (attr && l_posHorz == 0) { if (editMode>0 || p1valdiff) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); if (checkIncDec_Ret) { @@ -1021,7 +1022,7 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) if (multiBindStatus == MULTI_BIND_FINISHED) { multiBindStatus = MULTI_NORMAL_OPERATION; - s_editMode=0; + s_editMode = 0; } #endif #if defined(PCBTARANIS) @@ -1029,7 +1030,8 @@ void menuModelSetup(event_t event) if (s_editMode > 0) { if (l_posHorz == 1) { if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) { - if (event == EVT_KEY_BREAK(KEY_ENTER)) { + if (EVT_KEY_MASK(event) == KEY_ENTER) { + killEvents(event); uint8_t default_selection; if (IS_MODULE_R9M_LBT(moduleIdx)) { POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 38a259241..3dd40b2fc 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2597,7 +2597,7 @@ void opentxInit(OPENTX_INIT_ARGS) } #if NUM_PWMANALOGS > 0 - pwmCheck(); + analogPwmCheck(); #endif if (!unexpectedShutdown) { diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/analog_adc_driver.cpp similarity index 94% rename from radio/src/targets/common/arm/stm32/adc_driver.cpp rename to radio/src/targets/common/arm/stm32/analog_adc_driver.cpp index 524702840..ce24b6736 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/analog_adc_driver.cpp @@ -103,8 +103,14 @@ void adcInit() ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_POT3<<25); // conversions 1 to 6 #elif defined(PCBXLITE) - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 + if (ANALOGS_PWM_ENABLED()) { + ADC_MAIN->SQR2 = 0; + ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_BATT<<0); + } + else { + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 + } #elif defined(PCBX7) ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 @@ -142,7 +148,7 @@ void adcInit() #if NUM_PWMANALOGS > 0 if (ANALOGS_PWM_ENABLED()) { - pwmInit(); + analogPwmInit(); } #endif } @@ -204,7 +210,7 @@ void adcRead() #if NUM_PWMANALOGS > 0 if (ANALOGS_PWM_ENABLED()) { - pwmRead(adcValues); + analogPwmRead(adcValues); } #endif } diff --git a/radio/src/targets/horus/pwm_driver.cpp b/radio/src/targets/common/arm/stm32/analog_pwm_driver.cpp similarity index 82% rename from radio/src/targets/horus/pwm_driver.cpp rename to radio/src/targets/common/arm/stm32/analog_pwm_driver.cpp index d9ee519a6..6cc97af1e 100644 --- a/radio/src/targets/horus/pwm_driver.cpp +++ b/radio/src/targets/common/arm/stm32/analog_pwm_driver.cpp @@ -29,7 +29,7 @@ volatile uint32_t timer_capture_rising_time[4]; volatile uint32_t timer_capture_values[4][TIMESAMPLE_COUNT]; volatile uint8_t timer_capture_indexes[4]; -void pwmInit() +void analogPwmInit() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = PWM_GPIOA_PINS; @@ -75,56 +75,17 @@ inline uint32_t TIM_GetCapture(uint8_t n) inline void TIM_SetPolarityRising(uint8_t n) { - switch (n) { - case 0: - PWM_TIMER->CCER &= ~TIM_CCER_CC1P; - break; - case 1: - PWM_TIMER->CCER &= ~TIM_CCER_CC2P; - break; - case 2: - PWM_TIMER->CCER &= ~TIM_CCER_CC3P; - break; - case 3: - PWM_TIMER->CCER &= ~TIM_CCER_CC4P; - break; - } + PWM_TIMER->CCER &= ~(TIM_CCER_CC1P << (n * 4)); } inline void TIM_SetPolarityFalling(uint8_t n) { - switch (n) { - case 0: - PWM_TIMER->CCER |= TIM_CCER_CC1P; - break; - case 1: - PWM_TIMER->CCER |= TIM_CCER_CC2P; - break; - case 2: - PWM_TIMER->CCER |= TIM_CCER_CC3P; - break; - case 3: - PWM_TIMER->CCER |= TIM_CCER_CC4P; - break; - } + PWM_TIMER->CCER |= (TIM_CCER_CC1P << (n * 4)); } inline void TIM_ClearITPendingBit(uint8_t n) { - switch (n) { - case 0: - PWM_TIMER->SR = ~TIM_IT_CC1; - break; - case 1: - PWM_TIMER->SR = ~TIM_IT_CC2; - break; - case 2: - PWM_TIMER->SR = ~TIM_IT_CC3; - break; - case 3: - PWM_TIMER->SR = ~TIM_IT_CC4; - break; - } + PWM_TIMER->SR = ~(TIM_IT_CC1 << n); } inline uint32_t diff_with_16bits_overflow(uint32_t a, uint32_t b) @@ -160,7 +121,7 @@ extern "C" void PWM_IRQHandler(void) } } -void pwmRead(uint16_t * values) +void analogPwmRead(uint16_t * values) { uint32_t tmp[4]; @@ -186,7 +147,7 @@ void pwmRead(uint16_t * values) values[3] = tmp[2]; } -void pwmCheck() +void analogPwmCheck() { // I have ~1860 interrupts with only one stick if (pwm_interrupt_count < 1000) { diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 8e4316a8f..3d599330a 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -28,8 +28,8 @@ if (PCB STREQUAL X10) set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/audio_dac_driver.cpp - ../common/arm/stm32/adc_driver.cpp - pwm_driver.cpp + ../common/arm/stm32/analog_adc_driver.cpp + ../common/arm/stm32/analog_pwm_driver.cpp ) set(BITMAPS_TARGET x10_bitmaps) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 544ed9bd2..bd3b9b0f5 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -400,9 +400,9 @@ uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #if NUM_PWMANALOGS > 0 extern uint8_t analogs_pwm_disabled; #define ANALOGS_PWM_ENABLED() (analogs_pwm_disabled == false) -void pwmInit(void); -void pwmRead(uint16_t * values); -void pwmCheck(); +void analogPwmInit(void); +void analogPwmRead(uint16_t * values); +void analogPwmCheck(); extern volatile uint32_t pwm_interrupt_count; #endif diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 1a7b64209..84fb138a7 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -158,9 +158,16 @@ set(TARGET_SRC backlight_driver.cpp extmodule_driver.cpp ../common/arm/stm32/audio_dac_driver.cpp - ../common/arm/stm32/adc_driver.cpp + ../common/arm/stm32/analog_adc_driver.cpp ) +if(PCB STREQUAL XLITE) + set(TARGET_SRC + ${TARGET_SRC} + ../common/arm/stm32/analog_pwm_driver.cpp + ) +endif() + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 22f905460..45d31bdfc 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -157,7 +157,7 @@ void boardInit() SERIAL_RCC_AHB1Periph | TRAINER_RCC_AHB1Periph | HEARTBEAT_RCC_AHB1Periph | BT_RCC_AHB1Periph, ENABLE); - RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph | + RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph | ADC_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | HAPTIC_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph | TIMER_2MHz_RCC_APB1Periph | I2C_RCC_APB1Periph | SD_RCC_APB1Periph | TRAINER_RCC_APB1Periph | diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 7b79a49df..c65321d34 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -428,6 +428,16 @@ enum Analogs { #define NUM_XPOTS NUM_POTS #define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1) +#if defined(PCBXLITE) + #define NUM_PWMANALOGS 4 + extern uint8_t analogs_pwm_disabled; + #define ANALOGS_PWM_ENABLED() (analogs_pwm_disabled == false) + void analogPwmInit(void); + void analogPwmRead(uint16_t * values); + void analogPwmCheck(); + extern volatile uint32_t pwm_interrupt_count; +#endif + enum CalibratedAnalogs { CALIBRATED_STICK1, CALIBRATED_STICK2, diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 7aa0b06cd..f501b16a7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -388,6 +388,7 @@ #define ADC_SAMPTIME 2 // sample time = 28 cycles #if defined(PCBX9E) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 @@ -406,10 +407,10 @@ #define ADC_GPIO_PIN_SLIDER3 GPIO_Pin_6 // PA.06 #define ADC_GPIO_PIN_SLIDER4 GPIO_Pin_1 // PB.01 #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 - #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_SLIDER3) - #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SLIDER4) - #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_POT4 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT) - #define ADC_GPIOF_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2) + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_SLIDER3) + #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SLIDER4) + #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_POT4 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT) + #define ADC_GPIOF_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2) #define ADC_CHANNEL_POT1 ADC_Channel_6 // ADC3_IN6 #define ADC_CHANNEL_POT2 ADC_Channel_8 // ADC1_IN8 #define ADC_CHANNEL_POT3 ADC_Channel_15 // ADC1_IN15 @@ -427,6 +428,7 @@ #define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles #elif defined(PCBX9DP) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 @@ -453,11 +455,17 @@ #define ADC_CHANNEL_BATT ADC_Channel_10 #elif defined(PCBXLITE) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph RCC_APB1Periph_TIM5 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 + #define PWM_TIMER TIM5 + #define PWM_GPIO GPIOA + #define PWM_GPIO_AF GPIO_AF_TIM5 + #define PWM_IRQHandler TIM5_IRQHandler + #define PWM_IRQn TIM5_IRQn #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 @@ -465,7 +473,9 @@ #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 #define ADC_GPIO_PIN_POT2 GPIO_Pin_2 // PC.02 #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 - #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1) + #define STICKS_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) + #define PWM_GPIOA_PINS STICKS_GPIOA_PINS + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_POT1 | (ANALOGS_PWM_ENABLED() ? 0 : STICKS_GPIOA_PINS)) #define ADC_GPIOB_PINS ADC_GPIO_PIN_POT2 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT #define ADC_CHANNEL_POT1 ADC_Channel_6 @@ -473,6 +483,7 @@ #define ADC_CHANNEL_BATT ADC_Channel_10 #elif defined(PCBX7) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 @@ -493,6 +504,7 @@ #define ADC_CHANNEL_BATT ADC_Channel_10 #else #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 4eb02aa99..0f8cf3e43 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -70,7 +70,7 @@ void intmoduleSendNextFrame() INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) - else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) { + else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) { INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2; INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance