关于CC2541的低功耗问题
问题一:
我开了宏定义POWER_SAVING,进不去低功耗,但是我通过调试,修改hal_drivers.c中的HAL_PWRMGR_HOLD_EVENT事件(如图),这样就可以,不知道对系统影响大不大?
问题二:
不开宏定义POWER_SAVING,1、采用自己编写的函数进入低功耗,需要在蓝牙断开后进入低功耗模式5s唤醒(如图),这个方法可进入低功耗模式,但是测试得出结论,手机反复连接和断开蓝牙几次后(不定,有时3次,有时十几次)就进入了未知地方,程序完全好像就死掉了。2、采用系统给定的睡眠函数halSleep(),完全进不去低功耗!我猜测应该进入低功耗之前要作一些判断或者关闭什么东西吧?
请求大家帮忙解决这个问题,感激不尽!
sunxiang,
很好的尝试。
但是建议你不要去手动调用进入低功耗的函数,这些是由OSAL来自动调度的。
在坛子里说了N次了,只要你没有广播,没有连接,没有timer事件,系统是会自动进入PM3模式的,就是休眠模式,这个时候是只能由IO中断来唤醒。
在广播间隔和连接间隔间,或者timer事件间,都是PM2模式。
各种功耗的情况,你可以用电流表或者示波器来看系统进入了哪种模式。电流应该是接近或者一样的,跟datasheet上。
但是,我不做那个修改,完全进不去啊。 我想不用系统来调度(不开POWER_SAVING),平时都是主动模式,在蓝牙断开过后进入低功耗(PM2模式)5s就可以了 ,这个怎么解决呢?
非常感激你的回答!
sunxiang,
只要你确保没有我之前说过的那些动作在代码里面,系统是会自动进入低功耗模式的,不需要任何改动。
你需要确认一下你的代码在你想要进入低功耗模式的时候,是否还有不该运行的东西在运行,比如timer。
// Should we even look into power conservation if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) { // Are all tasks in agreement to conserve if ( pwrmgr_attribute.pwrmgr_task_state == 0 ) { } }
如上述代码所示,进入低功耗需要判断两个变量的值,一个是pwrmgr_attribute.pwrmgr_device,一个是pwrmgr_attribute.pwrmgr_task_state,你可以用source insight查看下这两个变量在哪里修改过。