Please note: We are aware of an issue affecting replies on the Arm Community forums, which may not be loading as expected.

We apologize for any inconvenience and appreciate your patience while we investigate and work to resolve the issue.

Thank you for your understanding.


This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Timer accuracy

Hello,
I configured a timer to generate a signal every 1 ms.

See below my code about the timer:

TIM_DeInit(TIMx);  // TIM1 Deinitialization *
TIM_InitStructure.TIM_Mode                       = TIM_OCM_CHANNEL_1;
TIM_InitStructure.TIM_OC1_Modes          = TIM_TIMING;
TIM_InitStructure.TIM_Clock_Source       = TIM_CLK_APB;
TIM_InitStructure.TIM_Clock_Edge         = TIM_CLK_EDGE_FALLING;
TIM_InitStructure.TIM_Prescaler          = 0xEF; // period = 5us
TIM_InitStructure.TIM_Pulse_Length_1 = 0xC8; // cycle of 200 period => cycle = 1ms
TIM_Init (TIMx, &TIM_InitStructure);

And the statements inside timer's interrupt:

void TIM1_IRQHandler(void)
{
        // port 3 pin 7 activated
        P37_1;
        // ACK interrupt
        TIM_ClearFlag(TIM1, TIM_FLAG_OC1);      // clear Output Compare 1 flag
        TIM_CounterCmd(TIM1, TIM_CLEAR);        // Reset TIM1 Counter
    VIC0->VAR = 0xFF;                                        // write any value to VIC0 VAR
}

BUT my oscilloscope measured a period of 1.03 ms instead of the 1ms expected.
Normally to generate a pulse every 1.03 ms the TIM_Pulse_Length_1 should be set to 0xCE.
As you can see, the difference between 0xCE and 0xC8 is big.

What can be the cause of this timer's inaccuracy ?
> Problem in PLL configuration ?
> Problem of crystal ?
> Problem in timer configuration ?

Has someone the same problem ?
In advance, thank you

  • "Are you sure ?"

    Yes, I am sure the facility is there - It is a case of configuring for the specific requirement.

    Sorry, but (once again) I find myself looking at this forum without being able to refer back to some of my past work. I think Per is right though, fairly sure it can be done as if you are configuring for PWM.

    If you're still in need on Monday, I can post some details.

  • hehe cleaver :p (but tricky solution)

    It's the only proper solution. What's tricky is not the solution, it's STM's documentation. And STM's design of the timer isn't very straightforward either...
    I worked with STR710. I believe it shares the timer with the STR912. I needed periodic timer interrupts, and I used PWM mode for that. It worked fine.

  • I think ST should take a peek at the documentation of the timers of the NXP LPC23xx chips and learn a bit. Both about how to document, and about expected capabilities of a timer.