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

2019-04-14 16:58发布

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赋初值,并循环计数?
参考文章:点击打开链接