Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: SANFAN_read_analog_value nucleo-wdg Nucleo_sleep_copy
Fork of mbed-src by
Diff: targets/hal/TARGET_STM/TARGET_STM32F4/pwmout_api.c
- Revision:
- 555:f8b0f61305ee
- Parent:
- 511:532f83b66a7f
- Child:
- 605:ded2017be6ab
diff -r edd95c0879f8 -r f8b0f61305ee targets/hal/TARGET_STM/TARGET_STM32F4/pwmout_api.c
--- a/targets/hal/TARGET_STM/TARGET_STM32F4/pwmout_api.c Mon Jun 01 11:00:11 2015 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32F4/pwmout_api.c Wed Jun 03 08:00:08 2015 +0100
@@ -165,7 +165,9 @@
void pwmout_period_us(pwmout_t* obj, int us)
{
TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
-
+ RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ uint32_t PclkFreq;
+ uint32_t APBxCLKDivider;
float dc = pwmout_read(obj);
__HAL_TIM_DISABLE(&TimHandle);
@@ -173,8 +175,75 @@
// Update the SystemCoreClock variable
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.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.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&TimHandle);
