cc2530-时钟1(timer1)模模式

原链接      http://blog.163.com/a_hui8/blog/static/2058303072012628105311873/


模模式需要开启通道0的输出比较模式,否则计数器只有到了0XFF时才会产生溢出中断(相应的产生溢出标志),也就是如果没有设置通道0的输出比较模式,计数器的值到达T1CC0后,不会产生溢出中断(相应的溢出标志不会置1),这点需要特别注意。


记得把TICCTL0的IM位打开!!!!   否者中断请求被屏蔽

#include <ioCC2530.h>
#define LED1 P1_0   //定义LED1为P1.0  
#define S1   P0_1   //定义S1为P0.1

void INIT_LED(void)
{
  P1SEL &= ~0x01;   //设P1.0为普通I/O功能
  P1DIR |= 0x01;    //设P1.0为输出方向
  LED1 = 0;         //将LED1点亮
}

void INIT_IO(void)
{
  P0SEL &= ~0x02;     //设P0.1(S1)为普通I/O功能
  P0DIR &= ~0x02;      //设P0.1(S1)为输入
  P0IFG &= ~0x02;      //设P0.1(S1)状态标志寄存器清零
  P0IEN |= 0x02;          //设P0.1(S1)中断使能
  IEN1 |= 0x20;            //开P0中断
  EA = 1;                     //总中断EA为中断使能
}

void INIT_Timer1()

  T1CTL = 0x00;           //1分频、停止运行
  T1CCTL0 |= 0x04;      //设定timer1通道0输出比较模式
  T1CC0L = 0x24;
  T1CC0H = 0xF4;
  IRCON &= ~0x02;
}

//P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 

    if((P0IFG&0x02) == 0x02)     //P0.1(S1)状态标志寄存器触发  (P0IFG的值为0XFF,不解)
    { 
        for(int i =0 ;i<8000 ;i++);
        P0IFG &= ~0x02;     //P0.1(S1)状态标志寄存器清零
        if(T1CTL == 0x0e)
          T1CTL = 0x00;     //1分频 暂停运行
        else
          T1CTL = 0x0e;     //128分频 模模式
    }
}

void main( void )
{
  INIT_IO();
  INIT_LED();
  INIT_Timer1();
  LED1 = 1 ;
  int count = 0;
  while(1)
  {
    if(IRCON &= 0x02)    
    {
      count++;
      if(count%2==0)
      {
         LED1 = !LED1;
         IRCON &= ~0x02 ;
         count = 0;
      }
    }
  }
}

上面为模模式的查询法,下面为模模式的中断法

#include <ioCC2530.h>
#define LED1 P1_0   //定义LED1为P1.0  
#define S1   P0_1   //定义S1为P0.1 
int count = 0;

void INIT_LED(void)
{
  P1SEL &= ~0x01;   //设P1.0为普通I/O功能
  P1DIR |= 0x01;    //设P1.0为输出方向
  LED1 = 0;         //将LED1点亮
}

void INIT_IO(void)
{
  P0SEL &= ~0x02;     //设P0.1(S1)为普通I/O功能
  P0DIR &= ~0x02;     //设P0.1(S1)为输入
  P0IFG &= ~0x02;     //设P0.1(S1)状态标志寄存器清零
  IRCON &= ~(0x20);   //设P0状态标志位清零
  P0IEN |= 0x02;      //设P0.1(S1)中断使能
  IEN1 |= 0x20;       //开P0中断

}

void INIT_Timer1()

  T1CTL = 0x00;     //1分频、停止运行
  T1CCTL0 |= 0x04;  //设定timer1通道0输出比较模式
  T1CC0L = 0x24;
  T1CC0H = 0xF4;
  TIMIF |= 0X40;  //设定timer1中断开启
  IEN1 |= 0x02;   //设定timer1中断开启
  //清除中断标志
  IRCON &= ~0x02;
  T1STAT &= ~0x01;  //第5位计数溢出标志呢
}

#pragma vector = T1_VECTOR 
__interrupt void TIMER1_ISR(void) 

    
count++;
    if(count%2 == 0)
    {
       LED1 = !LED1;
       count = 0;
    }
    //清除中断标志
    IRCON &= ~0x02;
    T1STAT &= ~0x01; 

    //产生的中断是定时器1通道0中断,而不是定时器1的溢出中断,故只需要清除T1STAT的第1位,不需要清除第5位

}

//P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 

    if((P0IFG&0x02) == 0x02)     //P0.1(S1)状态标志寄存器触发
    {
        for(int i =0 ;i<8000 ;i++);
        P0IFG &= ~0x02;     //P0.1(S1)状态标志寄存器清零
        if(T1CTL == 0x0e)
          T1CTL = 0x00;     //1分频 暂停运行
        else
          T1CTL = 0x0e;     //128分频 模模式
    }
    IRCON &= ~(0x20);
}

void main( void )
{
    
INIT_LED();
    INIT_IO();
    INIT_Timer1();
    EA = 1;             //开总中断
    while(1);
}



以下是基于CC2530的定时器1模式中断1ms的代码示例,你可以根据自己的需求进行修改: ```c #include "ioCC2530.h" #define TIMER_TICKS_1MS 32678 // 定时器计数器为16位,时钟频率为32.768kHz,计数1ms需要的时钟周期数为:32768/1000=32.768 void Timer1_Init(void) { T1CTL |= 0x0C; // 选择模式3,即模式1+模式2 T1CCTL0 |= 0x44; // 选择模式1,设置为定时器模式,并启用中断 T1CC0L = TIMER_TICKS_1MS & 0xFF; // 设置计数器初始值低8位 T1CC0H = TIMER_TICKS_1MS >> 8; // 设置计数器初始值高8位 T1IE = 1; // 使能定时器1中断 T1CNTL = 0; // 将计数器清零 T1CNTH = 0; T1CTL |= 0x02; // 启动定时器1 } #pragma vector = T1_VECTOR __interrupt void Timer1_ISR(void) { T1IF = 0; // 清除定时器1中断标志 // 在此处添加需要执行的代码,每1ms执行一次 } int main(void) { Timer1_Init(); // 初始化定时器1 EA = 1; // 全局使能中断 while(1) { // 在此处添加需要执行的代码,不需要关心定时器1 } } ``` 在以上示例代码中,定时器1使用了模式3,即同时使用模式1和模式2。模式1是定时器模式,使用定时器计数器进行计时,并在计时结束时产生中断;模式2是比较模式,使用比较器进行比较,并在比较器输出变化时产生中断。在模式3下,定时器1同时使用了定时器模式和比较模式,每1ms产生一次中断。需要注意的是,中断服务函数中应尽量不要使用过多的计算和延时操作,以免影响定时器1的计时精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值