7
7
* Date Author Notes
8
8
* 2018-12-10 zylx first version
9
9
* 2020-06-16 thread-liu Porting for stm32mp1
10
+ * 2020-08-25 linyongkang Fix the timer clock frequency doubling problem
10
11
*/
11
12
12
13
#include <board.h>
@@ -164,6 +165,12 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state)
164
165
tim = (TIM_HandleTypeDef * )timer -> parent .user_data ;
165
166
tim_device = (struct stm32_hwtimer * )timer ;
166
167
168
+ uint32_t FLatency = 0 ;
169
+ RCC_ClkInitTypeDef RCC_ClkInitStruct ;
170
+ HAL_RCC_GetClockConfig (& RCC_ClkInitStruct , & FLatency );
171
+ uint32_t pclk1_doubler = 1 + ( RCC_ClkInitStruct .APB1CLKDivider != RCC_HCLK_DIV1 );
172
+ uint32_t pclk2_doubler = 1 + ( RCC_ClkInitStruct .APB2CLKDivider != RCC_HCLK_DIV1 );
173
+
167
174
/* time init */
168
175
#if defined(SOC_SERIES_STM32F2 ) || defined(SOC_SERIES_STM32F4 ) || defined(SOC_SERIES_STM32F7 )
169
176
if (tim -> Instance == TIM9 || tim -> Instance == TIM10 || tim -> Instance == TIM11 )
@@ -176,12 +183,12 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state)
176
183
#endif
177
184
{
178
185
#if !defined(SOC_SERIES_STM32F0 ) && !defined(SOC_SERIES_STM32G0 )
179
- prescaler_value = (uint32_t )(HAL_RCC_GetPCLK2Freq () * 2 / 10000 ) - 1 ;
186
+ prescaler_value = (uint32_t )(HAL_RCC_GetPCLK2Freq () * pclk2_doubler / 10000 ) - 1 ;
180
187
#endif
181
188
}
182
189
else
183
190
{
184
- prescaler_value = (uint32_t )(HAL_RCC_GetPCLK1Freq () * 2 / 10000 ) - 1 ;
191
+ prescaler_value = (uint32_t )(HAL_RCC_GetPCLK1Freq () * pclk1_doubler / 10000 ) - 1 ;
185
192
}
186
193
tim -> Init .Period = 10000 - 1 ;
187
194
tim -> Init .Prescaler = prescaler_value ;
@@ -290,6 +297,12 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg)
290
297
/* set timer frequence */
291
298
freq = * ((rt_uint32_t * )arg );
292
299
300
+ uint32_t FLatency = 0 ;
301
+ RCC_ClkInitTypeDef RCC_ClkInitStruct ;
302
+ HAL_RCC_GetClockConfig (& RCC_ClkInitStruct , & FLatency );
303
+ uint32_t pclk1_doubler = 1 + ( RCC_ClkInitStruct .APB1CLKDivider != RCC_HCLK_DIV1 );
304
+ uint32_t pclk2_doubler = 1 + ( RCC_ClkInitStruct .APB2CLKDivider != RCC_HCLK_DIV1 );
305
+
293
306
#if defined(SOC_SERIES_STM32F2 ) || defined(SOC_SERIES_STM32F4 ) || defined(SOC_SERIES_STM32F7 )
294
307
if (tim -> Instance == TIM9 || tim -> Instance == TIM10 || tim -> Instance == TIM11 )
295
308
#elif defined(SOC_SERIES_STM32L4 )
@@ -300,19 +313,13 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg)
300
313
if (0 )
301
314
#endif
302
315
{
303
- #if defined(SOC_SERIES_STM32L4 )
304
- val = HAL_RCC_GetPCLK2Freq () / freq ;
305
- #elif defined(SOC_SERIES_STM32F1 ) || defined(SOC_SERIES_STM32F2 ) || defined(SOC_SERIES_STM32F4 ) || defined(SOC_SERIES_STM32F7 ) || defined(SOC_SERIES_STM32MP1 )
306
- val = HAL_RCC_GetPCLK2Freq () * 2 / freq ;
316
+ #if !defined(SOC_SERIES_STM32F0 ) && !defined(SOC_SERIES_STM32G0 )
317
+ val = (uint32_t )(HAL_RCC_GetPCLK2Freq () * pclk2_doubler / 10000 ) - 1 ;
307
318
#endif
308
319
}
309
320
else
310
321
{
311
- #if defined(SOC_SERIES_STM32F1 ) || defined(SOC_SERIES_STM32F2 ) || defined(SOC_SERIES_STM32F4 ) || defined(SOC_SERIES_STM32F7 ) || defined(SOC_SERIES_STM32MP1 )
312
- val = HAL_RCC_GetPCLK1Freq () * 2 / freq ;
313
- #elif defined(SOC_SERIES_STM32F0 ) || defined(SOC_SERIES_STM32G0 )
314
- val = HAL_RCC_GetPCLK1Freq () / freq ;
315
- #endif
322
+ val = HAL_RCC_GetPCLK1Freq () * pclk1_doubler / freq ;
316
323
}
317
324
__HAL_TIM_SET_PRESCALER (tim , val - 1 );
318
325
0 commit comments