33 uint32_t clock_freq = 0;
35#if defined(STM32F0) || defined(STM32G0)
37 clock_freq = HAL_RCC_GetHCLKFreq();
42 return ErrorCode::ARG_ERR;
46 htim_->Instance == TIM1 ||
49 htim_->Instance == TIM8 ||
52 htim_->Instance == TIM9 ||
55 htim_->Instance == TIM10 ||
58 htim_->Instance == TIM11 ||
61 htim_->Instance == TIM15 ||
64 htim_->Instance == TIM16 ||
67 htim_->Instance == TIM17 ||
70 htim_->Instance == TIM20 ||
74 clock_freq = HAL_RCC_GetPCLK2Freq();
76 if ((RCC->CFGR & RCC_CFGR_PPRE2) != RCC_CFGR_PPRE2_DIV1)
84 htim_->Instance == TIM2 ||
87 htim_->Instance == TIM3 ||
90 htim_->Instance == TIM4 ||
93 htim_->Instance == TIM5 ||
96 htim_->Instance == TIM6 ||
99 htim_->Instance == TIM7 ||
102 htim_->Instance == TIM12 ||
105 htim_->Instance == TIM13 ||
108 htim_->Instance == TIM14 ||
112 clock_freq = HAL_RCC_GetPCLK1Freq();
114 if ((RCC->CFGR & RCC_CFGR_PPRE1) != RCC_CFGR_PPRE1_DIV1)
122 return ErrorCode::NOT_SUPPORT;
128 return ErrorCode::INIT_ERR;
133 uint32_t prescaler = 1;
136 for (prescaler = 1; prescaler <= 0xFFFF; ++prescaler)
138 uint32_t temp_period = clock_freq / (prescaler * config.
frequency);
139 if (temp_period <= 0x10000)
141 period = temp_period;
147 if (!found || period == 0)
149 return ErrorCode::INIT_ERR;
152 htim_->Init.Prescaler = prescaler - 1;
153 htim_->Init.Period = period - 1;
155 if (HAL_TIM_PWM_Init(htim_) != HAL_OK)
157 return ErrorCode::INIT_ERR;
159 return ErrorCode::OK;