ZigBee基础实验(九)--定时器二

发布者:一直333最新更新时间:2019-04-09 来源: eefocus关键字:ZigBee  定时器二  休眠态 手机看文章 扫描二维码
随时随地手机看文章

1、前言

  上一节讲了Zigbee的睡眠定时器利用外部按键使系统从休眠态唤醒到工作态,其核心在于:


   61 void SysPowerMode(uchar mode) 
   62 { 
   63     if(mode > 0 && mode < 4) 
   64     {  
   65         SLEEPCMD |= mode;    //设置系统睡眠模式 
   66         PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
   67     } 
   68     else 
   69         PCON = 0x00;         //主动/空闲模   通过中断唤醒系统 
   70 }


  其中参数mode表示电源管理系统中的PM1、PM2、PM3、全功能模式,上节只对这几种模式做简单的介绍,本节将详细介绍电源管理部分,而后分析基于Zigbee休眠定时器实现的周期性休眠唤醒工程。

 

2、低功耗电源管理概述

  一个具有低功耗运行的系统,其实现往往是利用在不同情况下切换为不同电源模式来实现的。各种运行模式指的是主动模式、空闲模式和供电模式1、2 和3(PM1-PM3)。而超低功耗一般通过关闭对模块的供电来减少静态功耗,以及使用门控时钟和关闭振荡器来降低动态功耗。

 

3、电源管理系统介绍

  不同的操作模式或者供电模式使系统低功耗运行成为了可能,如果想追求超低功耗,可以通过关闭对模块的供电来减小静态功耗,或者使用时钟门控,以及关闭晶振来减少动态功耗。

  active modeidle modePM1PM2PM3被称为operating模式(power模式)。Active mode是正常运行模式,PM3模式拥有最低的功耗,他们的区别见下表:

 

 

  Active mode: 全功能模式,稳压器的数字内核开启,要么16MHz的RC振荡器要开启、要么32MHz的晶体振荡器要开启、要么两者都开启;要么32kHz的RCOSC开启、要么32kHz的XOSC要开启。

  Idle mode: 空闲模式-除了CPU内核停止运行之外,其他和active mode一样

  PM1: The voltage regulator to the digital part is on. Neither the 32 MHz XOSC nor the 16 MHz RCOSC is running. Either the 32 kHz RCOSC or the 32 kHz XOSC is running. The system goes to active mode on reset, an external interrupt, or when the Sleep Timer expires.(处于PM1模式系统重新变为active mode要么reset,要么外部中断触发,要么Sleep timer溢出)

  PM2: The voltage regulator to the digital core is turned off. Neither the 32 MHz XOSC nor the 16 MHz RCOSC is running. Either the 32 kHz RCOSC or the 32 kHz XOSC is running. The system goes to active mode on reset, an external interrupt, or when the Sleep Timer expires.

  PM3: The voltage regulator to the digital core is turned off. None of the oscillators is running. The system goes to active mode on reset or an external interrupt.

 

  POR在PM2/PM3模式下是Active的,但是BOD却是Power Down的,这给电源管理造成了限制。如果在PM2或者PM3模式下供电电压小于1.4V,温度高于70℃,并且然后重新进入主动模式之前,回到合适的运行电压,寄存器和RAM在PM2/PM3 下保存的内容可能会改变。Hence, care should be taken in the design of the system power supply to ensure that this does not occur. 因为如果电压低于大约1.7V 就触发一个BOD 复位,所以电压可以通过进入主动模式进行精确的定期监控。

 

3.1、主动和空闲模式

  Active mode is the fully functional mode of operation where the CPU, peripherals, and RF transceiver are active. The digital voltage regulator(数字稳压器) is turned on.

  Active mode is used for normal operation.在active模式通过使能PCON.IDLE位 (SLEEPCMD.MODE = 0x00), CPU内核停止运行进入空闲模式. All other peripherals function normally, and any enabled interrupt wakes up the CPU core (to transition back from idle mode to active mode).

 

3.2、PM1模式

  In PM1, the high-frequency oscillators are powered down (32 MHz XOSC and 16 MHz RCOSC). The voltage regulator and the enabled 32 kHz oscillator are on. When PM1 is entered, a power-down sequence is run.

  当等待唤醒事件的预期时间相对较短(小于3ms),就要选用PM1模式,因为 PM1 uses a fast power-down/up sequence.

 

