空循环意味着使用C的计时器代码

时间:2016-10-29 01:49:30

标签: c embedded avr

void Tmr_Wait1us (uint16_t delay) {
    uint16_t i;
    TCNT0 = 0;      // will start to count from 0 up to 255 (if 8-bit timer)
    for (i = 0; i < delay / 256; i++)
        while (TCNT0 < 255)         
            ;   
    while (TCNT0 <= delay % 256)
        ;
}

此代码用于设置定时器等待精确的时间量,应用于AVR-Atmega32a,我无法理解空循环在这里做什么?还有第二个循环呢?

3 个答案:

答案 0 :(得分:2)

TCNT0是定时器0的当前定时器计数,是一个8位定时器。由于它与代码异步计数,即使CPU处于旋转等待状态,它也会递增。

但是由于avr-libc在util/delay.h中提供相当精确的旋转等待,所以通常最好不要使用它们。

for (int i = 0; i < delay; i++)
  _delay_us(1);

答案 1 :(得分:0)

他们看起来像忙碌的等待。它们会阻塞,直到满足条件。

答案 2 :(得分:0)

产生的延迟量取决于为timer0设置的源时钟的预分频 两个循环都阻塞直到TCNT0计数达到特定值 然而,这不是实现延迟循环的好方法 用户应检查TIFR寄存器中的溢出位TOV0以进行设置,而不是计算TCNT0达到255时的点。 您可以参考atmel on Mega timers http://www.atmel.com/Images/Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf

上的应用说明