网站首页
管理程序
智能项目
上位机
CC2530
ESP8266
MQTT云服务
生活休闲
网站首页
>>
CC2530
>>
CC2530技术资料
>>
查看详情
如何实现ZigBee休眠与唤醒
2018-10-19 15:50:29
CC2530有3种睡眠模式,pm2模式比较省功耗而且可以被定时唤醒;pm3模式最省电但是只能被
外部中断
唤醒
1、sensordemo的sensor在入网以后,为什么灯在不断地闪?
其实,闪一次就是睡眠了一次:亮的时候睡过来,灭的时候睡下去。具体代码在halSleep函数里。要做的,就是读懂这个机制是怎么运作的。
2、为什么闪的频率那么高?
zstack的睡眠机制就是在
操作系统
没事干的时候才睡眠,频率高说明应用程序让
操作系统
不断做事。你想让它长时间睡眠,那要做的就是不要不断地给
操作系统
事情做,找到分配系统任务的地方。
要设置低功耗模式,先确认:
1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE
2.Options->C/C++Compiler->Defined symbols中添加预编译“POWER_SAVING”;
重要函数void halSleep( uint16 osal_timeout )
1.首先将osal_timeout转成以320US为单位
2.获取下一次MAC定时器到期时间
3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
//为PM2,PM3模式。 没有任务要执行就进入PM3
深度睡眠
,否则进入PM2睡眠,可以定时器唤醒。
4.唤醒
OSAL机制的ZigBee低功耗管理(CC2530)
涉及文件
OSAL_PwrMgr.h OSAL
电源管理
的API头文件
OSAL_PwrMgr.C OSAL
电源管理
的API C文件
hal_sleep.c 底层的
电源管理
文件
电源管理结构体
typedef struct
{
uint16 pwrmgr_task_state; //任务状态
uint16 pwrmgr_next_timeout; //下一次超时
uint16 accumulated_sleep_time; //
睡眠时间
uint8 pwrmgr_device; //电源管理设备属性,有PWRMGR_ALWAYS_ON 和 PWRMGR_BATTERY两种
} pwrmgr_attribute_t;
#define PWRMGR_ALWAYS_ON 0
#define PWRMGR_BATTERY 1
选择PWRMGR_ALWAYS_ON的话将不会进入睡眠模式,选择PWRMGR_BATTERY将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态。
#define PWRMGR_CONSERVE 0
#define PWRMGR_HOLD 1
低功耗标志,主要用于osal_pwrmgr_task_state()这个函数中,用于标志每一任务是否需要低功耗。
extern pwrmgr_attribute_t pwrmgr_attribute
定义一个电源管理的全局变量。
/*********************************************************************
* @brief 初始化电源管理函数,这个函数在OSAL.C里面的osal_init_system( )调用,
也就是在OSAL
系统初始化
的时候将电源管理模式调成了不会进入睡眠模式的状态。
*/
void osal_pwrmgr_init( void )
{
pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; //默认没有睡眠模式
pwrmgr_attribute.pwrmgr_task_state = 0; //清零
}
OSAL系统在检查完所有的任务事件之后发现没有事件需要处理,这样在POWER_SAVING宏定义打开的情况下将调用osal_pwrmgr_powerconserve();函数,在这函数中将会根据选择系统进入休眠。
退出休眠
当出现IO中断或者复位时候会退出休眠,或者在休眠定时器中断时候也将会退出休眠。如果是IO中断或者休眠定时器中断退出之后将回到进入休眠的地方继续向下执行,复位退出的话进入程序的初部分执行。
点击免费电话咨询:13964326707
创同科技
鲁ICP备2023004006号-1
电话:0533-7081866 手机:13964326707
地址:淄博市临淄区齐陵路180号
技术支持:
创同科技
网站首页
一键拨号
联系我们
我的