打印
[Zigbee]

CC2530 中断方式使用定时器T1

[复制链接]
796|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-7-31 11:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1 理论分析
为定时器分配了一个中断向量。当下列定时器事件之一发生时,将产生一个中断请求:

        计数器达到最终计数值(溢出或回到零)
        输入捕获事件
        输出比较事件

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


使用特权

评论回复

相关帖子

沙发
gwsan|  楼主 | 2019-7-31 11:26 | 只看该作者
2 实验详解
2.1实验目的
1)、进一步了解 CC2530 定时器 1;
2)、掌握定时器 1 中断方式的应用;
3)、掌握定时器1 的配置与使用

2.2实验设备
硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

使用特权

评论回复
板凳
gwsan|  楼主 | 2019-7-31 11:26 | 只看该作者
2.3实验相关电路图

图1 LED电路图

使用特权

评论回复
地板
gwsan|  楼主 | 2019-7-31 11:27 | 只看该作者
2.4 实验相关寄存器
本实验本实验配置的是 Timer1 的控制寄存器。具体如何配置看图。
所以,控制字为:T1CTL|=0X0d。

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


表2 定时器1的状态
T1STAT(0xAF)-定时器1状态



表3 中断标志


按照表格寄存器的内容,对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 取反。


使用特权

评论回复
5
gwsan|  楼主 | 2019-7-31 11:27 | 只看该作者
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;                    //开总中断
}

使用特权

评论回复
6
conjunction| | 2019-7-31 14:05 | 只看该作者
感谢楼主分享!很不错的经验

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

3434

帖子

1

粉丝