?定时器2是一个16位向上计数定时器,它有几个可选的扩展:指定的重载值,比较输出(PWM)和捕获功能。定时器2由专用的16位组成计数器/定时器和四个16位捕获/比较模块。 每个捕获/比较模块都有它启用时自己关联的I / O.每个捕获/比较模块可以配置为独立运行在3种模式中的一种:比较,捕获与上升沿或捕获注册写。
文章图片
1、Timer 2 向上计数控制
?定时器2的时钟源有三种工作模式:指定fcpu时钟(fcpu / 12和fcpu / 24),使用停止控制和外部时钟输入指定fcpu时钟。 下表对这些进行了分类三种操作模式及其相关寄存器(T2I1,T2I0和T2PS)。 一旦计时器的计数器是溢出(从0xFFFF到0x0000计数),TF2将立即发出,可以读/写通过固件。 定时器2中断功能由ET2控制。
文章图片
T2I1 | T2I0 | T2PS | Timer 2 时钟源 |
---|---|---|---|
0 | 0 | x | 关闭Timer2 |
0 | 1 | 0 | fcpu/12 |
0 | 1 | 1 | fcpu/24 |
1 | 1 | 0 | fcpu/12(T2引脚为低电平时停止计数,T2为高电平时恢复) |
1 | 1 | 1 | fcpu/24(T2引脚为低电平时停止计数,T2为高电平时恢复) |
1 | 0 | x | T2引脚上升沿(T2引脚时钟速率≤0.5* fcpu) |
?指定的重载值是一个可选功能,它可以通过溢出或重新加载定时器2计数器外部控制引脚。如果选择了溢出重载,定时器2将CRCH / CRCL值复制到其计数器(TH2 / TL2)自动溢出信号。 最终,定时器2将从CRCH / CRCL重复计数值为0xFFFF。另一方面,外部引脚T2RL的下降沿(与P2.0共用)也可以选择为a重载信号。 在这种情况下,如果T2RL,定时器2通常将其计数器从0x0000计数到0xFFFF引脚保持稳定,但计数器值将随时由CRCH / CRCL值替换为只要T2RL引脚有下降信号。 随后,定时器2继续其计数程序如果启用了中断功能,将发出CRCH / CRCL值和外部重载标志(TF2RL)(ET2RL和ET2均已设定)。 外部重载中断向量与定时器2中断共享矢量并通过固件识别事件。
文章图片
3、比较输出
?定时器2最多有四组比较输出。 每组(CRC / CC1 / CC2 / CC3)独立地将其值与定时器2计数器(TH2 / TL2)进行比较,并将T2COM0上的比较结果输出到T2COM3引脚(与P00,P01,P03和P0.4共用)。 比较结果有两种输出方式:直接输出和间接输出。
?直接方法是,如果CRC / CC1 / CC2 / CC3寄存器低于定时器2计数器,则映射引脚输出低电平状态; 如果寄存器值等于/大于定时器2计数器,则输出高电平状态。 因此,输出状态在交叉点处改变两次。 由于CRC / CC1 / CC2 / CC3寄存器等于定时器2计数器,因此发出TF2C0 / TF2C1 / TF2C2 / TF2C3标志,可以通过固件进行读/写。 比较中断功能由ET2C0 / ET2C1 / ET2C2 / ET2C3控制。
文章图片
文章图片
?相反,间接输出方法是保持映射引脚先前输出设置的事件,直到定时器2计数器超过CRC / CC1 / CC2 / CC3寄存器值。 在此模式下,输出信号的转换可由软件配置。 换句话说,当TH2 / TL2等于CRC寄存器时,P0.0寄存器位会影响T2COM0 / P0.0引脚。 定时器2溢出不会导致输出更改。
文章图片
文章图片
4、捕获功能
?捕捉功能类似于秒表的分割/圈数按钮。 当定时器2计数器(TH2 / TL2)例行计数时,分离事件记录CRC / CC1 / CC2 / CC3寄存器中的计数器值。
文章图片
?拆分事件可以来自硬件或软件。 T2CC0引脚可触发硬件分裂事件,该事件将TH2 / TL2值复制到CRCH / CRCL寄存器,而T2CC1,T2CC2和T2CC3分别控制CC1至CC3寄存器。
文章图片
通过将任意值写入CRCL / CCL1 / CCL2 / CCL3寄存器来触发软件拆分事件。 在对这些寄存器执行写入指令时,当前的TH2 / TL2值将记录在配对的寄存器中。
文章图片
5、寄存器
寄存器 | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
---|---|---|---|---|---|---|---|---|
T2CON | T2PS | I3FR | - | T2R1 | T2R0 | T2CM | T2I1 | T2I0 |
CCEN | COCA31 | COCA30 | COCA21 | COCA20 | COCA11 | COCA10 | COCA01 | COCA00 |
TH2 | TH27 | TH26 | TH25 | TH24 | TH23 | TH22 | TH21 | TH20 |
TL2 | TL27 | TL26 | TL25 | TL24 | TL23 | TL22 | TL21 | TL20 |
CRCH | CRCH7 | CRCH6 | CRCH5 | CRCH4 | CRCH3 | CRCH2 | CRCH1 | CRCH0 |
CRCL | CRCL7 | CRCL6 | CRCL5 | CRCL4 | CRCL3 | CRCL2 | CRCL1 | CRCL0 |
CCH3 | CCH37 | CCH36 | CCH35 | CCH34 | CCH33 | CCH32 | CCH31 | CCH30 |
CCL3 | CCL37 | CCL36 | CCL35 | CCL34 | CCL33 | CCL32 | CCL31 | CCL30 |
CCH2 | CCH27 | CCH26 | CCH25 | CCH24 | CCH23 | CCH22 | CCH21 | CCH20 |
CCL2 | CCL27 | CCL26 | CCL25 | CCL24 | CCL23 | CCL22 | CCL21 | CCL20 |
CCH1 | CCH17 | CCH16 | CCH15 | CCH14 | CCH13 | CCH12 | CCH11 | CCH10 |
CCL1 | CCL17 | CCL16 | CCL15 | CCL14 | CCL13 | CCL12 | CCL11 | CCL10 |
IEN0 | EAL | - | ET2 | ES0 | ET1 | - | ET0 | EX0 |
IEN1 | ET2RL | - | ET2C3 | ET2C2 | ET2C1 | ET2C0 | ESPI | EI2C |
IRCON | TF2RL | TF2 | TF2C3 | TF2C2 | TF2C1 | TF2C0 | - | - |
位 | 域 | 描述 |
---|---|---|
7 | T2PS | 定时器2预标量,0 是fcpu/12,1 是fcpu/24 |
6 | I3FR | 在比较模式下:0:当产生COM0中断时 Timer2的内容变得不等于CRCregister。1:当产生COM0中断时Timer2的内容变为等于CRC寄存器。在捕获模式0:0:定时器2的内容将被锁存到CRC中T2CC0的寄存器是下降沿。1:定时器2的内容将被锁存到CRC中T2CC0寄存器正在上升沿。 |
5 | 保留 | |
4…3 | T2R | 指定的定时器2重载值。00:禁用 ,01:禁用,10:通过计数器溢出将CRCH / CRCL加载到TH2 / TL2,11:通过T2RL引脚将CRCH / CRCL加载到TH2 / TL2 |
2 | T2CM | 定时器2比较输出。0:直接输出方法,1:间接输出,可以指定下一个输出状态 |
1…0 | T2I | 定时器2向上计数控制。00:禁用,01:时钟速率由T2PS定义,10:时钟源为T2引脚,11:时钟速率由T2PS定义,具有T2引脚门控制 |
位 | 域 | 描述 |
---|---|---|
7…6 | COCA3 | CC3的比较和捕获功能。00:禁用,01:通过T2CC3引脚上升沿捕获,10:比较功能,11:通过写CCL3寄存器进行捕获 |
5…4 | COCA2 | CC3的比较和捕获功能。00:禁用,01:通过T2CC2引脚上升沿捕获,10:比较功能,11:通过写CCL2寄存器进行捕获 |
3…2 | COCA1 | CC3的比较和捕获功能。00:禁用,01:通过T2CC1引脚上升沿捕获,10:比较功能,11:通过写CCL1寄存器进行捕获 |
1…0 | COCA0 | CRC的比较和捕获功能。00:禁用,01:通过T2CC0引脚上升沿捕获,10:比较功能,11:通过写入RCCL寄存器进行捕获 |
位 | 域 | 描述 |
---|---|---|
7 | EAL | 中断使能,参考中断部分知识 |
5 | ET2 | 定时器2中断使能 |
位 | 域 | 描述 |
---|---|---|
7 | ET2RL | T2定时器外部重载中断控制位。0:禁用,1:启用 |
6 | 保留 | 0 |
5 | ET2C3 | T2定时器COM3中断控制位。0:禁用,1:启用 |
4 | ET2C2 | T2定时器COM2中断控制位。0:禁用,1:启用 |
3 | ET2C1 | T2定时器COM1中断控制位。0:禁用,1:启用 |
2 | ET2C0 | T2定时器COM0中断控制位。0:禁用,1:启用 |
其他 | 参考其他章节 |
位 | 域 | 描述 |
---|---|---|
7 | TF2RL | T2定时器外部重载中断请求标志。 0:无TF2RL中断请求,1:TF2RL中断请求。 |
6 | TF2 | T2定时器中断请求标志。 0:无T2中断请求,1:T2中断请求 |
5 | TF2C3 | T2定时器 COM3中断请求标志位。0:无T2COM3中断请求,1:T2COM3中断请求。 |
4 | TF2C2 | T2定时器 COM2中断请求标志位。0:无T2COM2中断请求,1:T2COM2中断请求。 |
3 | TF2C1 | T2定时器 COM1中断请求标志位。0:无T2COM1中断请求,1:T2COM1中断请求。 |
2 | TF2C0 | T2定时器 COM0中断请求标志位。0:无T2COM0中断请求,1:T2COM0中断请求。 |
Else | Reserved |
寄存器 | 位 | 域 | 描述 |
---|---|---|---|
TH2/TL2 | 7…0 | TH2/TL2 | 定时器2 16位计数器寄存器 |
CRC | 7…6 | CRCH[15:0] | 16位比较/捕获寄存器 |
CCH3/CCL3 | 7…6 | CCH3/CCL3 | 16位比较/捕获寄存器 |
CCH2/CCL2 | 7…6 | CCH2/CCL2 | 16位比较/捕获寄存器 |
CCH1/CCL1 | 7…6 | CCH1/CCL1 | 16位比较/捕获寄存器 |
//=============================================================================
//Time = T2=1.5MS(65536 - 0xfc18)*12/16
//=============================================================================
#define TH2_Value 0xF8//65536 - 63536 = 20002000 * 1/Fclk = 2000 * 12/16M = 1500us
#define TL2_Value 0x30void scs_pwm_init(void)
{
T2CON = 0x01;
//Fclk = Fcpu/12 = 167K
TH2 = TH2_Value;
// Initial values
TL2 = TL2_Value;
ET2 = 1;
// Timer2 interrupt enable
EAL = 1;
// Golbal Interrupt enable
}
//-----------------------------------------------------------------------------
//Timer2 ISR
//-----------------------------------------------------------------------------
void Timer2_ISR(void) interrupt ISRTimer2// Vector @0x2B
{
TF2 = 0;
// Clear Timer2 overflow flag TH2 = TH2_Value;
// Initial values
TL2 = TL2_Value;
P20 = ~ P20;
// P2.6 toggle
}