diff --git a/radio/src/dmafifo.h b/radio/src/dmafifo.h index d4aaef4d3..16e3e7892 100644 --- a/radio/src/dmafifo.h +++ b/radio/src/dmafifo.h @@ -43,6 +43,11 @@ class DMAFifo return N; } + uint8_t last(int index) + { + return fifo[(2*N - stream->NDTR - index) & (N-1)]; + } + bool isEmpty() { #if defined(SIMU) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index e271b873b..efb4afa92 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -51,33 +51,31 @@ void init2MhzTimer() // Starts TIMER at 1000Hz void init1msTimer() { - INTERRUPT_5MS_TIMER->ARR = 999; // 1mS - INTERRUPT_5MS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS from 30MHz - INTERRUPT_5MS_TIMER->CCER = 0; - INTERRUPT_5MS_TIMER->CCMR1 = 0; - INTERRUPT_5MS_TIMER->EGR = 0; - INTERRUPT_5MS_TIMER->CR1 = 5; - INTERRUPT_5MS_TIMER->DIER |= 1; - NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn); - NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 7); + INTERRUPT_1MS_TIMER->ARR = 999; // 1mS + INTERRUPT_1MS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS from 30MHz + INTERRUPT_1MS_TIMER->CCER = 0; + INTERRUPT_1MS_TIMER->CCMR1 = 0; + INTERRUPT_1MS_TIMER->EGR = 0; + INTERRUPT_1MS_TIMER->CR1 = 5; + INTERRUPT_1MS_TIMER->DIER |= 1; + NVIC_EnableIRQ(INTERRUPT_1MS_IRQn); + NVIC_SetPriority(INTERRUPT_1MS_IRQn, 7); } // TODO use the same than board_sky9x.cpp void interrupt1ms() { - static uint32_t pre_scale; // Used to get 10 Hz counter + static uint8_t pre_scale; // Used to get 10 Hz counter ++pre_scale; - if (pre_scale == 5 || pre_scale == 10) { - #if defined(HAPTIC) + if (pre_scale == 5 || pre_scale == 10) { DEBUG_TIMER_START(debugTimerHaptic); HAPTIC_HEARTBEAT(); DEBUG_TIMER_STOP(debugTimerHaptic); -#endif - } +#endif if (pre_scale == 10) { pre_scale = 0; @@ -89,11 +87,20 @@ void interrupt1ms() DEBUG_TIMER_START(debugTimerRotEnc); checkRotaryEncoder(); DEBUG_TIMER_STOP(debugTimerRotEnc); + +#if defined(LUA) + if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && outputTelemetryBufferTrigger && outputTelemetryBufferSize > 0) { + if (telemetryFifo.last(-2) == 0x7E && telemetryFifo.last(-1) == outputTelemetryBufferTrigger) { + outputTelemetryBufferTrigger = 0; + sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); + } + } +#endif } -extern "C" void TIM8_TRG_COM_TIM14_IRQHandler() +extern "C" void INTERRUPT_1MS_IRQHandler() { - TIM14->SR &= ~TIM_SR_UIF; + INTERRUPT_1MS_TIMER->SR &= ~TIM_SR_UIF; interrupt1ms(); DEBUG_INTERRUPT(INT_1MS); } @@ -120,7 +127,7 @@ void boardInit() GPS_RCC_AHB1Periph, ENABLE); - RCC_APB1PeriphClockCmd(INTERRUPT_5MS_RCC_APB1Periph | + RCC_APB1PeriphClockCmd(INTERRUPT_1MS_RCC_APB1Periph | TIMER_2MHz_RCC_APB1Periph | AUDIO_RCC_APB1Periph | SERIAL_RCC_APB1Periph | diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 26a44eb38..5883f5dd3 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -399,11 +399,11 @@ #define TRAINER_DMA_FLAG_TC DMA_IT_TCIF2 #define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) -// 5ms Interrupt -#define INTERRUPT_5MS_RCC_APB1Periph RCC_APB1Periph_TIM14 -#define INTERRUPT_5MS_TIMER TIM14 -#define INTERRUPT_5MS_IRQn TIM8_TRG_COM_TIM14_IRQn -#define INTERRUPT_5MS_IRQHandler TIM8_TRG_COM_TIM14_IRQHandler +// 1ms Interrupt +#define INTERRUPT_1MS_RCC_APB1Periph RCC_APB1Periph_TIM14 +#define INTERRUPT_1MS_TIMER TIM14 +#define INTERRUPT_1MS_IRQn TIM8_TRG_COM_TIM14_IRQn +#define INTERRUPT_1MS_IRQHandler TIM8_TRG_COM_TIM14_IRQHandler // 2MHz Timer #define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7