mbed lib with startup delay fixed for Nucleo401RE
Fork of mbed-src by
Revision 555:f8b0f61305ee, committed 2015-06-03
- 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);