博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CC2530入门教程-04】CC2530的定时/计数器原理与应用
阅读量:4670 次
发布时间:2019-06-09

本文共 2246 字,大约阅读时间需要 7 分钟。

第4课  CC2530的定时/计数器原理与应用

广东职业技术学院  欧浩源

一、定时/技术器的基本原理

        定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设。

        定时/计数器的最基本工作原理是进行计数不管是定时器还是计数器,本质上都是计数器,可以进行加1(减1)计数,每出现一个计数信号,计数器就会自动加1(自动减1),当计数值从0变成最大值(或从最大值变成0)溢出时,定时/计数器就会向CPU提出中断请求。

 

二、CC2530的定时/计数器

        CC2530共有5个定时/计数器,其中定时器1是一个16位的定时器,为CC2530中功能最全的一个定时/计数器,在 应用中应优先选用。定时器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的模模式实现1秒定时

【1】设置定时器1的最大计数值

        定时器1共有5对T1CCxH和T1CCxL寄存器,分别对应通道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);}

 

 

        

 

转载于:https://www.cnblogs.com/ALittleBee/p/7078252.html

你可能感兴趣的文章
Oracle创建视图的一个问题
查看>>
(一)线性表
查看>>
hdu 1003 Max Sum (DP)
查看>>
mysql增备
查看>>
[APIO2015]雅加达的摩天楼
查看>>
andorid之帧布局FrameLayout
查看>>
(转,记录用)jQuery页面加载初始化的3种方法
查看>>
C++常量的引用 const
查看>>
51nod 1101 换零钱 【完全背包变形/无限件可取】
查看>>
python单例设计模式(待补充)
查看>>
Binary Tree Inorder Traversal
查看>>
HDU 1394 Minimum Inversion Number (数据结构-线段树)
查看>>
ansible-playbook && Roles && include
查看>>
String s String s=null和String s="a"区别
查看>>
[Alpha阶段]第二次Scrum Meeting
查看>>
关于Java 8 forEach
查看>>
.NET设计模式(1):1.1 单例模式(Singleton Pattern)
查看>>
创建模态对话框和非模态对话框
查看>>
08-图8 How Long Does It Take
查看>>
二维数组中最大连通子数组
查看>>