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

2019-07-14 01:48发布

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