mbed library sources(for async_print)

Dependents:   AsyncPrint

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Wed Jun 03 08:00:08 2015 +0100
Parent:
554:edd95c0879f8
Child:
556: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);