void Timer_t::InitPwm(GPIO_TypeDef *GPIO, uint16_t N, uint8_t Chnl, uint32_t ATopValue, Inverted_t Inverted, PinOutMode_t OutputType) { // GPIO #if defined STM32L1XX if (ITmr == TIM2) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF1); else if(ANY_OF_2(ITmr, TIM3, TIM4)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF2); else if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF3); #elif defined STM32F0XX if (ITmr == TIM1) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF2); else if(ITmr == TIM3) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF1); else if(ITmr == TIM14) { if(GPIO == GPIOA) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF4); else PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF0); } #ifdef TIM15 else if(ITmr == TIM15) { if(GPIO == GPIOA) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF0); else PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF1); } #endif else if(ITmr == TIM16 or ITmr == TIM17) { if(GPIO == GPIOA) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF5); else PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF2); } #elif defined STM32F2XX || defined STM32F4XX if(ANY_OF_2(ITmr, TIM1, TIM2)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF1); else if(ANY_OF_3(ITmr, TIM3, TIM4, TIM5)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF2); else if(ANY_OF_4(ITmr, TIM8, TIM9, TIM10, TIM11)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF3); else if(ANY_OF_3(ITmr, TIM12, TIM13, TIM14)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF9); #elif defined STM32F100_MCUCONF PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF0); // Alternate function is dummy // ITmr->BDTR = 0xC000; // Main output Enable #endif #if !defined STM32L151xB ITmr->BDTR = 0xC000; // Main output Enable #endif ITmr->ARR = ATopValue; // Output uint16_t tmp = (Inverted == invInverted)? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: ITmr->CCMR1 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC1E; break; case 2: ITmr->CCMR1 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC2E; break; case 3: ITmr->CCMR2 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC3E; break; case 4: ITmr->CCMR2 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC4E; break; default: break; } }
void Timer_t::InitPwm(GPIO_TypeDef *GPIO, uint16_t N, uint8_t Chnl, uint32_t ATopValue, Inverted_t Inverted, PinOutMode_t OutputType) { // GPIO if (ITmr == TIM2) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF1); else if(ANY_OF_2(ITmr, TIM3, TIM4)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF2); else if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PinSetupAlterFunc(GPIO, N, OutputType, pudNone, AF3); ITmr->ARR = ATopValue; // Output uint16_t tmp = (Inverted == invInverted)? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: ITmr->CCMR1 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC1E; break; case 2: ITmr->CCMR1 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC2E; break; case 3: ITmr->CCMR2 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC3E; break; case 4: ITmr->CCMR2 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC4E; break; default: break; } }
void Timer_t::InitPwm(GPIO_TypeDef *GPIO, uint16_t N, uint8_t Chnl, Inverted_t Inverted, const PinSpeed_t ASpeed) { // GPIO if (ITmr == TIM2) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1, ASpeed); else if(ANY_OF_2(ITmr, TIM3, TIM4)) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2, ASpeed); else if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3, ASpeed); // Output uint16_t tmp = (Inverted == invInverted)? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: PCCR = &ITmr->CCR1; ITmr->CCMR1 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC1E; break; case 2: PCCR = &ITmr->CCR2; ITmr->CCMR1 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC2E; break; case 3: PCCR = &ITmr->CCR3; ITmr->CCMR2 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC3E; break; case 4: PCCR = &ITmr->CCR4; ITmr->CCMR2 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC4E; break; default: break; } }
void Timer_t::SetUpdateFrequency(uint32_t FreqHz) { #if defined STM32F2XX || defined STM32F4XX if(ANY_OF_5(ITmr, TIM1, TIM8, TIM9, TIM10, TIM11)) // APB2 is clock src SetTopValue((*PClk * Clk.TimerAPB2ClkMulti) / FreqHz); else // APB1 is clock src SetTopValue((*PClk * Clk.TimerAPB1ClkMulti) / FreqHz); #elif defined STM32L1XX uint32_t TopVal; if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) // APB2 is clock src TopVal = ((*PClk * Clk.Timer9_11ClkMulti) / FreqHz) - 1; else TopVal = ((*PClk * Clk.Timer2_7ClkMulti) / FreqHz) - 1; // Uart.Printf("Topval = %u\r", TopVal); SetTopValue(TopVal); #else // uint32_t UpdFreqMax = *PClk / (ITmr->ARR + 1); #endif ITmr->CNT = 0; // Reset counter to start from scratch //#if defined STM32F2XX || defined STM32F4XX // uint32_t UpdFreqMax; // if(ANY_OF_5(ITmr, TIM1, TIM8, TIM9, TIM10, TIM11)) // APB2 is clock src // UpdFreqMax = (*PClk) * Clk.TimerAPB2ClkMulti / (ITmr->ARR + 1); // else // APB1 is clock src // UpdFreqMax = (*PClk) * Clk.TimerAPB1ClkMulti / (ITmr->ARR + 1); //#else // uint32_t UpdFreqMax = *PClk / (ITmr->ARR + 1); //#endif // uint32_t div = UpdFreqMax / FreqHz; // if(div != 0) div--; // ITmr->PSC = div; // Uart.Printf("\r FMax=%u; div=%u", UpdFreqMax, div); }
void Timer_t::Init() { #if defined STM32L1XX if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } else if(ITmr == TIM7) { rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } #elif defined STM32F0XX if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } #ifdef TIM6 else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } #endif else if(ITmr == TIM14) { RCC->APB1ENR |= RCC_APB1ENR_TIM14EN; } #ifdef TIM15 else if(ITmr == TIM15) { RCC->APB2ENR |= RCC_APB2ENR_TIM15EN; } #endif else if(ITmr == TIM16) { RCC->APB2ENR |= RCC_APB2ENR_TIM16EN; } else if(ITmr == TIM17) { RCC->APB2ENR |= RCC_APB2ENR_TIM17EN; } // Clock src PClk = &Clk.APBFreqHz; #elif defined STM32F2XX || defined STM32F4XX if(ANY_OF_5(ITmr, TIM1, TIM8, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM5) { rccEnableTIM5(FALSE); } else if(ITmr == TIM6) { rccEnableTIM6(FALSE); } else if(ITmr == TIM7) { rccEnableTIM7(FALSE); } else if(ITmr == TIM8) { rccEnableTIM8(FALSE); } else if(ITmr == TIM9) { rccEnableTIM9(FALSE); } else if(ITmr == TIM10) { RCC->APB2ENR |= RCC_APB2ENR_TIM10EN; } else if(ITmr == TIM11) { rccEnableTIM11(FALSE); } else if(ITmr == TIM12) { rccEnableTIM12(FALSE); } else if(ITmr == TIM13) { RCC->APB1ENR |= RCC_APB1ENR_TIM13EN; } else if(ITmr == TIM14) { rccEnableTIM14(FALSE); } #elif defined STM32F10X_LD_VL if(ANY_OF_4(ITmr, TIM1, TIM15, TIM16, TIM17)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM15) { RCC->APB2ENR |= RCC_APB2ENR_TIM15EN; } else if(ITmr == TIM16) { RCC->APB2ENR |= RCC_APB2ENR_TIM16EN; } else if(ITmr == TIM17) { RCC->APB2ENR |= RCC_APB2ENR_TIM17EN; } #endif }
void Timer_t::Init() { if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } else if(ITmr == TIM7) { rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } }
void Timer_t::PwmInit(GPIO_TypeDef *GPIO, uint16_t N, uint8_t Chnl, Inverted_t Inverted) { // GPIO if (ANY_OF_2(ITmr, TIM1, TIM2)) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1); else if(ANY_OF_3(ITmr, TIM3, TIM4, TIM5)) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); else if(ANY_OF_4(ITmr, TIM8, TIM9, TIM10, TIM11)) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); else if(ANY_OF_3(ITmr, TIM12, TIM13, TIM14)) PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); // Enable outputs for advanced timers ITmr->BDTR = TIM_BDTR_MOE | TIM_BDTR_AOE; // Output uint16_t tmp = (Inverted == invInverted)? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: PCCR = &ITmr->CCR1; ITmr->CCMR1 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC1E; break; case 2: PCCR = &ITmr->CCR2; ITmr->CCMR1 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC2E; break; case 3: PCCR = &ITmr->CCR3; ITmr->CCMR2 |= (tmp << 4); ITmr->CCER |= TIM_CCER_CC3E; break; case 4: PCCR = &ITmr->CCR4; ITmr->CCMR2 |= (tmp << 12); ITmr->CCER |= TIM_CCER_CC4E; break; default: break; } }
void Timer_t::Init(TIM_TypeDef* Tmr) { ITmr = Tmr; if (ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } else if(ITmr == TIM7) { rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } // Clock src if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; }
void PwmPin_t::Init(GPIO_TypeDef *GPIO, uint16_t N, TIM_TypeDef* PTim, uint8_t Chnl, uint16_t TopValue, bool Inverted) { Tim = PTim; if(Tim == TIM2) { rccEnableTIM2(FALSE); PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1); } else if(Tim == TIM3) { rccEnableTIM3(FALSE); PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); } else if(Tim == TIM4) { rccEnableTIM4(FALSE); PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); } else if(Tim == TIM9) { rccEnableTIM9(FALSE); PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); } else if(Tim == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); } else if(Tim == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); } // Clock src if(ANY_OF_3(Tim, TIM2, TIM3, TIM4)) PClk = &Clk.APB1FreqHz; else PClk = &Clk.APB2FreqHz; // Common Tim->CR1 = TIM_CR1_CEN; // Enable timer, set clk division to 0, AutoReload not buffered Tim->CR2 = 0; Tim->ARR = TopValue; // Output uint16_t tmp = Inverted? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: PCCR = &Tim->CCR1; Tim->CCMR1 |= (tmp << 4); Tim->CCER |= TIM_CCER_CC1E; break; case 2: PCCR = &Tim->CCR2; Tim->CCMR1 |= (tmp << 12); Tim->CCER |= TIM_CCER_CC2E; break; case 3: PCCR = &Tim->CCR3; Tim->CCMR2 |= (tmp << 4); Tim->CCER |= TIM_CCER_CC3E; break; case 4: PCCR = &Tim->CCR4; Tim->CCMR2 |= (tmp << 12); Tim->CCER |= TIM_CCER_CC4E; break; default: break; } *PCCR = 0; }