2018-08-03 12:11 AM
Hi there,
Let say I want to generate a 1 ms delay using a timer. I set my prescaler to have a 1ms granularity
TIMx->PSC = (uint16_t)((SystemCoreClock / 1000U) - 1);
Now if I want to generate a 2ms delay I usually do it like this (assuming the UIF flag is already cleared and that the timer is not running).
TIMx->ARR = 2 - 1;
TIMx->CR1 = TIM_CR1_CEN; // Enable the TIM Counter
while((TIMx->SR & TIM_SR_UIF) == 0) ; // Wait for Timer overflow
Everything works as it should for any delay except if I want to generate a 1ms delay. Using the same method I have to change the prescaler to something.
My question is : is there a way to generate a 1ms delay with a 1ms prescaler ?
2018-08-03 12:44 AM
There may be several many ways to achieve this, depending on what you exactly want, e.g.
tmp = TIMx->CNT;
while (TIMx->CNT == tmp);
How well this will function will of course depend on the circumstances - if the timer is already running, this may result in shorter than expected delay. Forcing an update event through setting EGR.UG before this sequence may reset the prescaler counter resulting in the expected delay, but that also has other effects, which may or may not matter for your particular purpose.
Btw., if run after reset (i.e. after a timer reset, which resets PSC to 0), your code won'r result in 1ms delay, rather, 1ms + 2 timer clock cycles, as it takes an update event the real prescaler counter to be loaded from the PSC register.
2018-08-03 04:18 AM
The Prescaler should be the smaller of the two factors
Update occurs when at count zero
For 1ms clock at 1 MHz and observe 1000 ticks of a free running counter