如何实现ZigBee休眠与唤醒 (1)
物联网中的省电技术的使用教程
物联网中的省电技术的使用教程物联网(Internet of Things,IoT)作为一种新兴的技术,已经广泛应用于各个领域。
随着物联网设备的快速增长,省电技术的使用变得越来越重要。
省电技术不仅可以延长物联网设备的使用寿命,还可以降低能源消耗并减少对环境的影响。
本文将介绍物联网中常用的省电技术及其使用教程。
一、休眠模式休眠模式是物联网设备中最常用的省电技术之一。
当设备处于休眠状态时,它会进入一种低功耗模式,在此模式下,设备的能源消耗将被降至最低。
只有在特定事件发生时,设备才会被唤醒。
休眠模式可以根据设备功能和需求进行自定义设置。
使用休眠模式时,需要考虑以下几个因素:1. 设备需求:确定设备何时需要被唤醒,并设置相应的唤醒条件。
2. 唤醒源:选择一种合适的唤醒源,如定时唤醒、外部触发唤醒或传感器触发唤醒。
3. 唤醒时间:设备从休眠状态唤醒所需的时间应尽量短,使设备尽快进入工作状态。
二、低功耗通信技术物联网设备之间的通信是其核心功能之一。
传统的通信方式往往需要较高的功耗,而低功耗通信技术的出现解决了这个问题。
以下是常用的低功耗通信技术:1. Zigbee:Zigbee是一种短距离、低功耗、低速率的无线通信技术。
它适用于小范围、低功耗的物联网设备通信,如家庭自动化系统、楼宇自控系统等。
2. Bluetooth Low Energy(BLE):BLE是一种低功耗的蓝牙通信技术。
它主要用于与智能手机和其他便携设备之间的通信,并在物联网设备中得到了广泛应用。
3. LoRaWAN:LoRaWAN是一种低速、长距离、低功耗的无线通信技术。
它适用于远程监控、农业环境监测和智能城市等场景。
在使用低功耗通信技术时,需要注意以下几点:1. 选择合适的通信技术:根据物联网设备的应用场景和通信需求,选择合适的低功耗通信技术。
2. 适当减小通信频率:根据设备需求,合理设置通信频率,减少能耗。
3. 优化数据传输:采用压缩算法和数据包优化技术,减少数据传输量,从而降低功耗。
7.睡眠唤醒(中断唤醒+定时器唤醒)
3
WeBee 团队
Zigbee 基础实验教程
if(++count>=10)
{
count=0;
SysPowerMode(3); //5 次闪烁后进入睡眠状态 PM3,
//等待按键 S1 中断唤醒
}
Delayms(500);
}
}
/*****************************************
uchar i,j; i = mode; if(mode<4) {
5
WeBee 团队
Zigbee 基础实验教程
SLEEPCMD |= i; for(j=0;j<4;j++);
PCON = 0x01; } else {
PCON = 0x00; } }
// 设置系统睡眠模式 // 进入睡眠模式 ,通过中断打断
中断处理函数-系统唤醒
*****************************************/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG>0)
{
P0IFG = 0;
//清标志位
}
P0IF = 0;
__interrupt void ST_ISR(void)
{
STIF = 0;
//清标志位
SysPowerMode(4); //进入正常工作模式
}
实验 B 图片:
7
SysPowerMode(4); //正常工作模式
}
实验 A 图片:
4
WeBee 团队
ZigBee无线网络原理
ZigBee无线网络原理
ZigBee无线网络是一种低功耗、低速率的无线网络通信协议,其原理基于IEEE 802.15.4标准。
它适用于需要将大量节点连
接到一个中心控制器的应用场景,具备自组织、自修复和自动路由等特性。
ZigBee网络由三种设备组成:协调器(Coordinator)、路由器(Router)和终端设备(End Device)。
协调器是网络的核心,负责管理网络配置和协调各个设备的通信。
路由器可以转发数据包,并帮助建立路由表,使数据传输更高效。
终端设备是最简单的节点,功能有限且通信范围较短。
这些设备可以通过无线信道进行通信,并使用MAC层和物理层协议来实现数据传输。
ZigBee网络采用星型、树型或网状拓扑结构,其中协调器处
于网络的根节点,其他设备通过与协调器的直接或间接连接来实现通信。
网络中的节点可以根据实际情况自动组建和拓扑重组,无需手动配置。
在数据传输过程中,ZigBee网络使用CSMA-CA(载波感知多路访问监听)机制来协调节点的发送行为,避免冲突和碰撞。
每个节点都有一个64位的唯一地址,用于标识设备和建立通
信连接。
节点之间可以通过短距离的无线信道进行通信,距离一般在几十米到几百米之间,受限于无线信号传播和环境干扰等因素。
ZigBee网络支持多种应用层协议和功能,例如家庭自动化、
工业控制、智能电网等。
它的低功耗特性使得它在电池供电设备、传感器网络等场景下得到广泛应用。
通过合理设计和优化网络结构和通信机制,ZigBee无线网络可以实现可靠的数据传输和灵活的网络管理。
[ZigBee]10、ZigBee之睡眠定时器
[ZigBee]10、ZigBee之睡眠定时器0、概述 睡眠定时器⽤于设置系统进⼊和退出低功耗睡眠模式之间的周期。
睡眠定时器还⽤于当进⼊低功耗睡眠模式时,维持定时器2 的定时。
睡眠定时器的主要功能如下:● 24 位的定时器正计数器,运⾏在32kHz 的时钟频率● 24 位的⽐较器,具有中断和DMA 触发功能● 24 位捕获1、概述 睡眠定时器是⼀个24 位的定时器,运⾏在⼀个32kHz 的时钟频率(可以是RCOSC 或XOSC)上。
定时器在复位之后⽴即启动,如果没有中断就继续运⾏。
定时器的当前值可以从SFR 寄存器ST2:ST1:ST0 中读取。
2、定时器⽐较 ⼀次定时器⽐较发⽣在定时器的值等于24位⽐较器的值,寄存器ST2:ST1:ST0可以⽤来设置⽐较器的值。
当STLOAD.LDRDY=1写⼊ST0发起加载新的⽐较值。
当STLOAD.LDRDY=0软件不能开始⼀个新的加载,直到它为1。
Reading ST0 captures(捕获) the current value of the 24-bit counter. Thus, the ST0 register must be read before ST1 and ST2 to capture a correct Sleep Timer count value. When a timer compare occurs the interrupt flag STIF is asserted. The current timer value is updated each time a positive clock edge on the 32 kHz clock is detected by the system clock. Thus, when returning from PM1/2/3 (where the system clock is shut down) the Sleep Timer value in ST2:ST1:ST0 is not up-to-date if a positive edgeon the 32 kHz clock has not been detected yet. To ensure an updated value is read, wait for a positive transition on the 32 kHz clock by polling(轮询) the SLEEPSTA.CLK32K bit, before reading the Sleep Timer value. The interrupt enable bit for the ST interrupt is IEN0.STIE, and the interrupt flag is IRCON.STIF. 当运⾏在除了PM3之外的所有供电模式,睡眠定时器才会运⾏。
zigbee协调器和终端对话实验遇到的问题与解决办法
zigbee协调器和终端对话实验遇到的问题与解决办法1、组网后,怎样获取新加入的Endpoint的地址?答:现在有一个最常见的场景,我有一个100个节点的网络同时发送数据给协调器,我很想知道那个地址对应那个节点。
其实楼上的就想知道那个,以前老板也经常问我这个问题。
即使知道了某个节点的IEEE地址还是不知道是某个节点,除非你事先知道那个节点的地址。
你不可能一个一个节点上电在轮询获得地址吧?如果那样的话,我还不如直接加下NV_RESTORE之后断电一个一个标。
终端在给协调器发送的数据包中就包含自己的地址信息就可以了,这样协调器即不用浪费自己的RAM空间来保存所有节点的地址信息,也不用花时间来查询了。
因为MAC地址是唯一的,所以可以用MAC地址。
还记得毛子在太空用铅笔的典故么?这里有个笨办法,在批量烧写CC2530的时候,就把它的IEEE地址读出来,然后贴在标签上。
A:请问zigbee怎么通过mac地址获得网络中挂在路由下的节点的短地址,用APSME_LookupNwkAddr得到短地址时,只能查找协调器儿子节点,对孙子节点不可访问,afStatus_t ZDP_NwkAddrReq(byte*IEEEAddress,byte ReqType,byte StartIndex,byte SecurityEnable)根据已知网络地址查询远程设备物理地址,作为一个广播信息发送给网络中的所有设备:这个函数也是知道IEEE地址,对短地址进行寻找,这个不存在上面所说的限制,但是这个短地址放在那里呢,我怎么获得这个短地址呢?B:请使用函数:afStatus_t ZDP_NwkAddrReq(uint8*IEEEAddress,byte ReqType,byte StartIndex,byte SecurityEnable)2、问题:请问调用这个函数获得的地址放在那里呢?答:会有callback函数上来的,对应的处理事件是#define NWK_addr_rsp(NWK_addr_req|ZDO_RESPONSE_BIT)void ZDApp_ProcessMsgCBs(zdoIncomingMsg_t*inMsg)的switch case下面做添加就可以,然后去处理获得的地址3、问题:ZigBee网络中协调器分配网络地址在哪?如何查看设备的网络地址?答:协调器的短地址是0x0000,当设备加入成功后,会产生一个ZDO_STATE_CHANGE_EVT事件,这个事件就是设备加入网络成功后,并在网络中的身份确定后产生的一个事件,我们可以在这里处理,一些初始化,比如可以发送终端的短地址,IEEE地址等,这里协调器接收到以后,可以提取出终端的短地址,其实在终端给协调器发送的每个数据包中,都含有其自身的短地址,如结构体当中的afAddrType_t srcAddr;协调器在接收到短地址后,就可以知道自己下面管辖的终端节点,或者路由节点有哪些了?协调器提取到的短地址可以存放到一个非易失性的存储器中。
ZIGBEE技术及协议
ZIGBEE技术及协议ZigBee技术及协议是一种基于无线通信的网络协议,它为低功耗设备之间的通信提供了一种简单、低成本的解决方案。
ZigBee技术及协议在物联网、智能家居、工业自动化等领域得到了广泛应用。
本文将详细介绍ZigBee技术及协议的基本原理、特点及应用。
一、ZigBee技术及协议基本原理ZigBee技术及协议基于IEEE 802.15.4标准,它是一种短距离、低功耗的无线通信技术,操作频率在2.4GHz、868MHz及915MHz三个频段。
ZigBee技术采用了自组织、自动路由、分布式网络的概念,可以实现大规模的无线传感网络,支持千万级的节点数量。
ZigBee协议是一种基于星型或网状拓扑结构的网络协议,它通过对数据包的传输进行优化,实现了低功耗和低延时的通信效果。
ZigBee设备通常由协调器(Coordinator)、路由器(Router)和终端节点(End Device)组成,协调器负责网络的管理和控制,路由器负责数据包的转发,终端节点负责数据的采集和传输。
二、ZigBee技术及协议的特点1.低功耗:ZigBee设备采用了睡眠和唤醒的方式来降低功耗,终端节点可以通过休眠来降低功耗,并且可以根据需要定期唤醒进行通信。
2.低速率:ZigBee技术的传输速率相对较低,通常在250Kbps以下。
这使得ZigBee技术非常适合传输小量数据和低频率的通信。
3.低成本:ZigBee设备采用了低成本的硬件和软件设计,可以降低设备的制造成本,提高设备的可扩展性。
4.安全性:ZigBee协议支持AES 128位加密算法,保护网络通信的安全性,防止数据被非法访问和篡改。
5.自组织性:ZigBee设备可以自动组建网络,无需人工干预,可以方便地扩展网络规模。
三、ZigBee技术及协议的应用1.物联网:ZigBee技术及协议在物联网领域被广泛应用,可以实现智能家居、智能能源管理、智能健康监测等功能。
通过ZigBee技术,各种传感器和控制设备可以实现互联互通,实现信息的采集和传输。
zigbee低功耗设置
1.在预编译选项中使能POWER_SAVING
2.设置:RFD_RCVC_ALWAYS_ON = FALSE;//(in f8wConfig.cfg(默认情况下就是FALSE))
并执行:
else if ( ZSTACK_END_DEVICE_BUILD )
{
ZDO_Config_Node_Descriptor.CapabilityFlags = (CAPINFO_DEVICETYPE_RFD
osal_pwrmgr_device(PWRMGR_BATTERY),设置为允许节电;
当器件为路由或协调器时,调用osal_pwrmgr_device( PWRMGR_ALWAYS_ON ),不允许节电(睡眠)!
Second:pwrmgr_task_state必须为no task,这项机制有利于节点在执行重要操作时,禁止sleep mode。
调用NLME_SetPollRate()函数,该函数的调用会立马开始巡检,即便是之前被禁止了!(Calling with a time interval of 1 will poll immediately, one time.)
B. Queued Data Polling(数据接受巡检)–在接到到有数据将要传来的信号后,周期性的向父节点发送数据请求信息。间隔的时间值可以通过调用NLME_SetQueuedPollRate()函数改变,或者改变zgQueuedPollRate来设定和存储。这种特点允许快速地接受(卸载)数据,而不用考虑Request Poll rate.
当POWER_SAVING被使能,任何一个巡检选项,都会对睡眠模式产生影响。
特别地,巡检会阻止进入进入深睡眠模式。(在工程中,我们将zgPollRate、zgQueuedPollRate、zgResponsePollRate的值设为0)
zigbee的睡眠与唤醒
CC2530有3种睡眠模式,pm2模式比较省功耗而且可以被定时唤醒;pm3模式最省电但是只能被外部中断唤醒1、sensordemo的sensor在入网以后,为什么灯在不断地闪?其实,闪一次就是睡眠了一次:亮的时候睡过来,灭的时候睡下去。
具体代码在halSleep函数里。
要做的,就是读懂这个机制是怎么运作的。
2、为什么闪的频率那么高?zstack的睡眠机制就是在操作系统没事干的时候才睡眠,频率高说明应用程序让操作系统不断做事。
你想让它长时间睡眠,那要做的就是不要不断地给操作系统事情做,找到分配系统任务的地方。
要设置低功耗模式,先确认:1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE2.Options->C/C++Compiler->Defined symbols中添加预编译“POWER_SAVING”;重要函数void halSleep( uint16 osal_timeout )1.首先将osal_timeout转成以320US为单位2.获取下一次MAC定时器到期时间3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP :HAL_SLEEP_TIMER;//为PM2,PM3模式。
没有任务要执行就进入PM3深度睡眠,否则进入PM2睡眠,可以定时器唤醒。
4.唤醒OSAL机制的ZigBee低功耗管理(CC2530)涉及文件OSAL_PwrMgr.h OSAL电源管理的API头文件OSAL_PwrMgr.C OSAL电源管理的API C文件hal_sleep.c 底层的电源管理文件电源管理结构体typedef struct{uint16 pwrmgr_task_state; //任务状态uint16 pwrmgr_next_timeout; //下一次超时uint16 accumulated_sleep_time; //睡眠时间uint8 pwrmgr_device; //电源管理设备属性,有PWRMGR_ALWAYS_ON和PWRMGR_BATTERY两种} pwrmgr_attribute_t;#define PWRMGR_ALWAYS_ON 0#define PWRMGR_BATTERY 1选择PWRMGR_ALWAYS_ON的话将不会进入睡眠模式,选择PWRMGR_BATTERY将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态。
基于Zigbee_CC2530的系统唤醒——按键中断唤醒
的疲劳寿命复合两参数威布尔分布。
(10)
(2)建立了钢纤维自密实混凝土考虑保证率的
双
对数方程,在一定概率下为预测钢纤维自密实混凝土疲劳寿命
或控制应力水平提供依据。
(3)因钢纤维的掺入,使自密实混凝土的弯疲劳强度提高
}
else
{
PCON = 0x00;
//系统唤醒
表1 供电模式
}
空闲模式与主动模式相比较,除了CPU核内停止运行,其
}
他和主动模式一样。
4 系统唤醒
3 CC2530电源管理控制的实现
系统进入休眠状态后处于低功耗状态,当系统需要收发数
在实际应用中,CC253需0的所供电模式是通过对相关寄存 据的时候,可以通过多种方式对系统进行唤醒。 基于Zigbee的
然而Zigb术e却e在技一些低成本、 低功耗的场合得到了广泛应 睡眠模式。 此时,系统所处的睡眠模式究竟是PM1P、 M2是还
用,特别是在物联网应用市场,Zigb术e被e广技泛应用在智能家 PM3是,用户根据需求对SLEEPCM存D器寄的MODE关相位进
居、 工业控制、 农业现代化及医疗健康等领域。 究其原因, 行设置来进行选择。 MODE的位取值为1时,电源进入供电模式
表2 PCON寄存器
表3 SLEEPCMD寄存器
1 概述
系统处于工作状态还是睡眠状态由寄存器PCON.ID取LE的
Zigbee是一种无线通信技术,与其他无线通信技术相比,如 值决定。 当PCON存寄器的IDLE的位取值为0时,系统处于主动
WIFI蓝、牙等,无论是传输距离还是通信量它都不占据优势。
用于ZigBee网络的同步休眠与唤醒算法
图1
偏移测量
图2
延时测量 图4 网络拓扑结构
2
同步算法在 ZigBee 网络中的实现
同步算法在 ZigBee 网络中的运行过程如图 3 所示。 节
设定休眠时间段为 200 ms, 工作时间段为 20 ms, 中断周 期为每 100 μs。图 5 为 0 号节点作为参考节点时, 即 200 ms 2 号节点作为待同步节点的中断次数, 内中断 2 000 次时, 在 这里选择 1 946 。 同一节点的多跳传输延时测量, 如 2 号节 1 号节点的传输延时测量值如图 6 和图 7 所示。 选 点, 到 0、 择 6. 3 ms 作为 1 跳的网络传输时延, 选择 9. 6 ms 作为 2 跳的 3 号节点在休眠醒来和醒来 网络传输延时。全网在同步后, 后 2 ms 时给 10 号节点发送数据报, 数据报的投递率如图 8 所示。 TPSN 算法采用简单的洪泛机制来建立层次结构, 对于一 个由 n 个节点组成的网络, 建立层次结构需要每个节点都广 播一次层次发现包, 需要发送 n 次信息。 本文中提出的算法对 虽然比 于一个由 n 个节点组成的网络需要发送 n + 2 次信息,
Clock synchronization algorithm for synchronous sleep and wakeup in ZigBee network
XIE Qi, LIU Lantao, YI Junchao
( College of Information Engineering, Zhengzhou University, Zhengzhou Henan 450001 , China)
基于发送者和接收者的单向时间同步机制, 存在的算 法 有 S. Ping 等 人 提 出 的 DMTS ( Delay Measurement Time Synchronization) 算 法
JN516x低功耗睡眠唤醒流程_v2
JN516x低功耗睡眠唤醒流程(Shaozhong.Liang)NXP JN516x无线微控制器系列包括超低功耗、高性能MCU,带有符合IEEE802.15.4标准的2.4GHz无线电收发器。
集成了超低功耗睡眠模式,深度睡眠模式功耗仅100nA,开启定时器唤醒功耗仅0.64μA。
NXP提供了运行在JN516x芯片上满足各种物联网应用的无线组网协议栈,例如ZigBee Pro Home Automation、ZigBee Pro Light Link、ZigBee 3.0等协议栈,极大地简化了使用JN516x开发ZigBee应用的难度,加快了开发进度。
为了实现低功耗睡眠唤醒功能,JN516x硬件集成两个专用于唤醒CPU的41位递减定时器,由32kHz时钟驱动,在唤醒定时器启动后从设定值开始递减,到计数值为零时触发中断。
唤醒定时器默认使用片内32kHz RC振荡器,也可以选择外部32kHz晶振作为时钟源。
片内32kHz RC时钟可能有高达18%的计时误差,不过这个误差可以利用32MHz的外设时钟校正从而大大减小。
ZigBee协议栈SDK的Power Manager (PWRM)模块实现低功耗睡眠、唤醒功能,提供了下面的一系列PWRM API 函数,并有完整的低功耗睡眠End-Device设备参考设计源代码。
下图是JN516x低功耗睡眠设备的冷启动和睡眠唤醒启动流程图。
本文以NXP JN5169 ZigBee 参考设计JN-AN-1189-ZigBee-HA-Demo 中的LightSensor应用代码为例,分析JN516x 低功耗睡眠唤醒设备的代码结构。
为了便于理解代码的主要脉络,相关函数只保留关键的代码片段。
请参照完整的源代码了解更多细节。
JN516x复位启动后将运行vAppMain(),这是整个程序的初始化入口。
系统初始化函数调用顺序:vAppMain→ vInitialiseApp→ APP_vInitialiseNode调用PWRM_vInit初始化Power Manager (PWRM)模块。
基于ZigBee的休眠唤醒策略
基于ZigBee的休眠唤醒策略随着无线电技术的不断发展,无线通信逐步融入到生活中的各个方面,针对功耗来源,对于无线传感器网络节点SoC,可以设计如下的工作状态:正常模式、浅休眠模式、深度休眠模式。
本文结合ZigBee技术特点,提出一种休眠节能策略,使无线设备在不执行任何操作的情况下进入极低功耗的状态,提高能源的利用率。
1 ZigBee技术ZigBee是基于IEEE 802.15.4的一种短距离、低功耗的无线通信技术。
其网络可容纳大量节点,点对点的最大传输距离为75 m,在传输范围内节点间可以互相通信,支持多种自组织网络拓扑结构。
与传统的无线通信技术相比,ZigBee具有以下特点。
省电:两节五号电池工作时间可达2年;可靠:采用CSMA/CA避免数据冲突;高容量:网络最多可容纳65 000个节点;低成本;低速率:传输速率为250 Kb/s;高安全性:支持AES-128加密。
因此ZigBee多应用于有成本和功耗要求,且传输速率较低,数据量较少的场合。
2 系统规划如图1所示,系统由嵌入式控制器、照明控制节点、开关节点和路由节点组成。
嵌入式控制器集中监视和控制照明系统的状态,用户可以通过嵌入式控制器查看系统中所有照明设备的状态,并能通过触摸屏对其进行控制。
开关节点作为次级控制单元,可发送开关信号到照明节点,控制其开关状态。
然而照明节点是系统中的执行设备,接收控制命令和执行相应的动作。
每个开关节点可与多个照明节点绑定。
2.1 网络拓扑ZigBee网络中,一般存在三种功能设备:网络协调器(具有建立网络和数据转发功能)、路由器(具有数据转发功能)和终端设备(不具有数据转发功能)。
本系统采用图1所示的网状拓扑结构。
它是一种可靠性高,网络容量大的网络结构。
网络中放置若干个特殊的路由器,专门负责进行数据转发。
一般情况下,网络中仅有协调器和路由器处于活跃状态,终端设备进入休眠模式。
2.2 节点配置根据系统各节点的功能要求,嵌入式控制器能够对网络进行集中控制,被配置成协调器,作为网络的建立者;路由节点作为特殊的节点,仅作为数据汇聚点进行数据转发,不执行其他操作;而开关节点仅在手动开关操作后被唤醒,在网络中活跃的时间较短,不需进行数据转发,被配置为终端设备。
用Zigbee协议栈来进行按键控制LED灯的亮灭实验
用Zigbee协议栈来进行按键控制LED灯的亮灭实验本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动hal_board_cfg.h、hal_board_cfg.h、hal_key.c、hal_key.h和自己定义的Coordinator.c这5个文件。
注意:添加自己的按键时尽量不要修改协议栈里面的按键程序,自己另行添加即可。
1、hal_key.h在/* Switches (keys) */下面添加自己的按键定义#define HAL_KEY_SW_8 0x80----------------------------------------------------------------------------------------2、hal_board_cfg.h在/* S6 */#define PUSH1_BV BV(1)#define PUSH1_SBIT P0_1#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH1_POLARITY ACTIVE_LOW#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH1_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif下面模仿/* S6 */下的程序定义自己的按键值:/* S8 */#define PUSH8_BV BV(4)#define PUSH8_SBIT P0_4#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH8_POLARITY ACTIVE_LOW#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH8_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif------------------------------------------------------------------------------------------------------------- 在/* ----------- Push Buttons ---------- */#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT)) #define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT)) #define HAL_PUSH_BUTTON3() (0)#define HAL_PUSH_BUTTON4() (0)#define HAL_PUSH_BUTTON5() (0)#define HAL_PUSH_BUTTON6() (0)下定义自己的按键函数#define HAL_PUSH_BUTTON8() (PUSH8_POLARITY (PUSH8_SBIT))---------------------------------------------------------------------------------------------------------------- 在/* SW_6 is at P0.1 */#define HAL_KEY_SW_6_PORT P0#define HAL_KEY_SW_6_BIT BV(1)#define HAL_KEY_SW_6_SEL P0SEL#define HAL_KEY_SW_6_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_6_EDGEBIT BV(0)#define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE/* SW_6 interrupts */#define HAL_KEY_SW_6_IEN IEN1 /* CPU interrupt mask register */#define HAL_KEY_SW_6_IENBIT BV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_6_ICTL P0IEN /* Port Interrupt Control register */#define HAL_KEY_SW_6_ICTLBIT BV(1) /* P0IEN - P0.1 enable/disable bit */#define HAL_KEY_SW_6_PXIFG P0IFG /* Interrupt flag at source */下模仿/* SW_6 is at P0.1 */建立自己的按键函数#define HAL_KEY_SW_8_PORT P0#define HAL_KEY_SW_8_BIT BV(4) //修改#define HAL_KEY_SW_8_SEL P0SEL#define HAL_KEY_SW_8_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_8_EDGEBIT BV(0)#define HAL_KEY_SW_8_EDGE HAL_KEY_FALLING_EDGE/* SW_8 interrupts */#define HAL_KEY_SW_8_IEN IEN1 /* CPU interrupt mask register */#define HAL_KEY_SW_8_IENBIT BV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_8_ICTL P0IEN /* Port Interrupt Control register */#define HAL_KEY_SW_8_ICTLBIT BV(4) //修改#define HAL_KEY_SW_8_PXIFG P0IFG /* Interrupt flag at source */-------------------------------------------------------------------------------------------------------------注意:将void HalKeyPoll (void)中的// if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is activeHIGH */// {// keys = halGetJoyKeyInput();// }/* If interrupts are not enabled, previous key status and current key status * are compared to find out if a key has changed status.*/// if (!Hal_KeyIntEnable)// {// if (keys == halKeySavedKeys)// {/* Exit - since no keys have changed */// return;// }/* Store the current keys for comparation next time */// halKeySavedKeys = keys;// }// else// {/* Key interrupt handled here */全部注释掉,因为它会对我们设定的按键产生干扰,具体情况我也不知道...然后再在内添加if (HAL_PUSH_BUTTON8()){keys |= HAL_KEY_SW_8;}-------------------------------------------------------------------------------------------------------------最后再在Coordinator.c中的uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )添加事件及其处理函数case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );再在static void GenericApp_HandleKeys( uint8 shift, uint8 keys ){zAddrType_t dstAddr;if ( keys & HAL_KEY_SW_1 ){if ( keys & HAL_KEY_SW_2 ){}if ( keys & HAL_KEY_SW_3 ){}if ( keys & HAL_KEY_SW_4 ){}if ( keys & HAL_KEY_SW_6 ) //添加自己的按键及其处理函数{HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);}}最后烧到开发板中即可,祝大家实验成功。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
加红部分是一个宏定义,在OnBoard.h里面定义的。
#define OSAL_SET_CPU_INTO_SLEEP(timeout) halSleep(timeout);
halSleep(timeout)是在hal_sleep.c中定义的。
这里面涉及的就是关于CC2530的电源管理寄存器的一些操 作。具体可以看代码。
涉及文件
OSAL_PwrMgr.h
OSAL_PwrMgr.C hal_sleep.c
OSAL电源管理的API头文件
OSAL电源管理的API C文件 底层的电源管理文件
电源管理结构体
typedef struct { uint16 pwrmgr_task_state; uint16 pwrmgr_next_timeout; //任务状态 //下一次超时
void osal_start_system( void ) {
#if !defined ( ZBIT ) && !defined ( UBIT )
for(;;) // Forever Loop #endif {…… } #if defined( POWER_SAVING ) else // Complete pass through all task events with no activity { osal_pwrmgr_powerconserve(); // Put the pro cessor/system into sleep } #endif }
2.获取下一次MAC定时器到期时间
3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLE EP_TIMER; //为PM2,PM3模式。 没有任务要执行就进入PM3深度睡眠,否则进入P M2睡眠,可以定时器唤醒。 4.唤醒
OSAL机制的ZigBee低功耗管理(CC2530)
0 1
选择PWRMGR_ALWAYS_ON的话将不会进入睡眠模式,选择PWRMGR_BATTERY 将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态。
#define PWRMGR_CONSERVE 0 #define PWRMGR_HOLD 1
低功耗标志,主要用于osal_pwrmgr_task_state()这个函数中,用于标志每一任务是 否需要低功耗。
/* HAL电源管理模式是设置电源管理状态的,默认状态是HAL_SLEEP_OFF。其余 设置均会关*闭系统时钟停止CPU。 * HAL_SLEEP_TIMER模式可以被睡眠定时器中断和IO中断以及复位唤起。 * HAL_SLEEP_DEEP模式可以被IO中断以及复位唤起。 */ #define HAL_SLEEP_OFF #define HAL_SLEEP_TIMER #define HAL_SLEEP_DEEP CC2530_PM0 CC2530_PM2 CC2530_PM3
halIntState_t intState if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) // 首先检查是否支持低功 { if ( pwrmgr_attribute.pwrmgr_task_state == 0 ) //是否所有任务支持低功耗 { HAL_ENTER_CRITICAL_SECTION( intState ); //关中断 next = osal_next_timeout(); //查询软件定时器链表得到最近一次溢出时间 HAL_EXIT_CRITICAL_SECTION( intState ); //开中断 OSAL_SET_CPU_INTO_SLEEP( next ); //将系统进入睡眠模式 } } } #endif /* POWER_SAVING */
2、为什么闪的频率那么高? zstack的睡眠机制就是在操作系统没事干的时候才睡眠,频 率高说明应用程序让操作系统不断做事。你想让它长时间睡 眠,那要做的就是不要不断地给操作系统事情做,找到分配 系统任务的地方。
要设置低功耗模式,先确认: 1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE 2.Options->C/C++Compiler->Defined symbols中添加预编译“POW ER_SAVING”; 重要函数void halSleep( uint16 osal_timeout ) 1.首先将osal_timeout转成以320US为单位
/OWER_SAVING ) /* osal_pwrmgr_powerconserve 这个函数在OSAL循环中如果没有任何事件需要执行的话将被 调用,将设备进入 睡眠模式,不可以在其他地方调用该函数。需要打开POWER_SAVING的宏定 义。*/ void osal_pwrmgr_powerconserve( void ) { uint16 next;
}
表示OSAL系统在检查完所有的任务事件之后发现没有事件需要处理,这样在POW ER_SAVING宏定义打开的情况下将调用osal_pwrmgr_powerconserve();函数,在 这函数中将会根据选择系统进入休眠。
退出休眠
当出现IO中断或者复位时候会退出休眠,或者在休眠定时器中断时候也将会退出休 眠。如果是IO中断或者休眠定时器中断退出之后将回到进入休眠的地方继续向下执 行,复位退出的话进入程序的初部分执行。
return ( INVALID_TASK ); if ( state == PWRMGR_CONSERVE ) {
pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id );
} else { pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id); } return ( SUCCESS ); }
如何实现ZigBee休眠与唤醒
报告人:XXX 时 间:2013-3-28
ZigBee技术优势
发射功率仅为1mW,仅靠两节5 号电池就可维持长达6个月到2 年的工作时间。
低功耗
在实际的开发应用中,产品是否具有低功耗这一特性 将在很大程度上决定其整体性能。 目标
通过休眠定时器,实现传感器节点的休眠 /唤醒调度,使其低功耗运行,减少节 点能耗。
uint16 accumulated_sleep_time;
//睡眠时间
uint8 pwrmgr_device; //电源管理设备属性,有PWR MGR_ALWAYS_ON 和 PWRMGR_BATTERY两种
} pwrmgr_attribute_t;
#define PWRMGR_ALWAYS_ON #define PWRMGR_BATTERY
extern pwrmgr_attribute_t
pwrmgr_attribute;
定义一个电源管理的全局变量。
/********************************************************************* * @brief 初始化电源管理函数,这个函数在OSAL.C里面的osal_init_system( )调用, 也就是在OSAL系统初始化的时候将电源管理模式调成了不会进入睡眠模式的状态。 */ void osal_pwrmgr_init( void ) { pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; //默认没有睡眠模式 pwrmgr_attribute.pwrmgr_task_state = 0; } //清零
#define CC2530_PM0
0
#define CC2530_PM1
#define CC2530_PM2 #define CC2530_PM3
1
2 3
#define MAX_SLEEP_TIME 最大睡眠时间是510000ms。
510000
总结
可以看到在OSAL中是使用睡眠定时器来控制睡眠时间的,在系统初 始化的时候是将电源控制结构体中的pwrmgr_device设备属性设置 为PWRMGR_ALWAYS_ON,这样默认就不进入休眠状态。必须在 应用层里面调用void osal_pwrmgr_device( uint8 pwrmgr_device ) 这个OSAL的API来设置使得OSAL能够进入休眠状态。 在用户任务中需要用的这样一个API——uint8 osal_pwrmgr_task_s tate( uint8 task_id, uint8 state )来设置这个任务是否支持休眠,如 果有一个任务不支持休眠的话,整个系统就将不会进入休眠模式。 这个在void osal_pwrmgr_powerconserve( void )中有相关的查询。 在OSAL的主循环中void osal_start_system( void )调用了osal_pwr mgr_powerconserve这个函数。
/********************************************************************* * @fn osal_pwrmgr_device
* @brief
设置电源管理设备属性。
* @param pwrmgr_device -选择PWRMGR_ALWAYS_ON的话将不会进入睡眠 模式,选择 PWRMGR_BATTERY将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态。 */ void osal_pwrmgr_device( uint8 pwrmgr_device ) { pwrmgr_attribute.pwrmgr_device = pwrmgr_device;
如何去实现ZigBee休眠与唤醒?