3.3、PM2模式

  PM2 具有较低的功耗。在PM2 下的上电复位时刻,外部中断、所选的32 kHz 振荡器和睡眠定时器外设是活动的。I/O 引脚保留在进入PM2 之前设置的I/O 模式和输出值。所有其它内部电路是掉电的。稳压器也是关闭的。当进入PM2 模式,就运行一个掉电序列。

  当使用睡眠定时器作为唤醒事件,并结合外部中断时,一般就会进入PM2 模式。相比较PM1,当睡眠时间超过3ms 时,一般选择PM2。比起使用PM1,使用较少的睡眠时间不会降低系统功耗。

 

3.4、PM3模式

  PM3 用于获得最低功耗的运行模式。在PM3 模式下,稳压器供电的所有内部电路都关闭(基本上是所有的数字模块,除了中断探测和POR 电平传感)。内部稳压器和所有振荡器也都关闭。

  复位(POR 或外部)和外部I/O 端口中断是该模式下仅有的运行的功能。I/O 引脚保留进入PM3 之前设置的I/O 模式和输出值。复位条件或使能的外部IO 中断事件将唤醒设备,使它进入主动模式(外部中断从它进入PM3 的地方开始,而复位返回到程序执行的开始)。RAM 和寄存器的内容在这个模式下可以部分保留。PM3 使用和PM2 相同的上电/掉电序列。

  当等待外部事件时,使用PM3 获得超低功耗。当睡眠时间超过3ms 时应该使用该模式。

 

4、电源管理控制

  所需的供电模式通过使用SLEEPCMD 控制寄存器的MODE 位和PCON.IDLE 位来选择。设置SFR 寄存器的PCON.IDLE 位,进入SLEEPCMD.MODE 所选的模式。

  来自端口引脚或睡眠定时器的使能的中断,或上电复位将从其他供电模式唤醒设备,使它回到主动模式。

  当进入PM1、PM2 或PM3,就运行一个掉电序列。当设备从PM1、PM2 或PM3 中出来,它在16 MHz开始,如果当进入供电模式(设置PCON.IDLE)且CLKCONCMD.OSC = 0 时,自动变为32 MHz。如果当进入供电模式设置了PCON.IDLE 且CLKCONCMD.OSC = 1,它继续运行在16 MHz。

  为了正确运行,设置PCON.IDLE 位的指令必须遵循某种方式。这一指令后面跟的第一条汇编指令的第一个字节不能放在4 字节边界。而且,缓存不能禁用(见FCTL 寄存器描述的CM)。不遵守这一要求可能导致较高的电流消耗。只要遵守了这一要求,设置了PCON.IDLE 位的指令后面的第一条汇编指令在导致系统醒来的中断的ISR 之前、但是系统醒来之后执行。如果这个指令是一个全局中断禁用,后面可以跟醒来之后、但是在ISR 运行之前执行的代码。

 

5、工程

