打印

【CC2530入门教程-04】CC2530的定时/计数器原理与应用

[复制链接]
3354|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ohy3686|  楼主 | 2017-6-29 17:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ohy3686 于 2017-6-29 17:28 编辑

【CC2530入门教程-04】CC2530的定时/计数器原理与应用

一、定时/技术器的基本原理
    定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设。
    定时/计数器的最基本工作原理是进行计数。不管是定时器还是计数器,本质上都是计数器,可以进行加1(减1)计数,每出现一个计数信号,计数器就会自动加1(自动减1),当计数值从0变成最大值(或从最大值变成0)溢出时,定时/计数器就会向CPU提出中断请求

二、CC2530的定时/计数器
    <1> 定时器116位定时器,是CC2530中功能最全的一个定时/计数器,在应用中应优先选用。该定时器支持输入捕获、输出比较、PWM输出、能触发DMA功能,具有5个独立的捕获/比较通道,每个通道使用一个I/O引脚,能在每个捕获/比较和最终计数上产生中断请求,具有自由运行、模模式和正计数/倒计数三种不同工作模式。
    <2> 定时器2:用于CSMA-CA算法提供定时,用户一般不使用该定时器。
    <3> 定时器3和定时器48位定时器,支持输入捕获、输出比较、具有2个独立的捕获/比较通道,每个通道使用一个I/O引脚,能在每个捕获/比较和 最终计数上产生中断请求,具有自由运行、倒计数、模模式和正计数/倒计数四种不同工作模式。
    <4> 睡眠定时器24位正计数定时器,主要用于设置系统进入和退出低功耗 睡眠模式之间的周期。

三、定时器1的工作模式
    <1> 自由运行模式:计数器从0x0000开始,在每个活动 时钟边沿增加1,当计数器达到0xFFFF时溢出,计 数器重新载入0x0000并开始新一轮的递增计数。该 模式的计数周期是固定值0xFFFF,当达到最终计数 值0xFFFF时,标志位T1IF和OVFIF被设置。
    <2> 模模式:计数器从0x0000开始,在每个活动时钟边 沿增加1,当计数器达到T1CC0寄存器保存的值时溢出,计数器又将从0x0000开始新一轮的递增计数, 模模式的计数周期可由用户自行设定
    <3> 正计数/倒计数模式:计数器反复从0x0000 开始,正计数到TICC0寄存器保存的最终计数值,然后再倒计数回0x0000,当达到最终计数值时,标志位T1IF和OVFIF被设置。

四、CC2530的定时/计数器中断系统
    定时器有3种情况能产生中断请求
    <1> 计数器达到最终计数值(溢出或回到零)。
    <2> 输入捕获事件。
    <3> 输出比较事件(模模式时使用)。
    使用模模式要特别注意,需要开启通道0的输出比较模式,否则计数器的 值达到T1CC0后,是不会产生溢出中断的。
    定时器1~定时器4的中断使能位分别是IEN1寄存器中的T1IET2IET3IET4IE,IEN1寄存器可以进行位寻址
    定时器1~定时器4还分别有一个计数溢出中断屏蔽位TxOVFIM,这些位也可以位寻址的。当这些位被置1时,对应的定时器的计数溢出中断就会被使能。不过用户一般不需要对TxOVFIM位进行设置,因为这些位在CC2530上电复位时的初始值就是1。

五、实训项目:应用定时器1的模模式实现1秒定时

【1】设置定时器1的最大计数值
    定时器1共有5对T1CCxHT1CCxL寄存器,分别对应通道0到通道4。在使用定时器1的定时功能时,使用T1CC0HT1CC0L两个寄存器存放最大计数值的高8位和低8位。
    最大计数值 = 定时时长 / 定时器计数周期。
    在本实训中,系统时钟为16MHz,分频系数为128,要定时0.1秒,最大计数值为:

【2】定时器初始化函数设计
    <1> 将定时器1的最大计数值写入T1CC0
    <2> 通过T1CCTL0寄存器开启定时器1通道0的输出比较模式。
    <3> 设置定时器1的相关中断控制位
    <4> 设置分频系数工作模式并启动定时器。

【3】定时器中断服务函数设计
   <1> 清除T1STAT的中断标志位。
   <2> 累加全局变量count。
   <3> count被10整除即1秒的定时到了。
   <4> 10秒定时到将count清零。

【4】实训项目源代码
#include "ioCC2530.h"

#define  LED5   P1_3
#define  LED6   P1_4
/*===============定时器1初始化函数==================*/
void Init_Timer1()
{
  T1CC0L = 0xd4;        //设置最大计数值的低8位
  T1CC0H = 0x30;        //设置最大计数值的高8位
  T1CCTL0 |= 0x04;      //开启通道0的输出比较模式
  T1IE = 1;             //使能定时器1中断
  T1OVFIM = 1;          //使能定时器1溢出中断
  EA = 1;               //使能总中断
  T1CTL = 0x0e;         //分频系数是128,模模式
}

unsigned char count = 0;  
/*================定时器1服务函数====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
  T1STAT &= ~0x01;      //清除定时器1通道0中断标志
  count++;
  if(count%10 == 0)     //定时1秒到
  {
    LED5 = ~LED5;
  }
  if(count == 100)      //定时10秒到
  {
    LED6 = ~LED6;
    count = 0;
  }
}
/*=================端口初始化函数====================*/
void Init_Port()
{
  P1SEL &= ~0x18;  //将P1_3和P1_4设置为通用I/O端口
  P1DIR |= 0x18;   //将P1_3和P1_4的端口设置为输出
  LED5 = 0;
  LED6 = 0;
}
/*===================主函数=========================*/
void main()
{
  Init_Port();
  Init_Timer1();
  while(1);
}


相关帖子

沙发
ohy3686|  楼主 | 2017-7-2 15:33 | 只看该作者
系列教材完成。

使用特权

评论回复
板凳
hellosdc| | 2017-7-3 22:23 | 只看该作者

使用特权

评论回复
地板
hellosdc| | 2017-7-3 22:23 | 只看该作者
有配套的开发板吗?

使用特权

评论回复
5
ohy3686|  楼主 | 2017-7-4 11:12 | 只看该作者
hellosdc 发表于 2017-7-3 22:23
有配套的开发板吗?

目前没有自主的开发板,暑期准备做几套综合性较强的学习板。

使用特权

评论回复
6
minzisc| | 2017-7-6 17:11 | 只看该作者
这个讲述的非常详细。

使用特权

评论回复
7
minzisc| | 2017-7-6 17:14 | 只看该作者
这个是开发板的教程吗?

使用特权

评论回复
8
ohy3686|  楼主 | 2017-7-7 16:19 | 只看该作者
minzisc 发表于 2017-7-6 17:14
这个是开发板的教程吗?

不是,是我这个学期教学的教案中的实训总结。

使用特权

评论回复
9
lqsgg| | 2017-9-26 14:28 | 只看该作者

使用特权

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

本版积分规则

个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

3027

粉丝