Z-Stack 低功耗设置及电源管理

来源:互联网 发布:免费购物的软件 编辑:程序博客网 时间:2024/06/06 04:15

http://hi.baidu.com/dearplain/item/64c84f30a5fce8c41a96961f


在研究低功耗前先对CC2430的几种电源(功耗)模式有个大概的了解是很有必要的。下面几种电源模式比较,很清晰吧!详见datasheet

低功耗,电源管理(转自网友free) - liuqing984808 - liuqing984808的博客

PM0:全功能模式,晶体振荡器和数字稳压器处于工作状态,实测电流9mA。

PM1:由PM1进入PM0的方式有:复位、外部中断、睡眠定时器。(0.453mA)

PM2:由PM2进入PM0的方式有:复位、外部中断、睡眠定时器。(0.26mA)

PM3:由PM3进入PM0的方式有:复位、外部中断。(0.03mA)

 

在网络中低功耗方式仅用于由电池供电的终端设备RFD,其它的带路由功能的设备是不可以的, 因为FFD设备需要维持网络的存在及路由,无法进入低功耗。操作系统在进入低功模式前,必须确保所有任务已完成,如果有任务在处理,则不能进入低功耗模 式,只有在完全通空闲状态时,关闭外设进入睡眠模式。

Z-stack提供了两种sleep模式,LITE和DEEP(PM2/PM3)。当系统需 要唤醒去执行一些周期性的事件时,使用LITE sleep;当系统没有被定制周期事件而是通过外部中断(如按键)来唤醒设备,使用DEEP sleep。例如带有传感器的终端设备,它需要周期性的唤醒发送采集的数据,又如远程控制终端设备通过按键唤醒来发送一信息,它们的大部分时间都是处于 sleep,以降低功耗。

第一步:添加编译选项:POWER_SAVING

默认情况下,Z-stack里终端设备的电源管理是关闭的。添加编译选项POWER_SAVING以开启此功能

第二步:在f8wConfig.cfg里设置:-DRFD_RCVC_ALWAYS_ON = FALSE

/****************************************

 * The following are for End Devices only

 ***************************************/

-DRFD_RCVC_ALWAYS_ON=FALSE

………………………

第三步:关闭Key轮询,开关Key中断

在Onboard.c文件的函数InitBoard()里把OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE

修改为OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;

第四步:将f8w2430.xcl换成f8w2430pm.xcl

CC2430在进入DEEP sleep (PM2 or PM3)不会保留存储器RAM中以下XDATA地址的内容:

? 0xE000 – 0xEFFF (4096 bytes)

? 0xFD56 – 0xFEFF (426 bytes)

所以,须设置存储器,修改链接文件,由f8w2430.xcl改成f8w2430pm.xcl。

第五步:根据需要,在f8wConfig.cfg里设置三个参数:

/* The number of millisecondss to wait between data request polls to the coordinator. */

-DPOLL_RATE=1000

/* This is used after receiving a data indication to poll immediately

 * for queued messages...in milliseconds.

 */

-DQUEUED_POLL_RATE=100

/* This is used after receiving a data confirmation to poll immediately

 * for response messages...in milliseconds

 */

-DRESPONSE_POLL_RATE=100

Z-stack工程终端设备默认情况下为电源管理关闭,自动轮询消息这一功能是开启的。这里 有三个轮询选项,每一个都由一个不同的时间延迟参数控制。当电源管理功能开启后(添加POWER_SAVING),任一个轮询选项的设置都会影响到睡眠模 式。时间延迟的设置不能用于DEEP skeep中的轮询,因此限制了降低功耗。这三个轮询选项分别如下:

Data Request Polling—周期性向父节点发送数据请求来轮询消息队列。轮询的时间间隔由NLME_SetPollRate()或gNWK_POLL_RATE设定,如果事先没有使能它,那么在调用时就立即进行轮询。

Queued Data Polling—在收到数据指示后,就会向父节点请求消息。这个时间间隔可由NLME_SetQueuedPollRate()或gQUEUED_POLL_RATE设定。

Response Data Polling—在收到数据确认指示后,就会向父节点请求响应消息,这个时间间隔可由NLME_SetResponsePollRate()或gRESPONSE_POLL_RATE设定。

函数说明:

NLME_SetPollRate()——设置/改变网络检测速率,仅终端设备可用。

NLME_SetQueuedPollRate()——设置/改变队列检测速率,仅终端设备可用。

NLME_SetPollRate()——设置/改变响应检测速率,仅终端设备可用。

如果只是使用默认的轮询频率进入睡眠态,则只能进入LITE sleep。为了进入DEEP sleep则必须将gNWK_POLL_RATE设为0,不让它反复轮询。

设置这个三个选项可以实现多种轮询方式,例如,对于一个不需要接收消息的设备,在它加入网络后,就将这三个选项都设为0。如果APS层使用了ACK,则必需确保在消息发送后到收到ACK这一段时间内,轮询是使能的。

在有的系统中,可能需要使用可变的轮询频率,根据具体应用而进行设置。

第六步:检查,确保Z-stack里所有的任务都支持POWER_SAVING,没有周期性的激励activity(唤醒事件、活动事件)

第七步:查看是否进入低功耗了。

在osal.c文件中osal_start_system()中以下部分加断点,看是否进入。这里需要注意的是进入低功耗后debug就不能用了,IAR会提示overflow,这个是正常的,reset后,退出debug即可。

#if defined( POWER_SAVING )

    else  // Complete pass through all task events with no activity?

    {

      osal_pwrmgr_powerconserve();  // Put the processor/system into sleep

    }

#endif

 

详见Power Management For The CC2430DB_F8W-2006-0019_.pdf

以上设置某个地方可能还存在问题,过遗漏了些设置,现在问题是:有时候收不到发送的数据