code:

  1 /****************************************************************************

  2 * 文 件 名: main.c

  3 * 描    述: 设置定时器让系统在设定的时间被唤醒,每次唤醒LED1闪烁3下提示用户

  4 ****************************************************************************/

  5 #include

  6 

  7 typedef unsigned char uchar;

  8 typedef unsigned int  uint;

  9 typedef unsigned long ulong;

 10 

 11 #define LED1 P1_0            //P1.0口控制LED1

 12 

 13 

 14 /****************************************************************************

 15 * 名    称: DelayMS()

 16 * 功    能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M

 17 * 入口参数: msec 延时参数,值越大,延时越久

 18 * 出口参数: 无

 19 ****************************************************************************/

 20 void DelayMS(uint msec)

 21 { 

 22     uint i,j;

 23     

 24     for (i=0; i

 25         for (j=0; j<535; j++);

 26 }

 27 

 28 /****************************************************************************

 29 * 名    称: InitLed()

 30 * 功    能: 设置LED灯相应的IO口

 31 * 入口参数: 无

 32 * 出口参数: 无

 33 ****************************************************************************/

 34 void InitLed(void)

 35 {

 36     P1DIR |= 0x01;           //P1.0定义为输出口

 37     LED1 = 1;                //LED1灯上电默认为熄灭 

 38 }

 39 

 40 /****************************************************************************

 41 * 名    称: SysPowerMode()

 42 * 功    能: 设置系统工作模式

 43 * 入口参数: mode等于0为PM0 1为PM1 2为PM2 3为PM3             

 44 * 出口参数: 无

 45 ****************************************************************************/

 46 void SysPowerMode(uchar mode) 

 47 { 

 48     if(mode < 4) 

 49     {  

 50         SLEEPCMD |= mode;    //设置系统睡眠模式 

 51         PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒

 52     } 

 53     else 

 54         PCON = 0x00;         //通过中断唤醒系统 

 55 }

 56 

 57 /****************************************************************************

 58 * 名    称: ST_ISR(void) 中断处理函数 

 59 * 描    述: #pragma vector = 中断向量,紧接着是中断处理程序

 60 ****************************************************************************/

 61 #pragma vector = ST_VECTOR 

 62 __interrupt void ST_ISR(void) 

 63 { 

 64     STIF = 0;          //清标志位

 65     SysPowerMode(4);   //进入正常工作模式

 66 } 

 67 

 68 /****************************************************************************

 69 * 名    称: SysPowerMode()

 70 * 功    能: 初始化休眠定时器,设定后经过指定时间自行唤醒

 71 * 入口参数:             

 72 * 出口参数: 无

 73 ****************************************************************************/

 74 void InitSleepTimer(void) 

 75 { 

 76     ST2 = 0x00; 

 77     ST1 = 0x00; 

 78     ST0 = 0x00; 

 79     EA = 1;     //开中断 

 80     STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能

 81     STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决

 82 }

 83 

 84 /****************************************************************************

 85 * 名    称: Set_ST_Period()

 86 * 功    能: 设置睡眠时间 

 87 * 入口参数: sec 睡眠时间             

 88 * 出口参数: 无

 89 ****************************************************************************/

 90 void Set_ST_Period(uint sec) 

 91 { 

 92     ulong sleepTimer = 0; 

 93     

 94     sleepTimer |= ST0; 

 95     sleepTimer |= (ulong)ST1 <<  8; 

 96     sleepTimer |= (ulong)ST2 << 16; 

 97     sleepTimer += ((ulong)sec * (ulong)32768); 

 98     ST2 = (uchar)(sleepTimer >> 16); 

 99     ST1 = (uchar)(sleepTimer >> 8); 

100     ST0 = (uchar) sleepTimer; 

101 }

102 

103 

104 /****************************************************************************

105 * 程序入口函数

106 ****************************************************************************/

107 void main(void)

108 {   

109     uchar i=0;  

110       

111     InitLed();                 //设置LED灯相应的IO口     

112     InitSleepTimer();        //初始化休眠定时器

113     

114     while(1)

115     {

116         for (i=0; i<6; i++)  //LED1闪烁3次提醒用户将进入睡眠模式

117         {

118             LED1 = ~LED1;

119             DelayMS(500);

120         }

121 

122         Set_ST_Period(5);   //设置睡眠时间,睡眠5秒后唤醒系统

123         SysPowerMode(2);    //重新进入睡眠模式PM2

124     }

125 }


其中SysPowerMode在上一节[ZigBee] 10、ZigBee之睡眠定时器讲了SysPowerMode(uchar mode) 用于设置系统进入几种模式,本节不额外说明。重点看SleepTimer的用法。

 

先看SleepTimer的初始化函数:在上一节中介绍一次定时器比较发生在定时器的值等于24位比较器的值,寄存器ST2:ST1:ST0可以用来设置比较器的值。 当STLOAD.LDRDY=1写入ST0发起加载新的比较值。当STLOAD.LDRDY=0软件不能开始一个新的加载,直到它为1。因此这里的767778行用来设置比较器的值,然后开总中断,开SleepTimer中断,最后将睡眠中断标志位清0。

 74 void InitSleepTimer(void) 
 75 { 
 76     ST2 = 0x00; 
 77     ST1 = 0x00; 
 78     ST0 = 0x00; 
 79     EA = 1;     //开中断 
 80     STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
 81     STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决
 82 }

 

而Set_ST_Period比较简单,就是将待设置的时间赋值给ST2、ST1和ST0,注意无论是初始化还是这里,在给STx赋值是都是需要最后给ST0赋值,在读取STx值时都是要最先读取ST0的值(这个为什么在上一节中有详细介绍)

 90 void Set_ST_Period(uint sec) 
 91 { 
 92     ulong sleepTimer = 0; 
 93     
 94     sleepTimer |= ST0; 
 95     sleepTimer |= (ulong)ST1 <<  8; 
 96     sleepTimer |= (ulong)ST2 << 16; 
 97     sleepTimer += ((ulong)sec * (ulong)32768); 
 98     ST2 = (uchar)(sleepTimer >> 16); 
 99     ST1 = (uchar)(sleepTimer >> 8); 
100     ST0 = (uchar) sleepTimer; 
101 }

 

这样整个工程就比较容易理解了:main函数开始初始化LED和睡眠定时器,然后在while大循环里面先LED闪烁3次,然后调用睡眠周期设置设置5s,此时睡眠定时器开始计时,而main函数由于执行到设置系统进入PM2模式而休眠,当5s后触发休眠定时器中断,在中断中设置系统进入active模式。

关键字:ZigBee  定时器二  休眠态 引用地址:ZigBee基础实验(九)--定时器二

上一篇:ZigBee基础实验(十)--看门狗
下一篇:ZigBee基础实验(八)--定时器一

推荐阅读最新更新时间:2024-03-16 16:27

ZigBee-CC2530单片机 - 按键控制LED
程序源码 #include ioCC2530.h //引用CC2530头文件 #define LED1 (P1_0) //LED1端口宏定义 #define SW1 (P1_2) //SW1端口宏定义 /************************************************************** 函数名称:delay 功 能:软件延时 入口参数:time--延时循环执行次数 出口参数:无 返 回 值:无 **************************************************************/ void delay(unsigned int ti
[单片机]
基于ATmega128RFA1设计的低功耗ZigBee解决方
Atmel公司的ATmega128RFA1是低功耗CMOS 8位MCU,采用AVR增强性RISC架构和2.4GHz ISM频段高数据速率收发器,吞吐量达1 MIPS per MHz .无线收发器的数据速率从250 kb/s到高达2 Mb/s,还提供帧处理,有杰出的接收灵敏度(-100dBm)和高发送功率(达3.5dBm),主要应用在ZigBee® / IEEE 802.15.4-2006/2003,通用的2.4GHz ISM频段, F4CE, SP100, WirelessHART™, ISM和IPv6 / 6LoWPAN.本文介绍了ATmega128RFA1主要特性, 基本应用电路图和相应的材料清单(BOM),以及扩展特性应用电
[模拟电子]
基于ATmega128RFA1设计的低功耗<font color='red'>ZigBee</font>解决方
基于ZigBee技术的远程医疗监护系统设计方案
   摘 要: 将无线传感器网络引入医疗监护系统,提出了一种由ZigBee传感器和无线局域网构成的远程医疗监护系统的体系结构和具体实现方法。系统中,节点和基站设备所使用的近距离通信标准为802. 15. 4 /ZigBee标准,收集病患者的各类信息,实现病患者在家中进行远程医疗监护,并及时将病患情况反映给医生及其家属,以应对病患者可能的突发情况,在获得准确的测量指标的同时,免除患者在家庭与医院之间奔波的劳苦。   远程医疗是信息技术与医学相结合的产物,它使用远程通信和计算机多媒体技术为患者提供医学信息和医疗服务。在信息技术高速发展的今天,它已经成为医学交流中一道亮丽的风景线。   远程医疗主要应用在临床会诊、检查、诊断、监护
[医疗电子]
基于<font color='red'>ZigBee</font>技术的远程医疗监护系统设计方案
智能家居监控原型系统设计
随着人类科技的发展,计算机技术、通信技术、网络技术、控制技术都取得了迅猛的发展与提高,人们对居住环境提出了更高的要求,智能家居的概念应运而生,人们希望可以随时随地监测家庭内部情况并实现整个家庭的实时控制。为了实现用户方便灵活地对家庭的监测和控制,本文设计了一种智能家居监控的原型系统。当前智能家居系统设计存在诸多问题,如家庭布线复杂且成本高,用户对系统的使用仅局限于家庭内部等。针对当前智能家居系统中存在的问题,本文设计的原型系统对其进行了改进与提高。本文设计了基于Android的手机客户端,使用户在任何可以连接Internet的地方轻松方便地实现对家庭的监控操作;本文所设计的原型系统采用了基于ZigBee的家庭无线网络,可以实现监
[单片机]
智能家居监控原型系统设计
大联大推出基于ZigBee照明多样化LED调光解决方案
2015年9月8日,致力于亚太地区市场的领先半导体元器件分销商 大联大控股宣布,其旗下世平推出 ZigBee 照明多样化LED调光解决方案,可以实现远程单灯开关、调光、检测等管控功能。在此次推出的方案中,大联大世平为确保高性能和高可靠性,采用了例如ADI、Atmel、CREE、CSR、GainSpan、NXP、ON、TI、Toshiba、Vishay等众多国际大厂的器件。 从现在乃至未来,环保、绿色、节能都将是科技发展的主导方向。将电能直接转化为光的LED技术,电能利用率比荧光灯高,同时也不会对环境产生有害物质,正符合了绿色环保的要求。同时,LED还具有耗电量少、寿命长、色彩丰富、体积小、可控性强等特点,可以广泛
[电源管理]
大联大推出基于<font color='red'>ZigBee</font>照明多样化LED调光解决方案
基于ZigBee技术的智能调光系统
  能源危机正在威胁着人类,要想可持续发展,节能环保势在必行。一直以来,千家万户的照明灯都是用白炽灯和荧光灯,但是它们的发光效率低,造成了大量的电能浪费。白光LED照明灯的出现,解决了原有灯具发光效率低等缺点,但是,在外界不是特别暗的时候,如果将室内的白光LED灯全部打开,又会造成不必要的电能浪费。因此,本文提出了一种可以根据外界自然光强度变化而自动调整白光LED灯亮度的智能照明系统,并且可通过ZigBee网络进行本地无线开灯或关灯,不仅省时省力、无额外的无线通信费用,而且通过以太网,还可以实现远程监控。    1 整体设计方案    智能调光系统主要为教室、大型办公场所等建筑而设计,因此,以某个教学楼为例,讲述了方案整体设
[网络通信]
Maxim Integrated与RadioPulse合作提供高集成度ZigBee方案
Maxim与合作伙伴通力打造完备方案,帮助用户缩短开发时间、降低电路板空间和成本。 中国,北京,2012年11月8日。Maxim Integrated Products, Inc. (NASDAQ: MXIM)宣布与RadioPulse展开合作,提供面向智能电网的ZigBee®通信方案。Maxim将与RadioPulse一道,共同研发ZigBee软件和高集成度片上系统(SoC)、“智能”收发器,扩充Maxim现有的智能电网方案及近期推出的智能电表SoC方案Zeus。 通过双方的精诚合作,提供更广泛的高集成度智能电网方案,RadioPulse的无线ZigBee软件与Maxim智能安全IC的完美融合,将极大地缩短开发时
[工业控制]
Maxim Integrated与RadioPulse合作提供高集成度<font color='red'>ZigBee</font>方案
zigbee学习之路(四):按键控制(中断方式)
一.前言 通过上次的学习,我们学习了如何用按键控制led,但是在实际应用中,这种查询方式占用了cpu的时间,如果通过中断控制就可以解决这个问题,我们今天就来学习按键控制的中断方式。 二.原理分析 传统的51单片机如果要使用中断,也要对相应的寄存器进行控制,cc2530芯片也不例外,而且相对复杂。需要配置多个中断寄存器,下面来一一介绍。 这个寄存器是来控制端口0中断使能的,要开启中断,应设为1. 这个是配置各种中断使能的,我们只需要配置P0IE. 这个是配置中断触发方式的,根据上次的按键原理图,我们应该选择低下降沿触发模式。 中断状态标志位,当中断没有发生或者结束时,应将标志位置0. 三.程序代码 #includ
[单片机]
<font color='red'>zigbee</font>学习之路(四):按键控制(中断方式)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved