avr 中的循环定时器功能?

Looping timer function in avr?

我最近不得不使用 avr 库并且没有延迟库来制作一个 Arduino 项目。因为我必须创建延迟函数的实现。

在网上搜索后,我在很多地方都找到了这段代码。 我得到的唯一解释是它以 经过校准的方式消磨时间

void delay_ms(int ms) {
   int delay_count = F_CPU / 17500;//Where is this 17500 comming from
   volatile int i;

   while (ms != 0) {
     for (i=0; i != delay_count; i++);
     ms--;
  }
}

我无法理解以下是如何工作的,(尽管它确实完成了工作)即,我们如何确定延迟计数为 F_cpu/17500。这个号码是哪里来的

延迟函数最好在汇编中完成,因为您必须知道您的代码需要多少个指令周期才能知道如何重复它以实现总延迟。

我没有测试您的代码,但这个值 (17500) 旨在达到 1 毫秒的延迟。

例如,如果F_CPU = 1000000so delay_count = 57,要达到1ms,它会计数57个计数一个简单的计算你会发现每个计数都需要17us,这个值是编译时循环所花费的时间组装。

但当然不同的编译器版本会产生不同的汇编代码,这意味着不准确的延迟。

我对您的建议是使用标准 avr/delay.h 库。我看不出任何你不能使用它的理由?但是,如果你必须再创建一个,那么你应该学习汇编!!