#include "ppmsum.h" #include "rcc.h" PPMSum* PPMSum::self = 0; template<> void interrupt() { PPMSum::self->irq(); } template<> void interrupt() { PPMSum::self->irq(); } void PPMSum::irq() { int16_t sr = TIM1.SR; TIM1.SR = 0; if(sr & 0x01) { // Timeout. synced = false; } else if(sr & 0x02) { // Period. if(TIM1.CCR1 > 5000) { synced = true; index = 0; } else { index++; index &= 0xf; } } else if(sr & 0x04) { // Pulsewidth. channels[index] = TIM1.CCR2; } } void PPMSum::enable() { RCC.enable(RCC.TIM1); TIM1.PSC = 72; TIM1.CCMR1 = 0x0201; TIM1.SMCR = 0x54; TIM1.CCER = 0x31; TIM1.DIER = 0x07; Interrupt::enable(Interrupt::TIM1_UP); Interrupt::enable(Interrupt::TIM1_CC); TIM1.CR1 = 0x05; }