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