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。
文章图片
- 定时器3的控制寄存器(T3CTL)
bit7~bit5:设置分频值
bit7:5 | 描述 |
---|---|
000 | 分频值为1 |
001 | 分频值为2 |
010 | 分频值为4 |
011 | 分频值为8 |
100 | 分频值为16 |
101 | 分频值为32 |
110 | 分频值为64 |
111 | 分频值为128 |
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]不变 |
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:中断失能。
文章图片
- 【CC2530之定时器T3】中断使能寄存器0
bit7:总中断使能。
文章图片
/*利用定时器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);
}
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息