Z-Stack低功耗设置详解
原创文章,禁止转载。
本文链接:http://www.kaleidscope.cn:1020/archives/1542
最近在看TI协议栈下的document里的文档,总结下Zigbee的Power Management相关,劲量采用官方英文原文描述(红色字体都是官方原文)。
1、如何控制进入睡眠模式:
- Sleep enabled by the POWER_SAVING compile option
- ZDO node descriptor indicates “RX is off when idle”. This is done by setting RFD_RCVC_ALWAYS_ON to FALSE in f8wConfig.cfg.
- All Z-Stack tasks “agree” to permit power savings
- Z-Stack tasks have no scheduled activity
- The MAC has no scheduled activity
一般来讲低功耗都是对于终端节点来说的,之前一直觉得路由没法进入低功耗,后来翻阅了一些书籍,发现其实是有的,低功耗路由器(LPR),定义为通过定期对无线设备断电,靠电池运行很多年的路由器。个人觉得实际上并没有什么卵用。好了,其实官方的描述很清楚,其实使用官方的例程,预编译POWER_SAVING终端设备就已经进入PM2模式了,关掉一些外设后用万用表打一下,没有datarequest的时候基本稳定在1.2uA。文档所说的所有任务都要“agree” to permit power savings通过查看OSAL_PwrMgr.c我们可以看到电源管理的各个函数,例如osal_pwrmgr_init,osal_pwrmgr_device等,而要所有的task允许进入PWRMGR_CONSERVE 只需要调用osal_pwrmgr_task_state即可,实际上都是允许PWRMGR_CONSERVE的,在OSAL.C中,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
只是遇到一些特殊的情况需要我们手动去处理以达到强制进入低功耗的目的。最后其实就是空闲的时候关闭RX。
2、PM2模式和PM3模式的设置方法
对于应用层来说,要达到PM2或者PM3除了需要预编译POWER_SAVING之外,还需要关心 Z-Stack的enddevice数据轮询参数的设定,包括Data Request Polling、Queued Data Polling以及Response Data Polling,在f8wConfig.cfg里面也有预先设定的
这样就可以直接进入PM2模式了。
The default settings for these polling rates are defined and initialized in the nwk_globals.c source file, specifying that the End-Device will automatically poll for messages. If POWER_SAVING is enabled with these default polling rates, power conservation will be limited to TIMER sleep mode. To minimize power consumption by creating a DEEP sleeping device, repetitive polling should be disabled by setting the zgPollRate to zero.
很多初学者包括我,最开始也不知道如何进入PM3模式,其实阅读官方文档我们不难发现,要进入PM3模式其实就是讲POLL轮询间隔设置为0,即可,并没有想象中那么困难,要验证也很简单,用普通的万用表测电流,核心板电流PM3模式只有0.3uA。这里有一点需要提出来的就是大部分人使用的都是协议栈的按键检测,也就是key polling,文档中也提到Another polling activity is the key polling. The key polling is enabled at 100 millisecond rate by default. To disable key polling, change OnboardKeyIntEnable to HAL_KEY_INTERRUPT_ENABLE: 所以如果你测试发现有1.2uA,请注意使能按键中断而不是轮询。PM3模式下的节点有时候也需要向父节点POLL接收一些数据,在程序中可以灵活的使用NLME_SetPollRate等函数来动态管理POLL。
3、硬件处理
最后就是硬件层面的功耗设置了,未使用的IO口不能悬空:Unused I/O pins should have a defined level and not be left floating. One way to do this is to leave the pin unconnected and configure the pin as a general purpose I/O input with pull-up resistor. Alternatively the pin can be configured as a general purpose I/O output.
所以,记得在进入PM3模式之前处理未使用的IO口,以免消耗电流。
原创文章,禁止转载。
本文链接:http://www.kaleidscope.cn:1020/archives/1542
多谢分享!
建议可否加上一些对低功耗,功耗上的一些测试的截图之类的,这样就完美了!