https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4295537.html

实验内容

分别使用定时器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 中断标志位
Bit3: 定时器 1 通道 3 中断标志位
Bit2: 定时器 1 通道 2 中断标志位
Bit1: 定时器 1 通道 1 中断标志位
Bit0: 定时器 1 通道 0 中断标志位
IRCON(0XCO) 中断标志位寄存器;

(2)定时器T1的初始化:

  1. T1CTL=0X0d;
  2. T1STAT=0X21;

(3)代码实现

  1. #include<ioCC2540.h>
  2. #define LED1 P1_0 //定义LED1,方便查阅代码
  3. void Init()//初始化函数
  4. {
  5. P1SEL = 0X00; //实现LED的初始化
  6. P1DIR = 0X01;
  7. P1INP = 0X00;
  8. LED1 = 0;
  9. T1CTL = 0X0d; //128分频,自动重装0X0000-0XFFFF;,时钟频率为16MHZ
  10. T1STAT = 0X21; //通道0,中断有效
  11. EA=1;
  12. }
  13. void main(void)
  14. {
  15. Init();
  16. unsigned char count=0;
  17. while(1)
  18. {
  19. if(IRCON>0) //检查是否置位为1
  20. {
  21. IRCON=0;
  22. count++; //由于分频128后,已经满足1s的闪烁周期。
  23. if(count>=1)
  24. {
  25. count=0;
  26. LED1=~LED1;
  27. }
  28. }
  29. }
  30. }

【CC2540】定时器 - 图1

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
01 : DOWN ( 从 T3CC0 到 0X00 计数一次 )
10 : 模计数(反复从 0X00 到 T3CC0 计数)
11 : UP/DOWN( 反复从 0X00 到 T3CC0计数再到 0X00)
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种工作模式:分别是自由、正计数 /倒计数模式、 倒计数模式。
【CC2540】定时器 - 图2
(2)代码实现(使用自由模式)

  1. #include<ioCC2540.h>
  2. #define LED1 P1_0 //定义LED1,方便查阅代码
  3. unsigned char count=0;
  4. void Init()//初始化函数
  5. {
  6. P1SEL = 0X00; //实现LED的初始化
  7. P1DIR = 0X01;
  8. P1INP = 0X00;
  9. LED1 = 0;
  10. T3CTL = 0X08; //开溢出中断
  11. T3IE = 1; //开纵中断和T3中断
  12. T3CTL |= 0XE0; //开128分频,128/(16*10e6)*N=0.5s,N=65536;
  13. T3CTL &= ~0x03; //自动重装 貌似溢出的数值改变成256.。不懂为什么。。
  14. T3CTL |= 0X10; //2分频(16MHZ),然后就是开始启动
  15. EA=1; //打开中断总闸
  16. }
  17. void main(void)
  18. {
  19. Init();
  20. while(1)
  21. {
  22. }
  23. }
  24. #pragma vector = T3_VECTOR
  25. __interrupt void fu()
  26. {
  27. IRCON = 0x00; //清除中断标志
  28. count++;
  29. if(count>250)
  30. {
  31. count = 0;
  32. LED1=~LED1;
  33. }
  34. }