CC2540开发板学习笔记(四)——定时器
一、实验内容
分别使用定时器T1和T3使得LED周期性闪烁
二、实验过程
1、定时器T1(查询IRCON来控制)
(1)需要调配的寄存器
T1CTL(0XE4) | Timer1控制寄存器 |
BIT3,BIT2:定时器分频倍数选择 00:不分 01:8分频 10:32分频 11:128分频 | |
BIT1,BIT0:定时器模式选择: 00:暂停 01:自动重装:0X0000—0XFFFF 10:比较计数:0X0000—T1CC0 11:PWM方式 | |
T1STAT(0XAF) | Timer1状态寄存器: |
BIT5:OVFIF 定时器溢出中断标志,在数值达到计数终值时置为1. | |
Bit4: 定时器 1 通道 4 中断标志位 | |
IRCON(0XCO) | 中断标志位寄存器; |
(2)定时器T1的初始化:
T1CTL=0X0d; T1STAT=0X21;
(3)代码实现
#include<ioCC2540.h> #define LED1 P1_0 //定义LED1,方便查阅代码 void Init()//初始化函数 { P1SEL = 0X00; //实现LED的初始化 P1DIR = 0X01; P1INP = 0X00; LED1 = 0; T1CTL = 0X0d; //128分频,自动重装0X0000-0XFFFF;,时钟频率为16MHZ T1STAT = 0X21; //通道0,中断有效 EA=1; } void main(void) { Init(); unsigned char count=0; while(1) { if(IRCON>0) //检查是否置位为1 { IRCON=0; count++; //由于分频128后,已经满足1s的闪烁周期。 if(count>=1) { count=0; LED1=~LED1; } } } }
2、定时器T3(中断方式)
(1)需要调配的寄存器
T3CTL(0XCB) | Timer3:控制寄存器 |
BIT7,BIT6,BIT5:定时器时钟分频倍数选择 000:不分频 001 :2 分频 010 : 4 分频 011 : 8分频 100 :16 分频 101 :32 分频 110 : 64 分频 111 :128分频 | |
BIT4:T3起止控制位 | |
BIT3:溢出中断掩码 0:关中断溢出 1:开中断溢出 | |
BIT2:清计数值,高电平有效 | |
BIT1,BIT0:T3模式选择: 00 :自动重装 0X00 -0XFF | |
T3CCTL0(0XCC) | T3通道 0 捕获/比较控制寄存器 |
BIT6:T3通道 0 中断掩码 0:关中断,1:开中断 | |
BIT5,BIT4,BIT3:T3通道 0 比较输出模式选择 | |
BIT2:T3通道 0 模式选择: 0:捕获 1:比较 | |
BIT1,BIT0:T3通道 0 捕获模式选择: 00 没有捕获 01 上升沿捕获 10 下降沿捕获 11 边沿捕获 | |
T3CC0(0XCD) | T3 通道 0 捕获 / 比较寄存器 |
T3CCTL1(0XCE) | T3通道 1 捕获/比较控制寄存器 |
BIT6:T3通道1中断掩码 0:关中断,1:开中断 | |
BIT5,BIT4,BIT3:T3通道 1 比较输出模式选择 | |
BIT2:T3通道 1 模式选择: 0:捕获 1:比较 | |
BIT1,BIT0:T3通道 1 捕获模式选择: 00 没有捕获 01 上升沿捕获 10 下降沿捕获 11 边沿捕获 | |
T3CC1(0XCF) | T3 通道 1 捕获 / 比较寄存器 |
定时器T3有 4种工作模式:分别是自由、正计数 /倒计数模式、 倒计数模式。
(2)代码实现(使用自由模式)
无法解析此远程名称: 'util.cnblogs.com#include<ioCC2540.h> #define LED1 P1_0 //定义LED1,方便查阅代码 unsigned char count=0; void Init()//初始化函数 { P1SEL = 0X00; //实现LED的初始化 P1DIR = 0X01; P1INP = 0X00; LED1 = 0; T3CTL = 0X08; //开溢出中断 T3IE = 1; //开纵中断和T3中断 T3CTL |= 0XE0; //开128分频,128/(16*10e6)*N=0.5s,N=65536; T3CTL &= ~0x03; //自动重装 貌似溢出的数值改变成256.。不懂为什么。。 T3CTL |= 0X10; //2分频(16MHZ),然后就是开始启动 EA=1; //打开中断总闸 } void main(void) { Init(); while(1) { } } #pragma vector = T3_VECTOR __interrupt void fu() { IRCON = 0x00; //清除中断标志 count++; if(count>250) { count = 0; LED1=~LED1; } }