嵌入式成长轨迹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 种模式。

 

 

posted @ 2012-09-01 17:59  MooreZHENG  阅读(572)  评论(0编辑  收藏  举报