mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Revision:
582:a89625bcd809
Parent:
573:ad23fe03a082
Child:
596:abfb2833c9f5
--- a/targets/hal/TARGET_STM/TARGET_STM32F7/pwmout_api.c	Thu Jul 02 16:30:08 2015 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32F7/pwmout_api.c	Mon Jul 06 09:00:34 2015 +0100
@@ -54,22 +54,16 @@
     }
 
     // Enable TIM clock
-    if (obj->pwm == PWM_1) __TIM1_CLK_ENABLE();
-    if (obj->pwm == PWM_2) __TIM2_CLK_ENABLE();
-    if (obj->pwm == PWM_3) __TIM3_CLK_ENABLE();
-    if (obj->pwm == PWM_4) __TIM4_CLK_ENABLE();
-#if defined(TIM8_BASE)
-    if (obj->pwm == PWM_8) __TIM8_CLK_ENABLE();
-#endif
-    if (obj->pwm == PWM_9) __TIM9_CLK_ENABLE();
-    if (obj->pwm == PWM_10) __TIM10_CLK_ENABLE();
-    if (obj->pwm == PWM_11) __TIM11_CLK_ENABLE();
-#if defined(TIM13_BASE)
-    if (obj->pwm == PWM_13) __TIM13_CLK_ENABLE();
-#endif
-#if defined(TIM14_BASE)
-    if (obj->pwm == PWM_14) __TIM14_CLK_ENABLE();
-#endif
+    if (obj->pwm ==  PWM_1) __HAL_RCC_TIM1_CLK_ENABLE();
+    if (obj->pwm ==  PWM_2) __HAL_RCC_TIM2_CLK_ENABLE();
+    if (obj->pwm ==  PWM_3) __HAL_RCC_TIM3_CLK_ENABLE();
+    if (obj->pwm ==  PWM_4) __HAL_RCC_TIM4_CLK_ENABLE();
+    if (obj->pwm ==  PWM_8) __HAL_RCC_TIM8_CLK_ENABLE();
+    if (obj->pwm ==  PWM_9) __HAL_RCC_TIM9_CLK_ENABLE();
+    if (obj->pwm == PWM_10) __HAL_RCC_TIM10_CLK_ENABLE();
+    if (obj->pwm == PWM_11) __HAL_RCC_TIM11_CLK_ENABLE();
+    if (obj->pwm == PWM_13) __HAL_RCC_TIM13_CLK_ENABLE();
+    if (obj->pwm == PWM_14) __HAL_RCC_TIM14_CLK_ENABLE();
 
     // Configure GPIO
     pinmap_pinout(pin, PinMap_PWM);
@@ -91,7 +85,6 @@
 {
     TIM_OC_InitTypeDef sConfig;
     int channel = 0;
-    int complementary_channel = 0;
 
     TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
 
@@ -112,31 +105,28 @@
     sConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
     sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 
-    complementary_channel = obj->inverted;
     switch (obj->channel) {
-
         case 1:
             channel = TIM_CHANNEL_1;
             break;
-
         case 2:
             channel = TIM_CHANNEL_2;
             break;
-
         case 3:
             channel = TIM_CHANNEL_3;
             break;
-
         case 4:
             channel = TIM_CHANNEL_4;
             break;
-
         default:
             return;
     }
 
-    HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, channel);
-    if (complementary_channel) {
+    if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, channel) != HAL_OK) {
+        error("Cannot configure PWM channel");
+    }
+
+    if (obj->inverted) {
         HAL_TIMEx_PWMN_Start(&TimHandle, channel);
     } else {
         HAL_TIM_PWM_Start(&TimHandle, channel);
@@ -165,88 +155,43 @@
 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);
 
-    // Update the SystemCoreClock variable
-    SystemCoreClockUpdate();
-
-    HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &PclkFreq);
-
+    // Get the PCLK used by the timer
     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;
+        case PWM_5:
+        case PWM_12:
+        case PWM_13:
+        case PWM_14:
+            PclkFreq = HAL_RCC_GetPCLK1Freq();
             break;
-#endif
-
+        case PWM_1:
+        case PWM_8:
         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;
+            PclkFreq = HAL_RCC_GetPCLK2Freq();
             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;
-    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
+    // TIMxCLK = 2 x PCLKx when the APB prescaler is not equal to 1 (DIV4 or DIV2 in our case)
+    TimHandle.Init.Prescaler     = (uint16_t)((PclkFreq * 2) / 1000000) - 1; // 1 us tick
     TimHandle.Init.ClockDivision = 0;
     TimHandle.Init.CounterMode   = TIM_COUNTERMODE_UP;
-    HAL_TIM_PWM_Init(&TimHandle);
+
+    if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) {
+        error("Cannot initialize PWM");
+    }
 
     // Set duty cycle again
     pwmout_write(obj, dc);