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

  • 相关阅读:
    JS事件冒泡
    iis设置Gzip后,无后缀的url无法压缩解决 MVC iis GZIP
    SQL中的循环、for循环、游标
    采用CDN加速后,如何在程序里获取用户IP地址
    Resharper 的快捷键
    JS防后退跳转
    ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
    Log4net创建日志及简单扩展
    统治世界的十大算法
    ffmpeg save rtsp stream
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2666903.html
Copyright © 2020-2023  润新知