CC2530之定时器T3
CC2530之定时器T3
在本次学习中,主要通过定时器T3周期性的控制LED的亮灭。
首先,先查看相关电路图。由图可知,当CC2530端口1的0号引脚输出低电平时,LED1将被点亮。
接下来,先查看与LED(P1_0)配置相关的寄存器。
端口1功能选择寄存器(P1SEL)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为普通的I/O口,若设置为1,则将相关引脚设为外设I/O,默认值都为0。
端口1方向选择寄存器(P1DIR)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为输入引脚,若设置为1,则将相关引脚设为输出引脚,默认值都为0。
端口1输入模式寄存器(P1INP)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为上拉/下拉模式,若设置为1,则将相关引脚设为三态模式,其中P1_0和P1_1没有上拉/下拉功能,可以不用配置,默认值都为0。
再来看看与定时器T3相关的寄存器
- 定时器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,不断重复 |
- 定时器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 | 在所有边沿都捕获 |
定时器3通道0捕获/比较值寄存器
当T3CCTL0.MODE=1(比较模式)时写该寄存器会导致T3CC0.VAL[7:0]更新到写入值延迟到T3CNT.CNT[7:0]=0x00定时器1/3/4中断掩码/标志寄存器
bit1:定时器3通道0中断标志。0:无中断未决;1:中断未决
bit0:定时器3溢出中断标志。0:无中断未决;1:中断未决中断标志4寄存器
bit3:定时器3中断标志,当中断发生时置为1,当CPU向量指向中断服务例程时置为0中断使能寄存器1
bit3:定时器3中断使能。1:中断使能;0:中断失能。中断使能寄存器0
bit7:总中断使能。
/*利用定时器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之定时器1的输出比较模式(PWM实验)
下一篇: CC2530之外部中断