AVR中定时器的使用
一、在AVR中定时器的组成:
在MCU中(M16),定时器是独立的一个模块,M16有三个独立的定时器模块,即T/C0、T/C1和T/C2;其中T/C0和T/C2都是8位的定时器,而T/C1是一个16位的定时器。定时器的工作是独立于CPU之外自行运行的硬件模块。
基础定时器的工作包含计数器控制寄存器(TCCR)、计数寄存器(TCNT)、中断屏蔽寄存器(TIMSK)、中断标志寄存器(TIFR)、总中断控制寄存器(SREG)组成。
二、定时器中各个寄存器的作用:
1、计数器控制寄存器(TCCR0):
计时器控制寄存器是用于选择时钟源的控制,AVR中可以选择8中时钟源,时钟在计数器中的作用即按照分频指使在指定的微秒中进行递增计数,具体关系如下:
CS02 | CS01 | CS00 | 分频说明 |
---|---|---|---|
0 | 0 | 0 | 无时钟输入,定时器不工作即计数寄存器不递增(0x00) |
0 | 0 | 1 | 没有分频(0x01) |
0 | 1 | 0 | 晶振8分频(0x02) 分频即设置时钟的晶振工作频率,8分频即晶振一次为1/8Mhz换算成时间单位为8微秒 |
0 | 1 | 1 | 32分频(0x03) |
1 | 0 | 0 | 64分频(0x04) |
1 | 0 | 1 | 128分频(0x05) |
1 | 1 | 0 | 256分频(0x06) |
1 | 1 | 1 | 1024分频(0x07) |
2、计数寄存器(TCNT0):
计数寄存器即当定时器工作时,根据设置的时钟分频进行递增,也可以理解为,计数器存储的是时钟的脉冲次数,其中TCNT0为8为寄存器,最大值为255,
TCNT1为16为寄存器,最大值为65535,若超过最大值则会引发溢出。
3、定时器中断屏蔽寄存器(TIMSK):
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | OCIE0 | TOIE0 |
OCIE:为比较匹配中断允许标识位,置1时表示允许匹配中断,即当计数寄存器中的数据达到匹配值时,CPU会中断当前主线任务,执行中断子任务。
TOIE:为溢出中断允许标识位,置1时表示允许溢出中断,即当计数寄存器中的数据递增到最大值并发生溢出时就会产生中断,当允许中断时,在计数器到达255时CPU会中断当前主线任务,执行中断子任务。
4、中断标志位寄存器(TIFR):
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
OCF2 | TOV2 | ICF1 | OCF1A | OCF1B | TOV1 | OCF0 | TOV0 |
OCF:为比较输出中断标志位,当比较匹配成功时,OCF被设置为1,并且计数寄存器会被自动清零,若在运行程序前将该标志位写入逻辑1则可以清除该标志位。
TOV:为溢出中断标志位,当计数寄存器产生溢出时,TOV会被设置为1,并且计数寄存器会被自动清零,若在运行程序前将该标志位写入逻辑1则可以清除该标志位。
但,基本上使用定时器通常都会让定时器工作在中断模式上,所以TIFR默认就是开启状态,无需特意初始化该参数。
5、状态寄存器(SREG):
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
I | T | H | S | V | N | Z | C |
I:全局中断触发禁止位,为中断总控制开关,设置为1则总控允许中断,若为0则禁止一切中断(但在异步工作方式下T/C2的中断唤醒MCU功能除外)。
其中I位为最重要的开关标志位,其余位说明如下:
6、异步状态寄存器(ASSR):
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
- | - | - | - | AS2 | TCN2UB | OCR2UB | TCR2UR |
以atmega128为例,它有四个寄存器,TIMER0、TIMER1、TIMER2、TIMER3,所以此异步状态寄存器是用来控制是否开启异步定时器的状态开关。
AS2:异步中断触发禁止位,若此位为1时,则开启异步模式。
TCUN2UB(异步模式):写TCNT2时会引起 TCUN2UB置位,写完成时,TCUN2UB自动清零,TCUN2UB=0代表TCNT2可以写入新的数值了
OCR2UB(异步模式):写OCR2时会引起 OCR2UB置位,写OCR2完成时,OCR2UB自动清零,OCR2UB=0代表OCR2可以写入新的数值了
TCR2UB(异步模式):写TCCR2时会引起 TCR2UB置位,写TCCR2完成时,TCR2UB自动清零,TCR2UB=0代表TCCR2可以写入新的数值了