嵌入式成长轨迹42 【Zigbee项目】【CC2430基础实验】【T3的使用】
CC2430/CC2431 包括四个定时器:一个一般的 16 位(Timer 1) 和两个8 位(Timer3,4)定时器,支持典型的定时/ 计数功能,例如测量时间间隔,对外部事件计数,产生周期性中断请求,输入捕捉、比较输出和PWM 功能。一个 16 位MAC定时器(Timer 2),用以为IEEE802.15.4 的CSMA-CA 算法提供定时以及为IEEE802.15.4 的MAC层提供定时。
本实验使用T3,产生周期性中断请求。
1、
##timer## 表示用宏定义的数字代换
#define TIMER34_INIT(timer) \
do { \
T##timer##CTL = 0x06; \
T##timer##CCTL0 = 0x00; \
T##timer##CC0 = 0x00; \
T##timer##CCTL1 = 0x00; \
T##timer##CC1 = 0x00; \
} while (0)
#define TIMER34_ENABLE_OVELOW_INT(timer,val) \
(T##timer##CTL = (val) ? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08)
##timer## 表示用宏定义的数字代换,如timer=3,则上式为T3CTL=(val)?T3CTL|0X08:T3CTL&~0X08;
2、
T3CTL(T3控制寄存器)
0x06:0000 0110
0x08: 0000 1000
0x10: 0001 0000
7:5 DIV[2:0] 定时器时钟再分频数(对CLKCON.TICKSPD 分频后再次分频)
000 不再分频
001 2分频
010 4分频
011 8分频
100 16 分频
101 32 分频
110 64 分频
111 128分频
4 START T3 起停位
0 暂停计数
1 正常运行
3 OVFIM 溢出中断掩码
0 关溢出中断
1 开溢出中断
2 CLR 清计数值,写 1 使T3CNT=0x00
1:0 MODE[1:0] T3 模式选择
00 自动重装
01 DOWN (从T3CC0到0x00 计数一次)
10 模计数 (反复从 0x00到T3CC0 计数)
11 UP/DOWN(反复从0x00 到T3CC0 再到0x00)
3、
T3CCTL0 (T3通道0 捕获/ 比较控制寄存器)
CCTL0 = 0x00
7 - 没用
6 IM 通道0 中断掩码
0 关中断
1 开中断
5:3 CMP[7:0] 通道0 比较输出模式选择,指定计数值过T3CC0时的发生事件
000 输出置1(发生比较时)
001 输出清0(发生比较时)
010 输出翻转
011 输出置1(发生上比较时)输出清 0(计数值为0 或UP/DOWN 模式下发生下比较)
100 输出清0(发生上比较时)输出置 1(计数值为0 或UP/DOWN 模式下发生下比较)
101 输出置1(发生比较时)输出清 0(计数值为0xff 时)
110 输出清0(发生比较时)输出置 1(计数值为0x00时)
111 没用
2 MODE- T3 通道0 模式选择
0 捕获
1 比较
1:0 CAP T3 通道0 捕获模式选择
00 没有捕获
01 上升沿捕获
10 下降沿捕获
11 边沿捕获
4、
T3CC0 (T3通道0 捕获/比较值寄存器)
CC0 = 0x00
7:0 VAL[7:0] T3 通道0 比较/ 捕获值
5、
T3CCTL1 (T3通道1 捕获/ 比较控制寄存器)
CCTL1 = 0x00
7 - 没用
6 IM 通道1 中断掩码
0 关中断
1 开中断
5:3 CMP[7:0] 通道1 比较输出模式选择,指定计数值过T3CC0时的发生事件
000 输出置1(发生比较时)
001 输出清0(发生比较时)
010 输出翻转
011 输出置1(发生上比较时)输出清 0(计数值为0 或UP/DOWN 模式下发生下比较)
100 输出清0(发生上比较时)输出置 1(计数值为0 或UP/DOWN 模式下发生下比较)
101 输出置1(发生比较时)输出清 0(计数值为0xff 时)
110 输出清0(发生比较时)输出置 1(计数值为0x00时)
111 没用
2 MODE- T3 通道1 模式选择
0 捕获
1 比较
1:0 CAP T3 通道1 捕获模式选择
00 没有捕获
01 上升沿捕获
10 下降沿捕获
11 边沿捕获
6、
T3CC1 (T3通道1 捕获/比较值寄存器)
CC1 = 0x00
7:0 VAL[7:0] T3 通道1 比较/ 捕获值
7、
void Init_T3_AND_LED(void)
{
P1DIR = 0X03;
RLED = 1;
YLED = 1;
TIMER34_INIT(3); // 初始化T3
TIMER34_ENABLE_OVERFLOW_INT(3,1); // 开T3中断
// 时钟32分频101
TIMER3_SET_CLOCK_DIVIDE(16);
TIMER3_SET_MODE(T3_MODE_FREE); // 自动重装00->0xff
TIMER3_START(1); //启动
};
函数功能:将 I/0 P10,P11 设置为输出去控制 LED ,将 T3设置为自动重装模式,定时器时钟 16
分频,并启动T3。
8、
void T3_ISR(void) ;
函数原型:
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
//IRCON = 0x00; // 清中断标志, 硬件自动完成
if(counter<200)counter++; //10 次中断LED 闪烁一轮
else
{
counter = 0; //计数清零
RLED = !RLED; //改变小灯的状态
}
}
函数功能:这是一个中断服务程序,每200 次中断改变一次红色 LED 的状态。
9、
开启溢出中断
#define TIMER34_ENABLE_OVERFLOW_INT(timer,val) \
do{T##timer##CTL = (val) ? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08; \
EA = 1; \
T3IE = 1; \
}while(0)
功能:打开T3的溢出中断。
8、
复位T3相关寄存器
#define TIMER34_INIT(timer) \
do { \
T##timer##CTL = 0x06; \
T##timer##CCTL0 = 0x00; \
T##timer##CC0 = 0x00; \
T##timer##CCTL1 = 0x00; \
T##timer##CC1 = 0x00; \
} while (0)
功能:将T3相关的寄存器复位到0
9、
控制T3起停
#define TIMER3_START(val) \
(T3CTL = (val) ? T3CTL | 0X10 : T3CTL&~0X10)
功能:val为1 ,T3正常运行,val为0 ,T3停止计数
10、
设置T3工作方式
#define TIMER3_SET_MODE(val) \
do{ \
T3CTL &= ~0X03; \
(val==1)?(T3CTL|=0X01): /*DOWN */ \
(val==2)?(T3CTL|=0X02): /*Modulo */ \
(val==3)?(T3CTL|=0X03): /*UP / DOWN */ \
(T3CTL|=0X00); /*free runing */ \
}while(0)
#define T3_MODE_FREE 0X00
#define T3_MODE_DOWN 0X01
#define T3_MODE_MODULO 0X02
#define T3_MODE _UP_DOWN 0X03
1 //main.h 2 #include <ioCC2430.h> 3 4 #define RLED P1_0 5 #define YLED P1_1 6 7 #define uchar unsigned char 8 9 /***************************************** 10 //定义全局变量 11 *****************************************/ 12 uchar counter = 0; 13 14 /***************************************** 15 //T3配置定义 16 *****************************************/ 17 // Where _timer_ must be either 3 or 4 18 // Macro for initialising timer 3 or 4 19 //将T3/4配置寄存复位 20 #define TIMER34_INIT(timer) \ 21 do { \ 22 T##timer##CTL = 0x06; \ 23 T##timer##CCTL0 = 0x00; \ 24 T##timer##CC0 = 0x00; \ 25 T##timer##CCTL1 = 0x00; \ 26 T##timer##CC1 = 0x00; \ 27 } while (0) 28 29 //Macro for enabling overflow interrupt 30 //设置T3/4溢出中断 31 #define TIMER34_ENABLE_OVERFLOW_INT(timer,val) \ 32 do{T##timer##CTL = (val) ? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08; \ 33 EA = 1; \ 34 T3IE = 1; \ 35 }while(0) 36 37 38 39 40 //启动T3 41 #define TIMER3_START(val) \ 42 (T3CTL = (val) ? T3CTL | 0X10 : T3CTL&~0X10) 43 44 //时钟分步选择 45 #define TIMER3_SET_CLOCK_DIVIDE(val) \ 46 do{ \ 47 T3CTL &= ~0XE0; \ 48 (val==2) ? (T3CTL|=0X20): \ 49 (val==4) ? (T3CTL|=0x40): \ 50 (val==8) ? (T3CTL|=0X60): \ 51 (val==16)? (T3CTL|=0x80): \ 52 (val==32)? (T3CTL|=0xa0): \ 53 (val==64) ? (T3CTL|=0xc0): \ 54 (val==128) ? (T3CTL|=0XE0): \ 55 (T3CTL|=0X00); /* 1 */ \ 56 }while(0) 57 58 //Macro for setting the mode of timer3 59 //设置T3的工作方式 60 #define TIMER3_SET_MODE(val) \ 61 do{ \ 62 T3CTL &= ~0X03; \ 63 (val==1)?(T3CTL|=0X01): /*DOWN */ \ 64 (val==2)?(T3CTL|=0X02): /*Modulo */ \ 65 (val==3)?(T3CTL|=0X03): /*UP / DOWN */ \ 66 (T3CTL|=0X00); /*free runing */ \ 67 }while(0) 68 69 #define T3_MODE_FREE 0X00 70 #define T3_MODE_DOWN 0X01 71 #define T3_MODE_MODULO 0X02 72 #define T3_MODE_UP_DOWN 0X03 73 74 75 /***************************************** 76 //T3及LED初始化 77 *****************************************/ 78 void Init_T3_AND_LED(void) 79 { 80 P1DIR = 0X03; 81 RLED = 1; 82 YLED = 1; 83 84 TIMER34_INIT(3); //初始化T3 85 TIMER34_ENABLE_OVERFLOW_INT(3,1); //开T3中断 86 87 //时钟32分频101 88 TIMER3_SET_CLOCK_DIVIDE(16); 89 TIMER3_SET_MODE(T3_MODE_FREE); //自动重装00->0xff 90 TIMER3_START(1); //启动 91 }; 92 93 /***************************************** 94 //主函数 95 *****************************************/ 96 void main(void) 97 { 98 Init_T3_AND_LED(); 99 YLED = 0; 100 while(1); //等待中断 101 } 102 103 #pragma vector = T3_VECTOR 104 __interrupt void T3_ISR(void) 105 { 106 //IRCON = 0x00; //清中断标志,硬件自动完成 107 if(counter<200)counter++; //200次中断LED闪烁一轮 108 else 109 { 110 counter = 0; //计数清零 111 YLED = RLED; 112 RLED = !RLED; //改变小灯的状态 113 } 114 }
功能:根据val的值将T3设置为不同模式,一共4 种模式。