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: mbed_blinky-bmd-200 bmd-200_accel_demo firstRig
Fork of mbed-src by
Revision 559:f8b0f61305ee, committed 2015-06-03
- Comitter:
- mbed_official
- Date:
- Wed Jun 03 08:00:08 2015 +0100
- Parent:
- 558:edd95c0879f8
- Child:
- 560:a217bc785985
- Commit message:
- Synchronized with git revision 83c82b06fc79b3e947188af439ae26eb9eda623e
Full URL: https://github.com/mbedmicro/mbed/commit/83c82b06fc79b3e947188af439ae26eb9eda623e/
STM32F4xx - correction of PWM frequency calculation
Changed in this revision
| targets/hal/TARGET_STM/TARGET_STM32F4/pwmout_api.c | Show annotated file Show diff for this revision Revisions of this file |
--- 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);
