智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

标题: Zigbee之旅(四):几个重要的CC2430基础实验——定时器中断 [打印本页]

作者: znck007    时间: 2014-2-9 10:25
标题: Zigbee之旅(四):几个重要的CC2430基础实验——定时器中断
一、承上启下

  上一篇,我们一起学习了简单的外部中断的实现。有了对中断的实践经验后,我们这一节来讨论一下定时器中断。CC2430共有4个定时器,可分3类:定时器1、定时器2、定时器3/4(3与4的用法一致)。

  由于笔者也是刚刚接触CC2430,涉及定时器的项目实战经验基本为零,所以不打算(也无能为力)深入剖析定时器。本篇仅就定时器1的计数溢出中断用法做简单的实验性探索,对于其输入捕获/输出比较/PWM功能则略去不提。定时器2、定时器3/4也只做简单的功能介绍。等笔者的功力达到一定火候之后,再来站在Zigbee实战经验的高度来完善本篇随笔。

二、定时器1

  定时器1是一个16位定时器,具有定时器/计数器/脉宽调制功能。它有3个单独可编程 输入捕获/输出比较 信道,每一个信道都可以用来当做PWM输出或用来捕获输入信号的边沿时间(关于什么是输入捕获/输出比较,以及如何实现PWM输出,读者可自行查阅CC2430中文手册)。

  定时器有一个很重要的概念:操作模式

  操作模式包含: 自由运行模式(free-running)、 模模式(modulo)和  正计数/倒计数模式(up-down)。

  下面是摘自CC2430中文手册对3种模式的介绍:



  比较三种模式可以看出:自由运行模式的溢出值为0xFFFF不可变;而其他两种模式则可通过对T1CC0赋值,以精确控制定时器的溢出值。本实验正是利用此特性,通过特定的T1CC0,使定时器每隔1s触发一次中断,从而精确控制LED灯的闪烁间隔为1s。


(1)实验简介

  在定时器的modulo模式下,精确控制LED灯的闪烁间隔为1s,即:亮0.5s → 暗0.5s → 亮0.5s → 暗0.5s ...... → 亮0.5s → 暗0.5s(即从暗转亮的时刻间隔为1s)。亮/暗的反转通过溢出中断来实现。

(2)程序流程图




(3)相关计算

  前面已提到,LED灯的状态为:亮0.5s → 暗0.5s → 亮0.5s → 暗0.5s ...... → 亮0.5s → 暗0.5s,而且需用溢出中断实现,因此要求定时器的溢出周期为0.5s。为此,需要计算出相应的溢出值(暂设为N)。

  系统时钟频率选为32MHz,提供给定时器的时钟频率默认为16MHz(两者都由特殊功能寄存器 CLKCON 来配置,具体可查阅CC2430中文手册)。

  对于定时器1,设置其时钟分频为128分频。

  综上所述,可列式如下:

  求出N=62500,其十六进制为 0xF424,即需要设置 T1CC0H=0xF4,T1CC0L=0x24 即可 。


(4)实验源码及剖析
/*
    实验说明:定时器Timer1实验,定时器计数溢出,LED1闪烁
*/

#include

#define led1 P1_0         
#define led2 P1_1         
#define led3 P1_2         
#define led4 P1_3         

