最近在研究CC250的低功耗模式,从官方的文档Measuring Power Consumption of CC2530 With Z-Stack.PDF文档中大概了解下需要配置的内容,结合自己测试的经验,大概介绍下。使用Zstack的版本如下:
ZigBee 2007 Release
Version 2.5.1a
April 25, 2012
CC530的功耗模式情况如下:
(1)LITE Sleep,我们所说的PM2模式,功耗在ma级别,会被任务定时器或者外部中断唤醒(按键中断)
(2)Deep Sleep,PM3模式,功耗最低,在uA级别,当没有任务需要执行的时候,会进入;只能被外部中断或者Reset唤醒。
进入低功耗模式需要注意五点:
1,我们使用的环境是IAR,首先需要在编译选项中加入POWER_SAVING,使能低功耗模式;其他没有用到的可以去掉,比如串口,LCD等功能。我的配置如下,前面带x的表示该功能被屏蔽了;
NWK_AUTO_POLL
xZTOOL_P1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
xLCD_SUPPORTED=DEBUG
POWER_SAVING
xNV_RESTORE
xNV_INIT
xHOLD_AUTO_START
配置好之后,再osal_run_system()函数中才能调用进入低功耗的模式:
#if defined( POWER_SAVING )
else // Complete pass through all task events with no activity?
{
//进入低功耗模式
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
}
#endif
(1)Data Request Polling—周期性向父节点发送数据请求来轮询消息队列。轮询的时间间隔由NLME_SetPollRate()或gNWK_POLL_RATE设定,如果事先没有使能它,那么在调用时就立即进行轮询。
(2)Queued Data Polling—在收到数据指示后,就会向父节点请求消息。这个时间间隔可由NLME_SetQueuedPollRate()或gQUEUED_POLL_RATE设定。
(3)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这一段时间内,轮询是使能的。在有的系统中,可能需要使用可变的轮询频率,根据具体应用而进行设置。
{
if ( level == OB_COLD )
{
// IAR does not zero-out this byte below the XSTACK.
*(uint8 *)0x0 = 0;
// Interrupts off
osal_int_disable( INTS_ALL );
// Check for Brown-Out reset
ChkReset();
}
else // !OB_COLD
{
/* Initialize Key stuff */
//HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback);//轮询方式
HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback);//中断方式
}
}
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
{
//pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation.
pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY;//电池供电
pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve。所有的任务支持省电
}