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 <ioCC2530.h>

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赋初值,并循环计数?

参考文章: 点击打开链接



                
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值