2015-03-10 08:53 AM
I want a timer to generate events at 2KHz. From the manual I see that TIM6 uses TIMxCLK for its input. TIMxCLK is the processor clock, right? My H/W is a STM32F428I-DISCO board using a STM32CubeMX generated project with unmodified clock yielding a 168 MHz clock. I have fiddled with TIM6 Prescaler and Counter Period to get a clock that counts at twice the frequency as the SysTick (as reported by HAL_GetTick().) The resulting values are Prescaler=4 and Counter Period=8400. I thought the following calculation would yield the timer frequency:
(SysTick /(Prescaler * Counter Period) or (168000000/(4*8400) => 5000I would have thought that TIM6 would count at 5KHz and not 2KHz. What do I have wrong? I'm happy that I have the right results but not happy that I don't understand the numbers.Thanks!Edit: Here's the timer init code:/* TIM6 init function */void MX_TIM6_Init(void){ TIM_MasterConfigTypeDef sMasterConfig; htim6.Instance = TIM6; htim6.Init.Prescaler = 4; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 8400; HAL_TIM_Base_Init(&htim6); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig);}2015-03-10 09:09 AM
TIM clocks are not the processor clock. They are APB clocks, nominally x2 except for the DIV1 case. See Clock Tree Diagram
On your general F4 TIM's on APB1 clock at 84 MHz, and on APB2 at 168 MHz Period and Prescaler are N-1 values, where the counter has N states, ie 0..N-1 84000000 / (5 * 8401) = 1999.761932015-03-10 09:14 AM
Thank you. I thought that one of the clocks on the Clock Configuration page might be part of this but was unable to figure out the connection.
2015-03-10 09:14 AM
2 KHz from 84 MHz
htim6.Init.Prescaler = 5 - 1; htim6.Init.Period = 8400 - 1; 5 KHz from 84 MHz htim6.Init.Prescaler = 4 - 1; htim6.Init.Period = 4200 - 1;