当前位置: 代码迷 >> 综合 >> CC2530 定时器应用
  详细解决方案

CC2530 定时器应用

热度:64   发布时间:2024-03-06 18:54:52.0

CC2530 定时器应用

  • 任务分析
  • 知识储备
    • 相关寄存器知识
      • T1CTL-定时器1的控制和状态
      • T1CCTL0-定时器1通道0捕获/比较控制
      • T1CC0H和T1CC0L-定时器1通道0捕获/比较值的高低位
      • 相关寄存器总结
  • 代码
    • 部分代码分析
      • 定时器初始化函数
      • 中断回调函数

任务分析

定时器控制流水灯

知识储备

相关寄存器知识

由于我手上的开发板LED1,LED2,KEY1对应的引脚分别是P1_0,P1_1,P1_2。所以我下面主要介绍和P1相关的寄存器。其他端口类似。

T1CTL-定时器1的控制和状态

在这里插入图片描述
T1CTL = 0x0e即可使定时器1处于模模式,128分频

T1CCTL0-定时器1通道0捕获/比较控制

在这里插入图片描述
即令T1CCTL0 |= 0x04;即可开启定时器1通道0的比较模式

T1CC0H和T1CC0L-定时器1通道0捕获/比较值的高低位

在这里插入图片描述
即令T1CC0L = 0xd4;T1CC0H=0x30;就可以使定时器每过0.1s触发一次中断
根据公式
在这里插入图片描述
(CC2530晶振频率为16MHz。上面我们定义了128分频,所以定时器计数周期如上.)

最后再加上下面两行代码即可

  T1IE = 1;//定时器1中断使能EA = 1;//开启总中断

相关寄存器总结

1.开启总中断EA = 1;
2.开启定时器中断T1IE = 1;
3.设定定时器1为模模式,128分频T1CTL = 0x0e;
4.开启定时器1通道0的比较模式T1CCTL0 |= 0x04;
5.设定定时器1通道0捕获/比较值的高低位T1CC0L = 0xd4;T1CC0H = 0x30;

代码

#include <ioCC2530.h>#define KEY1 P1_2 
#define LED1 P1_0
#define LED2 P1_1unsigned int TimeFlag = 0;void PortInit()
{
    P1SEL &= ~0x07;P1DIR |= 0x03;P1DIR &= ~0x04;
}void Timer1Init()
{
    T1CC0L = 0xd4;//最大计数值的低8位T1CC0H = 0x30;//最大计数值的高8位//系统频率是16MHz,下面T1CTL = 0x0e定义了分频系数是128,可以根据计算公式算出来//0.1s的值是0x30d4T1CCTL0 |= 0x04;//开启输出0的通道比较模式T1IE = 1;//定时器1中断使能EA = 1;//开启总中断T1CTL = 0x0e;//模模式,128分频
}void delay(unsigned int i)
{
    while(i--);
}#pragma vector = T1_VECTOR
__interrupt void T1_vector()
{
    T1STAT &= ~0x20;TimeFlag++;if(TimeFlag == 10){
    LED1 = ~LED1;}
}void main()
{
    PortInit();Timer1Init();LED1 = 1;LED2 = 1;while(1){
    }
}

部分代码分析

定时器初始化函数

void Timer1Init()
{
    T1CC0L = 0xd4;//最大计数值的低8位T1CC0H = 0x30;//最大计数值的高8位//系统频率是16MHz,下面T1CTL = 0x0e定义了分频系数是128,可以根据计算公式算出来//0.1s的值是0x30d4T1CCTL0 |= 0x04;//开启输出0的通道比较模式T1IE = 1;//定时器1中断使能EA = 1;//开启总中断T1CTL = 0x0e;//模模式,128分频
}

中断回调函数

#pragma vector = T1_VECTOR
__interrupt void T1_vector()
{
    T1STAT &= ~0x20;TimeFlag++;if(TimeFlag == 10){
    LED1 = ~LED1;}}

其中 T1STAT &= ~0x20; 作用置1定时器1数据溢出标志位
在这里插入图片描述