CC2530之定时器T3

CC2530之定时器T3 在本次学习中,主要通过定时器T3周期性的控制LED的亮灭。
首先,先查看相关电路图。由图可知,当CC2530端口1的0号引脚输出低电平时,LED1将被点亮。
CC2530之定时器T3
文章图片

接下来,先查看与LED(P1_0)配置相关的寄存器。

  1. 端口1功能选择寄存器(P1SEL)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为普通的I/O口,若设置为1,则将相关引脚设为外设I/O,默认值都为0。
    CC2530之定时器T3
    文章图片

  2. 端口1方向选择寄存器(P1DIR)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为输入引脚,若设置为1,则将相关引脚设为输出引脚,默认值都为0。
    CC2530之定时器T3
    文章图片

  3. 端口1输入模式寄存器(P1INP)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为上拉/下拉模式,若设置为1,则将相关引脚设为三态模式,其中P1_0和P1_1没有上拉/下拉功能,可以不用配置,默认值都为0。
    CC2530之定时器T3
    文章图片

再来看看与定时器T3相关的寄存器
  1. 定时器3的控制寄存器(T3CTL)
    bit7~bit5:设置分频值
bit7:5 描述
000 分频值为1
001 分频值为2
010 分频值为4
011 分频值为8
100 分频值为16
101 分频值为32
110 分频值为64
111 分频值为128
bit4:定时器T3的启动/停止位。写1表示启动,写0表示停止
bit3:溢出中断掩码。写1表示打开溢出中断,写0表示关闭溢出中断。
bit2:清计数器。写1表示将计数器设置为0并初始化所有相关引脚。
bit1~bit0:设置计数器的计数模式。
bit1:0 描述
00 自由计数,从0x0000计数到0xFFFF,不断重复计数
01 向下计数一次,由T3CC0计数到0,
10 模计数,从0x0000计数到T1CC0,不断重复计数
11 向上/向下计数,从0x0000计数到T1CC0再从T1CC0计数到0x0000,不断重复
CC2530之定时器T3
文章图片

  1. 定时器3通道0捕获/比较控制寄存器。
    bit6:通道0中断掩码。写1表示使能中断,写0表示禁用中断。
    bit5~bit3:通道0比较输出模式选择。
bit5:3 描述
000 在比较中设置输出
001 在比较中清除输出
010 在比较中切换输出
011 在比较正计数时设置输出,在0时清除
100 在比较正计数时清除输出,在0时设置
101 在比较时设置输出,在0xFF时清除
110 在比较时清除输出,在0时设置
111 初始化输出引脚。 CMP[2:0]不变
bit2:定时器3通道0的模式。0表示捕获模式,1表示比较模式。
bit1~bit0:捕获模式选择
bit1:0 描述
00 无捕获
01 在上升沿捕获
10 在下降沿捕获
11 在所有边沿都捕获
CC2530之定时器T3
文章图片

  1. 定时器3通道0捕获/比较值寄存器
    当T3CCTL0.MODE=1(比较模式)时写该寄存器会导致T3CC0.VAL[7:0]更新到写入值延迟到T3CNT.CNT[7:0]=0x00
    CC2530之定时器T3
    文章图片

  2. 定时器1/3/4中断掩码/标志寄存器
    bit1:定时器3通道0中断标志。0:无中断未决;1:中断未决
    bit0:定时器3溢出中断标志。0:无中断未决;1:中断未决
    CC2530之定时器T3
    文章图片

  3. 中断标志4寄存器
    bit3:定时器3中断标志,当中断发生时置为1,当CPU向量指向中断服务例程时置为0
    CC2530之定时器T3
    文章图片

  4. 中断使能寄存器1
    bit3:定时器3中断使能。1:中断使能;0:中断失能。
    CC2530之定时器T3
    文章图片

  5. 【CC2530之定时器T3】中断使能寄存器0
    bit7:总中断使能。
    CC2530之定时器T3
    文章图片

/*利用定时器3,间隔约0.5s将LED电平翻转一次*/ #include typedef unsigned char uchar; typedef unsigned int uint; #define LED1 P1_0void LEDInit(void) { P1SEL &= ~0x01; //普通IO P1DIR |= 0x01; //输出模式 }void TIM3Init(void) { T3CTL |= 0xE0; //128分频 T3CTL &= ~0x03; //自由计数 T3CTL |= 0x08; //使能定时器3溢出中断 T3IE = 1; //定时器3中断使能,相当于IEN1 |= 0x08 T3CTL |= 0x10; //启动定时器3 EA = 1; //开启总中断,相当于IEN0 |= 0x80 }uint count; #pragma vector = T3_VECTOR __interrupt void T3_ISR(void) { IRCON = 0x00; //清中断标志,也可由硬件自动完成 /*产生245次中断后,LED发生翻转,时间间隔大概为 128*255*245/16000000 = 0.5s */ if(count++ > 244) { count = 0; LED1 = !LED1; } }void main(void) { LEDInit(); TIM3Init(); while(1); }

    推荐阅读