mbed library sources for airmote
Fork of mbed-src by
Diff: targets/hal/TARGET_STM/TARGET_STM32F7/pwmout_api.c
- 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);