#include "ppmsum.h" PPMSum* PPMSum::self = 0; template<> void interrupt() { PPMSum::self->irq(); } void PPMSum::irq() { int16_t sr = TIM4.SR; TIM4.SR = 0; if(sr & 0x06) { GPIOA.ODR = 1 << 5; } else { GPIOA.ODR = 0; } if(sr & 0x01) { // Timeout. // TODO: Indicate failsafe. } else if(sr & 0x02) { // Period. if(TIM4.CCR1 > 5000) { index = 0; } else { index++; } } else if(sr & 0x04) { // Pulsewidth. channels[index] = TIM4.CCR2; } } void PPMSum::enable() { RCC.enable(RCC.TIM4); TIM4.PSC = 72; TIM4.CCMR1 = 0x0201; TIM4.SMCR = 0x54; TIM4.CCER = 0x31; TIM4.DIER = 0x07; Interrupt::enable(Interrupt::TIM4); TIM4.CR1 = 0x05; }