CC2530通过定时器3中断方式每10ms输出一个下降沿

Request/Task:

由于项目中硬件电路迟迟未到位,故利用一个CC2530板子的P0.0口作为输出,模拟10ms一次的下降沿中断,给调试电路板。

Idea

定时器3和定时器4是两个8位定时器,一般上,控制寄存器TxCTL被用来控制定时器模式。本文选用的是自由运行模式,计数器从0x00开始,在每一个活动时钟边沿递增,当计数器到达0xFF时,计数器重置为0x00并继续递增。当最终计数器值到达0xFF时(如发生溢出),中断标志位TIMIF.TxOVFIF将被置1。如已设置相应中断屏蔽位TxCTL.OVFIM,产生中断请求。所以需要设置的关于定时器3的寄存器有:T3CTL(定时器3控制)、IRCON(中断标志)、T3IE(定时器3中断使能)、EA(总中断使能)。

Implement

/****************************************************************************
* 文 件 名: main.c
* 描    述: 定时器T3通过中断方式控制每10ms输出一个下降沿
****************************************************************************/
#include 

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P0_0       // P0.0口控制LED1

uint count;             //用于定时器计数

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P0DIR |= 0x01;           //P0.0定义为输出
    LED1 = 1;                //使LED1灯上电默认为熄灭     
}

/****************************************************************************
* 名    称: InitT3()
* 功    能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitT3()
{
    T3CTL |= 0x08 ;          //开溢出中断     
    T3IE = 1;               //开总中断和T3中断
    T3CTL &= ~0x80;
    T3CTL |= 0x60;        //8分频,8/16000000*N=0.005S,N=10000
    T3CTL &= ~0x03;          //自动重装 0x00->0xff  10000/255=39(次)
    T3CTL |= 0x10;           //启动
    EA = 1;                  //开总中断
    
}

//定时器T3中断处理函数
#pragma vector = T3_VECTOR 
__interrupt void T3_ISR(void) 
{ 
    IRCON = 0x00;            //清中断标志, 也可由硬件自动完成 
    if(count++ > 35)   //约为0.005 秒时间
    {                        //经过示波器测量确保精确
        count = 0;           //计数清零 
        LED1 = ~LED1;        //改变LED1的状态
    } 
}


/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();		 //设置LED灯相应的IO口
    InitT3();            //设置T3相应的寄存器
    while(1)
    {};
}

Conclusion

通过示波器实际测量,发现当定时35次比计算得到的39次更加精确。

Problem

利用哪一种工作模式可以给定时器3赋初值,并循环计数?

参考文章: 点击打开链接


 
 

你可能感兴趣的:(ZigBee)