欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CC2530之定时器T3

程序员文章站 2022-06-09 19:29:20
...

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. 中断使能寄存器0
    bit7:总中断使能。
    CC2530之定时器T3

/*利用定时器3,间隔约0.5s将LED电平翻转一次*/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int uint;

#define LED1 P1_0

void 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);
}
相关标签: CC2530