mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #1150 from ohagendorf/stm32f4_pwm_frequency
STM32F4xx - correction of PWM frequency calculationpull/1149/merge
commit
83c82b06fc
|
@ -165,7 +165,9 @@ void pwmout_period_ms(pwmout_t* obj, int ms)
|
||||||
void pwmout_period_us(pwmout_t* obj, int us)
|
void pwmout_period_us(pwmout_t* obj, int us)
|
||||||
{
|
{
|
||||||
TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
|
TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
|
||||||
|
RCC_ClkInitTypeDef RCC_ClkInitStruct;
|
||||||
|
uint32_t PclkFreq;
|
||||||
|
uint32_t APBxCLKDivider;
|
||||||
float dc = pwmout_read(obj);
|
float dc = pwmout_read(obj);
|
||||||
|
|
||||||
__HAL_TIM_DISABLE(&TimHandle);
|
__HAL_TIM_DISABLE(&TimHandle);
|
||||||
|
@ -173,8 +175,75 @@ void pwmout_period_us(pwmout_t* obj, int us)
|
||||||
// Update the SystemCoreClock variable
|
// Update the SystemCoreClock variable
|
||||||
SystemCoreClockUpdate();
|
SystemCoreClockUpdate();
|
||||||
|
|
||||||
|
HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &PclkFreq);
|
||||||
|
|
||||||
|
switch (obj->pwm) {
|
||||||
|
|
||||||
|
case PWM_1:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK2Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB2CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PWM_2:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK1Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB1CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PWM_3:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK1Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB1CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PWM_4:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK1Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB1CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if defined(TIM8_BASE)
|
||||||
|
case PWM_8:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK2Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB2CLKDivider;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case PWM_9:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK2Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB2CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PWM_10:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK2Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB2CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PWM_11:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK2Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB2CLKDivider;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if defined(TIM13_BASE)
|
||||||
|
case PWM_13:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK1Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB1CLKDivider;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(TIM14_BASE)
|
||||||
|
case PWM_14:
|
||||||
|
PclkFreq = HAL_RCC_GetPCLK1Freq();
|
||||||
|
APBxCLKDivider = RCC_ClkInitStruct.APB1CLKDivider;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
TimHandle.Init.Period = us - 1;
|
TimHandle.Init.Period = us - 1;
|
||||||
TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
|
if (APBxCLKDivider == RCC_HCLK_DIV1)
|
||||||
|
TimHandle.Init.Prescaler = (uint16_t)((PclkFreq*2) / 1000000) - 1; // 1 µs tick
|
||||||
|
else
|
||||||
|
TimHandle.Init.Prescaler = (uint16_t)((PclkFreq) / 1000000) - 1; // 1 µs tick
|
||||||
TimHandle.Init.ClockDivision = 0;
|
TimHandle.Init.ClockDivision = 0;
|
||||||
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
|
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
HAL_TIM_PWM_Init(&TimHandle);
|
HAL_TIM_PWM_Init(&TimHandle);
|
||||||
|
|
Loading…
Reference in New Issue