http://hi.baidu.com/dearplain/item/64c84f30a5fce8c41a96961f
在研究低功耗前先对CC2430的几种电源(功耗)模式有个大概的了解是很有必要的。下面几种电源模式比较,很清晰吧!详见datasheet
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
以上设置某个地方可能还存在问题,过遗漏了些设置,现在问题是:有时候收不到发送的数据