路由器 低功耗设置
TI大神:
小弟在测试PM2低功耗模式下,预想的是 每5s中,向外发送一次广播信息。广播信息后,保持1s的监听时间,然后再转入允许休眠的时间。周而复始的进行,使其能够降低功耗。
实现思路:创建两个事件,一个是广播发送事件,另一个是允许进入低功耗事件。在上电入网或者建立网络后,触发广播任务。广播发送事件的周期为持续工作事件,记为T1,允许进入低功耗的周期的事件为休眠时间,记为T2,那么,整个工作周期就为T1+T2。
代码流程如下:
if ( event & START_EVT ) { //发送广播信息 ...
osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); osal_pwrmgr_task_state(sapi_TaskID,PWRMGR_HOLD);
//确保在接下来的时间内,接收机是打开的
#define MAC_RECEIVE_ON 1
#define MAC_RECEIVE_OFF 0
uint8 value = MAC_RECEIVE_ON;
MAC_MlmeSetReq(MAC_RX_ON_WHEN_IDLE,&value);
osal_start_timerEx(sapi_TaskID,SLEEP_EVT,1000); //等待1s,在这1s内,接收机始终处于开启状态。 return event ^ START_EVT; } if ( event & SLEEP_EVT ) { osal_pwrmgr_device( PWRMGR_BATTERY ); osal_pwrmgr_task_state(sapi_TaskID,PWRMGR_CONSERVE); osal_start_timerEx( sapi_TaskID,START_EVT,4000); //允许进入休眠,4s后再次发送广播周期 return event ^ SLEEP_EVT; }
以下的修改,在halSleep函数中。
1 在进入MAC层休眠之前,需要手动关闭MAC层接收机,相关代码为
uint8 value = MAC_RECEIVE_OFF;
MAC_MlmeSetReq(MAC_RX_ON_WHEN_IDLE,&value);
2.. 在针对路由器的低功耗中,终端的MAC休眠模式不能使用,应该改为使用MAC_PwrOffReq(MAC_PWR_SLEEP_LITE),轻度休眠模式。
只要经过上述这两点的修改,路由器模式下,也是可以进入低功耗的。至于在广播数据后,等待接收数据的时间与整个广播周期的比例,则取决于你应用场景所需要的休眠占空比。
如上面的框架代码:发送广播数据后1s内,保持接收机唤醒状态。1s后,允许当前任务进入低功耗,之后OSAL完成自己的事件处理,随机进入低功耗,在4s的时间内,会发生几次进入低功耗的情况,这是正常的。4s后,设备再次发送广播信息,周而复始重复上述操作。
采用上述的做法,可以使路由器节省一定的功耗(协调器在建立网络后,也是可以这样来实现的)。
上述是小弟在基于OSAL低功耗实现方面的摸索出来的一点心得体会,贡献出来,请大家点评,共同提高。
谢谢分享!
在实际应用中,路由一般是有线供电的,所以不太需要休眠。
另外路由负责转发数据,并且不知道需要转发的数据什么时候会过来。
大神您好!求让终端进入休眠的资料!我按照网上说的设置POWER_SAVING,最终LED灯闪烁的非常快,怎么控制这个时间呢?而且我的节点进入不了深度睡眠,求大神指点啊!
/* HAL_SLEEP_PM2 is entered only if the timeout is zero and
* the device is a stimulated device.
*/
halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
/* DEEP sleep can only be entered when zgPollRate == 0.
* This is to eliminate any possibility of entering PM3 between
* two network timers.
*/
zgPollRate=0,当系统的timeout为0的时候,就会进入PM3
无私奉献,这个很有用,谢谢
那中断 进入PM2 模式需要怎么配置
1.开启POWER_SAVING 预编译
2.f8wConfig_cfg 中的RFD_RCVC_ALWAYS_ON=FALSE
3.f8wConfig_cfg中四个DPoll_RATE设为0
4.ZGlobals.c中三个PollRate设为0
5.Onboard.c文件中,OnboardKeyIntEnable=HAL_KEY_INTERUPT_ENABLE
6.hal_drivers.c中if(!Hal_KeyIntEnable)中的语句关掉
7.osal_pwrmgr_init(void)中pwrmgr_attribute.pwrmgr_device=PWRMGR_BATTERY
我按照这个来配置 我在连上网络的地方 调用Halsleep(4000); 然后在睡眠中断里 改变LED1 LED2 的状态 运行的时候 却是没5S LED 状态更换一次 5s是因为周期点播 周期是5s 是不是我哪里配置错了
MAC_MlmeSetReq 可以关闭网络接收机
MAC_PwrOffRwq 可以关闭mac和radio
我的目的是终端pa,在pm2模式下降低功耗,现在是0.3ma。我不知道这是什么概念,是否正常。
但我的目标是再小10倍,否则电池还是不够久。
我的想法是休眠期间关闭pa是否就能省电了呢?(因为同样的工程下载到非pa里面,电流也就1ua多点)差了100多倍。这想法是否正确呢?
我看hal_sleep里面睡眠都执行了MAC_PwrOffRwq (deep),这里有关闭pa吗?MAC_MlmeSetReq 能关闭什么呢?有什么区别呢?一些mac的看不到了。