首页 > 代码库 > TI CC2530基础实验(定时器1查询方式——自由运行模式)

TI CC2530基础实验(定时器1查询方式——自由运行模式)

本实验实现通过CC2530的定时器1(16位)查询方式控制LED1以1S的周期性闪烁,此实验使用的三个寄存器T1CTL(定时器1控制寄存器),T1STAT(定时器1状态寄存器),IRCON。

有关CC2530的GPIO基本知识、普通GPIO操作有关寄存器的介绍、IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作——点亮led灯)

电路原理图

技术分享

寄存器分析

1、定时器1控制寄存器

技术分享

定时器1的T1CTL寄存器下的模式分析

自由运行模式】:
在自由运行操作模式下,计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到0xFFFF(溢出)后,计数器重新载入0x0000,继续递增它的值,如下图所示。当达到最终计数值0xFFFF,设置标志IRCON.T1IF和T1STAT.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔,输出信号频率
技术分享
模模式】:

当定时器运行在模模式,16位计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到T1CC0(溢出),寄存器T1CC0H:T1CC0L保存的最终计数值,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值(0xFFFF)时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。模模式可以用于周期不是0xFFFF的应用程序。计数器的操作展示如下图:

技术分享

正计数/倒计数模式】:

在正计数/倒计数模式,计数器反复从0x0000开始,正计数直达到T1CC0H:T1CC0L保存值。然后计数器将倒计数指导0x0000,如下图所示。这个定时器用于周期必须是对称输出脉冲而不是0xFFF的应用程序,因此允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式,当达到最终计数值时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。

技术分享

2、定时器1状态寄存器

技术分享

3、中断标志4寄存器

技术分享

程序——定时器1采用自由运行模式

#include <ioCC2530.h>

/************************************
 * 程序说明:LED1以1S的周期性闪烁
 ***********************************/

#define LED1 P1_0

/********************************************************* 
 * 函数描述:初始化LED1
 * 备注:系统不配置工作时钟时使用内部 RC 振荡器,即16MHz
 *********************************************************/
void LED1Init(void)
{
  P1SEL &= ~0x01;  //功能:普通I/O
  P1DIR |= 0x01;   //方向:输出
  LED1 = 1;        //使其属于灭状态
}

/*********************************** 
 * 函数描述:定时器1初始化
 * 设置:分频、运行模式
 **********************************/ 
void T1Init(void)
{
  T1CTL |= 0x0c;     //设置为128分频
  T1CTL |= 0x01;     //设置为自由运行模式,从0x0000到0xFFFF反复计数
}

void main()
{
  unsigned char count = 0;//用来记录定时器溢出次数
  LED1Init();
  T1Init();
  for (;;)
  {
#if 1
    if ((T1STAT & 0x20) > 0)//判断T1STAT的bit5
    {
      T1STAT &= ~0x20;
      if (++count == 1)
      {
        count = 0;
        LED1 = !LED1;
      }
    }
#else 
    if ((IRCON & 0x02) > 0)//判断IRCON的bit1
    {
      IRCON &= ~0x02;//清除中断标志
      IRCON = 0;
      if (++count == 1)
      {
        count = 0;
        LED1 = !LED1;
      }
    }
#endif
  }
}

系统在不配置工作频率时默认为2分频,即32M/2=16M,所以定时器每次溢出时T=1/(16/128)*65536≈0.5s,其中128是设置定时器1的分频,65536是0x0000~0xFFFF总共递增次数,所以总时间Ta=T*count=0.5*1=0.5s切换1次状态,这样看起来才是1S删除1次。

注意:每创建一个新工程都要配置IAR(做基础实验),TI CC2530基础实验(普通GPIO操作——点亮led灯)也有IAR相关配置步骤

总结:

定时器1在采用自由运行模式从0x0000计数开始,到0xFFFF溢出,其当定时器1采用128分频,在默认的工作频率下,一次溢出约为0.5s。

定时器1查询方式是通过判断T1STAT.OVFIF和IRCON.T1IF是否置1来判断定时器是否溢出。


TI CC2530基础实验(定时器1查询方式——自由运行模式)