38 uint32_t clock_freq = 0;
40#if defined(STM32F0) || defined(STM32G0)
42 clock_freq = HAL_RCC_GetHCLKFreq();
47 return ErrorCode::ARG_ERR;
51 htim_->Instance == TIM1 ||
54 htim_->Instance == TIM8 ||
57 htim_->Instance == TIM9 ||
60 htim_->Instance == TIM10 ||
63 htim_->Instance == TIM11 ||
66 htim_->Instance == TIM15 ||
69 htim_->Instance == TIM16 ||
72 htim_->Instance == TIM17 ||
75 htim_->Instance == TIM20 ||
79 clock_freq = HAL_RCC_GetPCLK2Freq();
81 if ((RCC->CFGR & RCC_CFGR_PPRE2) != RCC_CFGR_PPRE2_DIV1)
89 htim_->Instance == TIM2 ||
92 htim_->Instance == TIM3 ||
95 htim_->Instance == TIM4 ||
98 htim_->Instance == TIM5 ||
101 htim_->Instance == TIM6 ||
104 htim_->Instance == TIM7 ||
107 htim_->Instance == TIM12 ||
110 htim_->Instance == TIM13 ||
113 htim_->Instance == TIM14 ||
117 clock_freq = HAL_RCC_GetPCLK1Freq();
119 if ((RCC->CFGR & RCC_CFGR_PPRE1) != RCC_CFGR_PPRE1_DIV1)
127 return ErrorCode::NOT_SUPPORT;
133 return ErrorCode::INIT_ERR;
138 uint32_t prescaler = 1;
141 for (prescaler = 1; prescaler <= 0xFFFF; ++prescaler)
143 uint32_t temp_period = clock_freq / (prescaler * config.
frequency);
144 if (temp_period <= 0x10000)
146 period = temp_period;
152 if (!found || period == 0)
154 return ErrorCode::INIT_ERR;
157 htim_->Init.Prescaler = prescaler - 1;
158 htim_->Init.Period = period - 1;
160 if (HAL_TIM_PWM_Init(htim_) != HAL_OK)
162 return ErrorCode::INIT_ERR;
165 return ErrorCode::OK;