博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式成长轨迹42 【Zigbee项目】【CC2430基础实验】【T3的使用】
阅读量:5043 次
发布时间:2019-06-12

本文共 6989 字,大约阅读时间需要 23 分钟。

 

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 
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_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 种模式。

 

 

转载于:https://www.cnblogs.com/zeedmood/archive/2012/09/01/2666903.html

你可能感兴趣的文章