CC2530定时器使用笔记

最近在用2530的定时器做捕捉和生成pwm,其中一块2530负责捕捉,另一块2530负责生成pwm,整理下笔记,方便以后查阅。


一、普通定时

使用定时器来定时将tick自加,获得更精确的时间。代码如下(在其他地方将系统的时钟配置了32M,此处未贴出),说明如下。

1,本例中定时器4的分频值为64,频率为2us,即每隔2us,T4CNT的值加1,直接写入0xC0是为了将其他位清除。
2,定时器的模式选择。简单来说,自由模式是从0到0xFF,倒计数是从T4CC0到0,模模式是从0到T4CC0,正反计数是从0到T4CC0再到0,所以在T4CC0相同的情况下,正反计数模式进入中断的时间为倒计数以及模模式的时间的两倍,当然是在允许中断的情况下,T4CCTLn的bit6为中断使能位。

3,本例子在T4的中断服务函数中将tick值加一(未贴出),每次进中断的时间为2us(定时器基础时钟)*10(T4CC0 的值)*2(正反计数所以乘以2)=40us,在外部获取tick 的值即可计算出精确时间。


static void Init_Timer4(void)  
{ 
      T4CTL = 0xc0;    //定时器预分频值 64;32M/64 = 500k HZ   即2us
      T4CTL |= 0x04;    //计数器清零
      T4CTL |= 0x3;     // 3 使用正反计数模式
    T4IE = 0;         // Disable interrupt    
    T4CCTL0 = (1<<6) | (1<<2);  //使能中断,设置比较模式
    T4CC0 = 10;      // 10*2 = 20 次产生一次中断 = >  gettick的单位为40us(20*2us)
    
    T4CTL = T4CTL | (1<<4);   // Start timer
    T4IE = 1;   //Enable interrupt
}


二、输入捕获。
使用定时器3来捕获,代码如下。需要注意的有以下几个点。
1,确定定时器使用的位置。
2,确定所使用的通道对应的io口,并将该io口设置为复用功能。以及方向。
3,根据需要配置T3CTL和 T3CCTL1n即可,


static void Init_CaptureGPIO(void)  
{  
  P1SEL |= (1<<7);      //复用功能  
  P1DIR &= ~(1<<7);     //设置 GPIO 口为输入  
  P1_7 = 1;  
    
  PERCFG |= (1<<5);     //定时器3的备用位置2,必须设置  
  P2SEL  |= (1<<5);     //定时器3优先  
}  
  
static void Init_Timer3(void)  
{  
  T3CTL = 0X00;        //T3溢出中断屏蔽  
  T3CTL |= (1<<7);      //16分频 - 1MHz  
  T3CTL |= (1<<2);      //清除计数器  
  T3CTL |= (1<<3);      //溢出中断使能  
  T3CTL |= (1<<4);      //启动定时器 T3  
    
  T3CCTL1 &= ~(1<<2);     //捕获模式  
  T3CCTL1 |= 0X01;      //上升沿捕获  
  T3CCTL1 |= (1<<6);     //使能通道1中断  
    
  IRCON = 0;          //清除中断标志  
  
  
  T3IE = 1;     //使能定时器3中断  
} 






三,生成pwm。
本例使用定时器1通道4来生成pwm,大致要注意以下几点。
1,首先要配置io口复用,然后是优先级,以及定时器选择的位置。

2,t1定时器是16位的,和t3、t4有一点要不同要注意,T1CCnL写入之后会先缓存,需要紧接着写对应的T1CCnH才能完全部16位数据的写入。


3,T1CTL 的配置同上,不再重复说明。

4,T1CCTL4 的配置比较简单,参考寄存器说明。模式的选择根据需要自行选择。本例选择的模式6,所以t1cnt从0开始计数时,输出高,到达T1CC4(也就是T1CC4H:T1CC4L,这里方便描述简写成T1CC4,T1CC0同理),输出低,并产生t1通道4的中断(如果允许中断的话),然后t1cnt继续加到T1CC0,输出高,自此一个周期完成。所以生成的pwm的高电平时间为0x7d(即T1CC4)*4us(定时器的频率),低电平的时间为(0xfa(即T1CC0)-0x7d(即T1CC4))*4us(定时器的频率),占空比为50%。



5,因为本例需要同时更改pwm的周期和占空比,以达到循环生成两种pwm的目的。而t1通道4进入中断的时候计数还没有结束,这个时候更改t1cc0的值会无效,所以需要使用t1通道1的中断。做法为关闭t1通道4的中断,并将t1通道1的中断打开。配置成模模式,其t1cc1的默认值为0,所以t1通道1进入中断的时候,t1cnt已经归零,此时在T1的中断服务函数中更改t1cc0和t1cc4的值即可,(中断服务函数未贴出)。

uint8 TickInit(void)
{
  
  //T1做PWM产生
  
  P0SEL |= (1<<6);      //复用功能  
  P2SEL = P2SEL | (1<<3);    //定时器1比定时器4优先
  P2SEL &= ~(1<<4);   //定时器1比uart0优先
  PERCFG &= ~(1<<6); //定时器1位置1
  
  T1CTL = 0x00 ; 
  T1CTL |=(3<<2); //128分频   4us
  T1CTL |=(1<<1); //模模式
  
  T1CC0L  = 0xfa; 
  T1CC0H  = 0x00;
  
  
  T1CC4L=0x7d;
  T1CC4H=0x00;  
  
  T1CCTL4 |=(6<<3);// 6 比较模式3  0或者等于T1CC0时,清除输出(输出1)等于T1CC4时设置输出(输出0)
                           
  
  T1CCTL4 |=0x04;  //比较模式。不捕获
                   //定时器开始运行
  T1CCTL4 &= ~(1<<6); //不允许中断
  
  T1CCTL1 |=0x04;  //比较模式。不捕获
  T1CCTL1 |= (1<<6);//允许中断
  T1IE=1; 
}

同时更改周期和占空比的方法是在TI社区上受大牛指点,然后亲测可行,另外,如果文中我有理解的不对的地方欢迎大家指出。

































  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值