欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第二部分 基础篇-第4章 定时器-CC2530 中断方式使用定时器T1

程序员文章站 2022-06-09 19:28:38
...

1 理论分析

为定时器分配了一个中断向量。当下列定时器事件之一发生时,将产生一个中断请求:
 计数器达到最终计数值(溢出或回到零)
 输入捕获事件
 输出比较事件
寄存器状态寄存器 T1STAT 包括最终计数值事件和五个通道比较/捕获事件的中断标志。仅当设置了相应的中断屏蔽位和 IEN1.T1EN 时,才能产生一个中断请求。中断屏蔽位是 n 个通道的 T1CCTLn.IM 和溢出事件 TIMIF.OVFIM。如果有其它未决中断,必须在一个新的中断请求产生之前,通过软件清除相应的中断标志。而且,如果设置了相应的中断标志,使能一个中断屏蔽位将产生一个新的中断请求。

2 实验详解

2.1实验目的

1)、进一步了解 CC2530 定时器 1;
2)、掌握定时器 1 中断方式的应用;
3)、掌握定时器1 的配置与使用

2.2实验设备

硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:2000/XP/win7 系统,IAR 8.10 集成开发环境

2.3实验相关电路图

第二部分 基础篇-第4章 定时器-CC2530 中断方式使用定时器T1

图1 LED电路图

2.4 实验相关寄存器

本实验本实验配置的是 Timer1 的控制寄存器。具体如何配置看图。
所以,控制字为:T1CTL|=0X0d。

表1 定时器1的控制与状态

第二部分 基础篇-第4章 定时器-CC2530 中断方式使用定时器T1

表2 定时器1的状态

T1STAT(0xAF)-定时器1状态
第二部分 基础篇-第4章 定时器-CC2530 中断方式使用定时器T1

表3 中断标志

第二部分 基础篇-第4章 定时器-CC2530 中断方式使用定时器T1

按照表格寄存器的内容,对Led1 和T1 进行配置。
Led1 配置如下:
P1SEL &=~0x01; //配置P1.0 为通用IO 口
P1DIR |= 0x01; //配置P1.0 为输出
T1 配置如下:
T1CTL = 0x0d; //128 分频,自动重装0x0000-0xFFFF
当然,由于用到的是中断方式,所以,要打开定时器 1 中断和总中断,即:
T1IE = 1;( 开 Timer1 中断)
EA = 1;( 开总中断)

注意:由于是 128 分频,则计一次数需要时间 t=128/16000000, 如果我们希望得到一个 0.5s 的延时,那么 128/16000000*N=0.5S,就得计 N=65200 次数。而我们又将 Timer1设置为自动重装 0x0000—0xFFFF,即产生一次溢出中断计数 0.9948 次,约等于 1 次,所以,我们要累加 1 次溢出中断才让 LED1 取反。

2.5参考代码

/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char

//定义控制LED灯的端口
#define LED1 P1_0   //定义LED1为P1_0口控制

/**函数声明*********************************************************************/
void Delayms(uint xms);     //延时函数
void InitLed(void);     //LED_IO初始化函数
void InitT1(void);              //Timer1中断方式初始化函数

/**全局变量*********************************************************************/
//由于是中断函数用到,一定要定义为全局变量
uint count=0;//用于计算溢出中断的次数

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{   
    InitLed();      //调用初始化函数
    InitT1();
    while(1)
    {
    }
}

/**
  * @brief     中断服务函数
  * @param     None
  * @retval    None
  */
#pragma vector = T1_VECTOR  //Timer1中断向量
 __interrupt void T1_ISR(void) 
{ 
    IRCON = 0x00;           //清中断标志, 也可由硬件自动完成 
    if((++count)==1)        //1次中断后LED取反,闪烁一轮(0.5 秒时间) 
    {          
        count = 0;          //计数清零 
        LED1=~LED1;
    } 
}

/**
  * @brief     普通延时函数
  * @param     xms 延时长度
  * @retval    None
  */
void Delayms(uint xms)  
{
    uint i,j;
    for(i=xms;i>0;i--)
      for(j=587;j>0;j--);
}


/**
  * @brief     LED初始化函数
  * @param     None
  * @retval    None
  */
void InitLed(void)
{
    P1DIR |= 0x01;  //P1_0义为输出
    LED1 = 1;       //LED1灯熄灭
}


/**
  * @brief     Timer1中断方式初始化函数
  * @param     None
  * @retval    None
  */
void InitT1(void)
{     
    T1CTL|=0X0d;               //128分频,*运行模式 
    T1IE = 1;                  //开Timer1中断
    EA = 1;                    //开总中断
}

2.6实验现象

通过定时器中断方式使得LED1定时闪烁。

本章参考代码

点击进入

相关标签: 中断 CC2530