Arduino 中的定时器寄存器
在之前的文章中,我们使用了 TimerOne 库向 Arduino 添加定时器中断。但是,如果我们希望在没有第三方库的情况下生成定时器中断怎么办?在这种情况下,您将需要直接处理 Arduino 中的定时器寄存器。在本文中,我们将仅介绍与定时器操作相关的寄存器并解释其意义。我们还将提供 ATmega328(用于 Arduino Uno)数据手册的页码,您可以在其中找到有关这些寄存器的详细信息。
您可以在此处找到数据手册 -https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
TCCRxA 和 TCCRxB
这些是定时器控制寄存器。x 代表定时器编号。如果您使用的是 Timer0,则将关注 TCCR0A 和 TCCR0B 寄存器。TCCR0A 寄存器(主要是 WGM00 和 WGM01 位,以及来自 TCRR0B 寄存器的 WGM02 位)控制计数器的计数顺序。
请查看下面的图片 -
通常,使用正常模式或 CTC 模式之一。在正常模式下,您不关心确切的时间间隔。如果您有一个 8 位计数器,则将其值设置为 0,等待其达到 0xFF(对于 16 位则为 0xFFFF),然后生成中断。在 CTC(比较匹配时清除定时器)模式下,当计数器的值达到 OCRA 寄存器中设置的值时,会生成中断。这使您可以更好地控制时间间隔。
TCCR0B 的 CS00、CS01 和 CS02 位用于设置时钟的预分频器。请参见下图 -
TCNTx
此寄存器是实际计数发生的地方。它通常初始化为 0。其值与输出比较寄存器(在 CTC 模式下)进行比较,当值匹配时,会生成中断。
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
OCRxA
此寄存器保存生成所需延迟所需的刻度数。TCNTx 的值不断与 OCRxA 进行比较,当值匹配时,会生成中断
TIMSKx
通常,这里只有 0CIE0A 位很重要。它必须设置为 1 以在 TCNT 寄存器值达到 OCRA 值时启用中断。