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