我正在使用Due的定时器中断来定期调用例程,代码片段如下。我用" ticks"变量来计算定时器调用例程的时间。代码运行得很好,问题是它不是非常精确。 例如,如果我将周期设置为200毫秒,则得到193.7,对于最小周期,情况会更糟,如果设置为10毫秒,则只得到5.6。我的代码中需要微秒精度。 我尝试了所有计时器除数,目前我使用的是128,所有九个计时器和问题仍然存在。任何人都可以说为什么这么不精确以及如何改进呢? 提前谢谢。
pmc_set_writeprotect(false); // disable write protection for pmc registers
pmc_enable_periph_clk(ID_TC7); // enable peripheral clock TC7
TC_Configure(TC2,1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK4); //Division by 128
TC_SetRC(TC2, 1, ticks); //ticks = (84MHz/128) * period
TC_Start(TC2, 1);
// enable timer interrupts on the timer
TC2->TC_CHANNEL[1].TC_IER=TC_IER_CPCS; // IER = interrupt enable register
TC2->TC_CHANNEL[1].TC_IDR=~TC_IER_CPCS; // IDR = interrupt disable register
/* Enable the interrupt in the nested vector interrupt controller */
NVIC_EnableIRQ(TC7_IRQn);
答案 0 :(得分:0)
对于最精确的时序,您应该使用12 MHz外部晶振作为主时钟。内部RC时钟不准确。
但是你遇到的问题看起来可能来自整数除法。您用来计算ticks
的确切表达式是什么?是否会发生一些不希望的截断?