CC2530定时器3

CC2530用定时器3完成对LED1周期为2s控制

首先大家需要了解的是CC2530有4个定时器,分别是,定时器1~4和睡眠定时器,我们常用的是定定时器1,可是今天看到课后的习题需要用定时器3,来完成LED1的亮灭周期为2s。


前言

如果我们需要利用定时器3,那无非就是配置定时器3的寄存器,完成对中断函数的操作。相对于定时器1,定时器3有哪些不同?


一、定时器3和定时器1哪些不同?

定时器1是一个 “16位 ”的定时器,具有5个独立的捕获/比较通道。而,定时器3是一个 “8位” 的定时器,它只有2个独立的捕获/比较通道。位数不同,意味着最大值不同,16位的最大值是0xFFFF即65535。而8位的最大值是0xFF即255。

二、使用步骤

1.配置LED1

代码如下(示例):

void LED_Init(void){
    
    
  P0SEL &=~0x03;   //普通IO
  P1DIR|=0x03;    //输出
  
  LED0=0;//熄灭LED0
  LED1=0;//熄灭LED1
}

2.配置定时器3

代码如下(示例):

void Timer1_Init(void){
    
    

  EA = 1;              //总使能
  IEN1  |= 0x08;       //定时器3中断使能
  T3CTL |= 0x08;      //使能中断溢出  
  T3CTL |= 0xE0;      //128分频
  T3CTL &= ~0x03;     //自由运行模式
  T3CTL |= 0x10;       //启动定时器

}

3.完成中断函数

代码如下(示例):

#pragma vector = T3_VECTOR
__interrupt void T3_INT(void){
    
    
  
  if(count++>245)//0.5
  {
    
    
   flag++;
   count=0;
  }
  }

三、完整代码

#include "ioCC2530.h"
#define LED0 (P1_0)
#define LED1  (P1_1)

int count=0;
int flag=0;

/**************延时函数*********/
void delay(unsigned int time)
{
    
    
    unsigned int i;
    unsigned char j;
    for(i=0;i<time ;i++)
    for(j=0;j<240;j++){
    
    
        asm("NOP");
        asm("NOP");
        asm( "NOP" );
    }
}
/**********初始化LED************/
void LED_Init(void){
    
    
  P0SEL &=~0x03;   //普通IO
  P1DIR|=0x03;    //输出
  
  LED0=0;//熄灭LED
  LED1=0;
}

/*********初始化Timer3*********/
void Timer3_Init(void){
    
    

  EA = 1;              //总使能
  IEN1  |= 0x08;       //或T3IE = 1;
  T3CTL |= 0x08;      //使能中断溢出  
  T3CTL |= 0xE0;      //128分频
  T3CTL &= ~0x03;     //自由运行模式
  T3CTL |= 0x10;       //启动定时器

}

void main(void)
{
    
    
   LED_Init();
   Timer3_Init();
   while(1){
    
    
     if(flag==2){
    
    	//flag=2,说明已经熄灭了1s,这时LED1亮
          LED1=1;        
     
     }else if(flag==4){
    
    	//flag=4,说明已经点亮1s,这时熄灭
          LED1=0;
          flag=0;		//flag清零
     
     }
    
   }
   
}

/******中断函数*****/
#pragma vector = T3_VECTOR
__interrupt void T3_INT(void){
    
    
  
  if(count++>245) //当count大于245,意味着0.5s过去了
  {
    
    
   flag++;
   count=0;
  }
  }

总结

第一,对于定时器3的配置,数据手册里有详细的寄存器说明。第二中断函数中,245是通过这样演变而来的
  • 0.5s/(1/16M)*128=62500
  • 62500/255约=245

因为8位的最大值是255,所以除以62500需要245,也就是count大于245时,相当于完成了0.5s的计时

一共就分为3步:

  1. 配置LED
  2. 配置定时器3
  3. 中断函数

多思考,多练习,总会明白的。

猜你喜欢

转载自blog.csdn.net/weixin_52278438/article/details/117250985