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

TI CC2530基础实验(定时器3中断方式——自由运行模式)

本实验实现通过CC2530的定时器3(8位)查询方式控制LED1以1S的周期性闪烁,此实验使用有关定时器3的2个寄存器T3CTL(定时器3控制寄存器),IEN1(中断使能1寄存器)。

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

原理图

技术分享

寄存器分析

技术分享

技术分享

程序

#include <ioCC2530.h>

/***********************************************
 * 程序说明:T3中断方式控制LED1以1S的周期性闪烁
 **********************************************/

#define LED1 P1_0

unsigned char count = 0;//用来记录定时器溢出次数

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

/*********************************** 
 * 函数描述:定时器3初始化
 **********************************/ 
void T3Init(void)
{
  EA = 1;              //不管三七二十一,先开启总中断
  /*使能定时器3中断*/
  IEN1  |= 0x08;       //或T3IE = 1;
  /*使能溢出中断,默认是使能溢出中断*/
  T3CTL |= 0x08;      //查看T3CTL寄存器,需要使能溢出中断
  
  /*设置分频、自由运行模式*/
  T3CTL |= 0xE0;      //128分频
  T3CTL &= ~0x03;     //自由运行模式
  
  /*设置好定时器3,开启定时器3*/
   T3CTL |= 0x10;      //查看T3CTL寄存器,需要启动定时器
}

/*********************************** 
 * 函数描述:定时器3中断处理函数
 **********************************/ 
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
  //IRCON = 0; //清中断,似乎硬件帮我们将IRCON对应的中断标志位清除了
  if (++count > 254)
  {
    count = 0;
    LED1 = !LED1;
  }
}

void main()
{
  LED1Init();
  T3Init();
  for (;;);
}

其中定时器3中断服务程序中的254是怎么来的呢?

系统在不配置工作频率时默认为2分频,即16M=32M/2。1/(16M/128)*N = 0.5s(每隔0.5秒一次开,一次关,这样看起来就像以1S周期性闪烁),得到 N = 65200,即而每次溢出递增次数为256(0x00~0xFF),所有总共需要溢出的次数 = 65200/256 = 254.

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


总结:

1、当系统不配置工作频率时,即为16M工作频率下,定时器每递增需要时间为1/(16000000/128) = 8us。当采用自由运行模式下,每溢出一次需要时间为:2ms

2、定时器3采用中断方式,初始化需要做的事情:1)开启总中断 EA = 1;  2)使能定时器3中断   3)使能溢出中断(默认使能)   4)设置分频、运行模式    5)最后启动定时器3 

TI CC2530基础实验(定时器3中断方式——自由运行模式)