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 01100x08: 0000 10000x10: 0001 00007: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 = 0x007:0 VAL[7:0] T3 通道0 比较/ 捕获值 5、T3CCTL1 (T3通道1 捕获/ 比较控制寄存器) CCTL1 = 0x007 - 没用 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 = 0x007: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 0X031 //main.h 2 #include3 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_VECTOR104 __interrupt void T3_ISR(void)105 {106 //IRCON = 0x00; //清中断标志,硬件自动完成107 if(counter<200)counter++; //200次中断LED闪烁一轮108 else109 {110 counter = 0; //计数清零111 YLED = RLED;112 RLED = !RLED; //改变小灯的状态113 }114 }
功能:根据val的值将T3设置为不同模式,一共4 种模式。