/*系统时钟初始化
-------------------------------------------------------*/
void xtal_init(void)
{
  SLEEP &= ~0x04;             //都上电
  while(!(SLEEP & 0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;            //选择32MHz 晶体振荡器
  SLEEP |= 0x04;
}

/*LED初始化
-------------------------------------------------------*/
void led_init(void)
{
  P1SEL  = 0x00;             //P1为普通 I/O 口
  P1DIR |= 0x0F;             //P1.0 P1.1 P1.2 P1.3 输出
  
  led1 = 1;                  //关闭所有LED
  led2 = 1;
  led3 = 1;
  led4 = 1;
}

/*T1初始化
-------------------------------------------------------*/
void timer1_init(void)
{
  EA=1;             //开总中断
  T1IE=1;           //开T1中断
  OVFIM=1;          //开T1溢出中断
  
  T1CC0L=0x24;      //溢出值低8位
  T1CC0H=0xF4;      //溢出值高8位
  
  T1CTL = 0x0e;     //128分频;modulo模式(0x0000->T1CC0);开始运行;
  T1IF=0;           //清中断标志  
}

/*主函数
-------------------------------------------------------*/
void main(void)
{
  xtal_init();
  led_init();
  timer1_init();

  while(1);             //等待溢出中断
}

/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vector=T1_VECTOR
__interrupt void T1_ISR(void)
{
  EA=0;               //关中断
  
  led1 = !led1;       //LED灯反转

  EA=1;               //开中断
  
  T1CTL &= ~0x10;     //清中断标志
}

  OK,编译程序并在线调试,开发板上的LED1如期闪烁起来,感觉闪烁间隔大概在1s。但这还不足以证明实验的成功,若能严格测定间隔为1s就完美了~ 于是我打开WIN 7的时钟(点击任务栏右边的时间即可)。一边看着秒针,一边用眼角余光瞄着LED1的闪烁。结果是:在两分钟内,两者的步调基本完全一致(这种精度还可以容忍~)。到此,实验才可以说基本完工,嘿嘿~


三、定时器2

  定时器2又称 MAC定时器,是专门为支持IEEE 802.15.4 MAC 中的事件跟踪协议而特别设计的。该定时器具有一个可以用来记录已经发生的周期数的8位溢出计数器;有一个16位捕获寄存器,用来记录一个帧开始定界符接收/发送的精确时间或者传输完成的精确时间;还含有一个16位输出比较寄存器,用来在特定时间对无线模块产生各种命令选通信号(开始接受,开始发送等)。

四、定时器3/4

  定时器3/4是8位定时器,具有定时器/计数器/PWM功能。T3/T4有2个输出比较信道,每个信道都可用来当做PWM输出。

五、结语

  本节主要学习了定时器1的计数溢出中断的方法,实现了精确控制LED灯闪烁间隔为1s。对其他几个定时器只是一笔带过,以后再回头补充。下一节,我们来介绍关于CC2430串口通信的相关内容。



作者: 他天堂里hgm    时间: 2015-7-4 20:10
Tao宝直招。。打发无聊时间。。赚点。。零花钱...tao宝需要招纳工作。。人员。。。适合带孩子妈妈,宅男女。学生。。上班族都可以喔,了解详情。加 。扣扣 【945.199.839 】。日新一天算! {一百 到 三百百
作者: ttwpz    时间: 2015-10-3 19:05
鼓励一下,帖子非常好













作者: tswtj    时间: 2015-11-1 21:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: okz348    时间: 2015-11-14 13:35
今天没事来逛逛











zuo3_com
作者: tswtj    时间: 2015-11-25 01:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: nsebn    时间: 2016-1-24 15:38
不错不错!!













作者: 成恒通    时间: 2016-2-15 10:29
电接头,简单实用 电器再多插孔一组就够!
作者: 飞珍非仓    时间: 2016-3-12 21:36
回帖是必须的,这个可以有!
作者: dpzkm    时间: 2016-3-21 23:12
我在努力中
作者: zmlxh168    时间: 2016-4-21 12:33
帖子非常好

作者: 场立誉lm3ahvi    时间: 2016-4-25 00:56
值得收藏...
作者: nugqi    时间: 2016-5-9 07:58
顶!!!!!!!
作者: cfxyj    时间: 2016-6-13 13:53
谢谢楼主了,楼主辛苦了,呵呵
作者: hszrk    时间: 2016-6-29 04:49
说得不错,有收获,顶一下













作者: n7gizl    时间: 2016-9-21 07:08
呵呵,谢谢楼主了~~~~~~~~~~~













作者: {五洲管道}    时间: 2016-9-21 19:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 月夜之星642    时间: 2016-10-15 00:08
这个还不错,好帖子,大家谈谈













作者: 麦麸点点ny    时间: 2016-10-17 03:13
看了,感觉不错,谢谢您提供













作者: 智寒格开    时间: 2016-10-25 15:02
谢谢啦,很有用!












专业代发帖子,网络推广,发帖宣传,产品推广,外链代发。
__________论坛发帖价格____________
联系QQ:188662616  微信号:q188662616
套餐一 80元500帖
套餐二 100元1000帖
套餐三 200元3000帖
套餐四 300元6000帖
套餐五 500元12000帖
当天发完,提供详细报表,保证数量。
包月:600元每天500帖共15000帖
包月:800元每天1000帖共30000帖
包月:1000元每天2000帖共60000帖
包月:1500元每天3000帖共90000帖
包月:2000元每天5000帖共150000帖
包月:3000元每天10000帖共300000帖
包月:5000元每天30000帖共900000帖
联系QQ:188662616  微信号:188662616
每天发完,提供详细报表。

作者: xke瓯江帆影    时间: 2016-11-3 04:04
佩服,佩服!













作者: 南国一梦web    时间: 2016-11-5 08:41
此帖必火!













作者: 皑俞科技861    时间: 2016-11-7 02:27
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想! (http://luntan.znck007.com/) Powered by Discuz! X3.2