static pwmOutputPort_t *pwmOutConfig(const timerHardware_t *timerHardware, uint8_t mhz, uint16_t period, uint16_t value) { pwmOutputPort_t *p = &pwmOutputPorts[allocatedOutputPortCount++]; configTimeBase(timerHardware->tim, period, mhz); pwmGPIOConfig(timerHardware->gpio, timerHardware->pin, Mode_AF_PP); pwmOCConfig(timerHardware->tim, timerHardware->channel, value); if (timerHardware->outputEnable) TIM_CtrlPWMOutputs(timerHardware->tim, ENABLE); TIM_Cmd(timerHardware->tim, ENABLE); switch (timerHardware->channel) { case TIM_Channel_1: p->ccr = &timerHardware->tim->CCR1; break; case TIM_Channel_2: p->ccr = &timerHardware->tim->CCR2; break; case TIM_Channel_3: p->ccr = &timerHardware->tim->CCR3; break; case TIM_Channel_4: p->ccr = &timerHardware->tim->CCR4; break; } p->period = period; p->tim = timerHardware->tim; return p; }
static pwmPortData_t *pwmInConfig(uint8_t port, pwmCallbackPtr callback, uint8_t channel) { pwmPortData_t *p = &pwmPorts[port]; pwmTimeBase(timerHardware[port].tim, 0xFFFF); pwmGPIOConfig(timerHardware[port].gpio, timerHardware[port].pin, 1); pwmICConfig(timerHardware[port].tim, timerHardware[port].channel, TIM_ICPolarity_Rising); TIM_Cmd(timerHardware[port].tim, ENABLE); pwmNVICConfig(timerHardware[port].irq); // set callback before configuring interrupts p->callback = callback; p->channel = channel; switch (timerHardware[port].channel) { case TIM_Channel_1: TIM_ITConfig(timerHardware[port].tim, TIM_IT_CC1, ENABLE); break; case TIM_Channel_2: TIM_ITConfig(timerHardware[port].tim, TIM_IT_CC2, ENABLE); break; case TIM_Channel_3: TIM_ITConfig(timerHardware[port].tim, TIM_IT_CC3, ENABLE); break; case TIM_Channel_4: TIM_ITConfig(timerHardware[port].tim, TIM_IT_CC4, ENABLE); break; } return p; }
static pwmPortData_t *pwmOutConfig(uint8_t port, uint16_t period, uint16_t value) { pwmPortData_t *p = &pwmPorts[port]; pwmTimeBase(timerHardware[port].tim, period); pwmGPIOConfig(timerHardware[port].gpio, timerHardware[port].pin, 0); pwmOCConfig(timerHardware[port].tim, timerHardware[port].channel, value); // Needed only on TIM1 if (timerHardware[port].outputEnable) TIM_CtrlPWMOutputs(timerHardware[port].tim, ENABLE); TIM_Cmd(timerHardware[port].tim, ENABLE); switch (timerHardware[port].channel) { case TIM_Channel_1: p->ccr = &timerHardware[port].tim->CCR1; break; case TIM_Channel_2: p->ccr = &timerHardware[port].tim->CCR2; break; case TIM_Channel_3: p->ccr = &timerHardware[port].tim->CCR3; break; case TIM_Channel_4: p->ccr = &timerHardware[port].tim->CCR4; break; } return p; }
void ppmInConfig(const timerHardware_t *timerHardwarePtr) { ppmInit(); pwmInputPort_t *p = &pwmInputPorts[FIRST_PWM_PORT]; p->mode = INPUT_MODE_PPM; p->timerHardware = timerHardwarePtr; pwmGPIOConfig(timerHardwarePtr->gpio, timerHardwarePtr->pin, timerHardwarePtr->gpioInputMode); pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising); timerConfigure(timerHardwarePtr, PPM_TIMER_PERIOD, PWM_TIMER_MHZ); configureTimerCaptureCompareInterrupt(timerHardwarePtr, UNUSED_PPM_TIMER_REFERENCE, ppmEdgeCallback, ppmOverflowCallback); }
static pwmPortData_t *pwmInConfig(uint8_t port, timerCCCallbackPtr callback, uint8_t channel) { pwmPortData_t *p = &pwmPorts[port]; const timerHardware_t *timerHardwarePtr = &(timerHardware[port]); p->channel = channel; pwmGPIOConfig(timerHardwarePtr->gpio, timerHardwarePtr->pin, Mode_IPD); pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising); timerInConfig(timerHardwarePtr, 0xFFFF, PWM_TIMER_MHZ); configureTimerCaptureCompareInterrupt(timerHardwarePtr, port, callback); return p; }
void ppmInConfig(const timerHardware_t *timerHardwarePtr) { ppmInit(); pwmInputPort_t *self = &pwmInputPorts[FIRST_PWM_PORT]; self->mode = INPUT_MODE_PPM; self->timerHardware = timerHardwarePtr; pwmGPIOConfig(timerHardwarePtr->gpio, timerHardwarePtr->pin, timerHardwarePtr->gpioInputMode); pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising); timerConfigure(timerHardwarePtr, (uint16_t)PPM_TIMER_PERIOD, PWM_TIMER_MHZ); timerChCCHandlerInit(&self->edgeCb, ppmEdgeCallback); timerChOvrHandlerInit(&self->overflowCb, ppmOverflowCallback); timerChConfigCallbacks(timerHardwarePtr, &self->edgeCb, &self->overflowCb); }
void pwmInConfig(const timerHardware_t *timerHardwarePtr, uint8_t channel) { pwmInputPort_t *self = &pwmInputPorts[channel]; self->state = 0; self->missedEvents = 0; self->channel = channel; self->mode = INPUT_MODE_PWM; self->timerHardware = timerHardwarePtr; pwmGPIOConfig(timerHardwarePtr->gpio, timerHardwarePtr->pin, timerHardwarePtr->gpioInputMode); pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising); timerConfigure(timerHardwarePtr, (uint16_t)PWM_TIMER_PERIOD, PWM_TIMER_MHZ); timerChCCHandlerInit(&self->edgeCb, pwmEdgeCallback); timerChOvrHandlerInit(&self->overflowCb, pwmOverflowCallback); timerChConfigCallbacks(timerHardwarePtr, &self->edgeCb, &self->overflowCb); }
void pwmInConfig(const timerHardware_t *timerHardwarePtr, uint8_t channel) { pwmInputPort_t *p = &pwmInputPorts[channel]; p->state = 0; p->missedEvents = 0; p->channel = channel; p->mode = INPUT_MODE_PWM; p->timerHardware = timerHardwarePtr; pwmGPIOConfig(timerHardwarePtr->gpio, timerHardwarePtr->pin, timerHardwarePtr->gpioInputMode); pwmICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Rising); timerConfigure(timerHardwarePtr, PWM_TIMER_PERIOD, PWM_TIMER_MHZ); #ifdef STM32F303xC // If overflow monitoring is enabled on STM32F3 then the IRQ handler TIM1_UP_TIM16_IRQHandler is continually called. if (timerHardwarePtr->tim == TIM1) { configureTimerCaptureCompareInterrupt(timerHardwarePtr, channel, pwmEdgeCallback, NULL); return; } #endif configureTimerCaptureCompareInterrupt(timerHardwarePtr, channel, pwmEdgeCallback, pwmOverflowCallback); }