zigbee学习之定时器

时间:2021-02-20 00:13:27

以下是我自己的总结,我不会分析代码,代码简单讲起来没有好大意思,主要是抓住核心知识框架。

脉冲:32MHZ就是一秒钟32000000个脉冲

时钟周期:1/f=1/32us
指令周期等于时钟周期(在51中是机械周期=12*时钟周期)
内部是16MHZ,定时器内部一个脉冲,定时器计数就加一


定时器 1(查询法)
T1CTL寄存器 定时器1控制和状态:
T1CTL (Bit 3:2) 分频器划分值,如下: 
00: 标记频率/1 
01: 标记频率/8 
10: 标记频率/32 
11: 标记频率/128 
T1CTL (Bit 1:0) 选择定时器1模式 
00: 暂停运行。 
01: *运行,从0x0000到0xFFFF反复计数。 
10: 模,从0x0000到T1CC0反复计数。 
11: 正计数/倒计数,从 0x0000 到 T1CC0 反复计数并
且从 T1CC0 倒计数到 0x0000。 


T1STAT(0xAF)定时器 1 状态:
Bit5: 定时器 计数器溢出中断标志//设置为1
Bit4: 定时器 1 通道 4 中断标志 
Bit3: 定时器 1 通道 3 中断标志 
Bit2: 定时器 1 通道 2 中断标志 
Bit1: 定时器 1 通道 1 中断标志 
Bit0: 定时器 1 通道 0 中断标志 


IRCON(0xC0) 中断标志 4 :
Bit1: 定时器1中断标志。当定时器1中断发生时设为1并且当CPU向量指向
中断服务例程时清除。 0: 无中断未决 1: 中断未决 


T1CTL = 0x0d; //128分频,自动重装 0x0000-0xFFFF 1/(16000000/128)*65536= 0.5248s
T1STAT= 0x21; //通道0,中断有效  
if(IRCON > 0) IRCON=0;


定时器3

T3CTL定时器3控制
[7:5]分频器划分值。产生有效时钟沿用于来自 CLKCON.TICKSPD 的定时器时钟 。如 下
000 : 标记 频率 /1
001 : 标记 频率 /2
010 : 标记 频率 /4
011 : 标记 频率 /8
100 : 标记 频率 / 1 6
101 : 标记 频率 / 3 2
110 : 标记 频率 / 6 4
111 : 标记 频率 / 1 28
[4]  启动定时器。正常运行时设置 ,暂停时清除,1启动。
[3]  溢出中断屏蔽0 :中断禁止 1 :中断使能
[2]  计数器。 写 1 到 CLR 复位 计数器 到 0x00 ,并初始化相关通道所有的输出引脚。总是读作 0 。
[1:0]定时器3模式。选择以下模式:
0 0 : *运行 , 从 0x0 0 到 0xFF 反复计数
0 1 : 倒计数 , 从 T3CC 0 到 0 x 0 0 计数
1 0 : 模 , 从 0x0 0 到 T3 C C0 重复计数
1 1 : 正 / 倒计 数 , 从 0 x0 0 到 T3C C0 重复计数,降到 0x00

void InitT3()
{     
    T3CTL |= 0x08 ;          //定时器3控制,开溢出中断     
    T3IE = 1;                //开总中断和T3中断
    T3CTL |= 0xE0;           //128分频,128/16000000*N=0.5S,N=62500
    T3CTL &= ~0x03;          //自动重装 00->0xff  62500/255=245(次)
    T3CTL |= 0x10;           //启动
    EA = 1;                  //开总中断
}


//定时器T3中断处理函数
#pragma vector = T3_VECTOR//(T3_VECTOR向量地址) 
__interrupt void T3_ISR(void) 

    IRCON = 0x00;            //清中断标志, 也可由硬件自动完成 
}