微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540功耗模式设置问题

CC2540功耗模式设置问题

时间:10-02 整理:3721RD 点击:

Hi 大家好!

我在CC2540功耗模式设置上遇到了一些问题,CC2540功耗模式该如何设置?

我现在想要让CC2540进入PM3模式,按键触发后退出睡眠进入正常工作的模式,如PM2、PM1和PM0。

我在simpleBLEcenter例程上修改,在void SimpleBLECentral_Init( uint8 task_id )末尾写上如下函数:

OSAL_SET_CPU_INTO_SLEEP( 0 );

结果CC2540无法正常工作了,Debug发现程序停留在OSAL_SET_CPU_INTO_SLEEP( 0 ); 估计已经进入睡眠,但是我怎么按按键都无法唤醒。

但是我将

OSAL_SET_CPU_INTO_SLEEP( 0 );写在uint16 SimpleBLECentral_ProcessEvent( uint8 task_id, uint16 events )的

 if ( events & START_DEVICE_EVT )
  {
    // Start the Device
    VOID GAPCentralRole_StartDevice( (gapCentralRoleCB_t *) &simpleBLERoleCB );

    // Register with bond manager after starting device
    GAPBondMgr_Register( (gapBondCBs_t *) &simpleBLEBondCB );

     OSAL_SET_CPU_INTO_SLEEP( 0 );

……}

又可以用按键唤醒,并正常工作。

疑问:1、OSAL_SET_CPU_INTO_SLEEP( 0 );这个函数可以进入功耗模式PM3吗?标准的进入功耗PM3的写法是怎么样子的?

          2、退出睡眠又该如何操作?需要在中断函数里将PM3先转变为PM2等其他模式吗?

谢谢!

建议不要直接这样调。如果你是基于协议栈开发的话,睡眠管理是BLE-STACK的一部分,你单独这么调,有很多问题没有考虑到。协议栈可以进入PM3,只要没有其他定时事件。可以参考STACK中Advremote例子,这就是个遥控器,没有连接时进入PM3靠按键激活。

Hi TY,

你好!我看了HIDAdvRemote的例程,看到如下代码: 

if ( events & MOTION_SENSOR_TIMER_EVT )
  {
    /* user hasn't performed mouse activity -- turn off motion sensor system */
    HalMotionDisable();
    arcMotionDetectorState = MOTION_DETECTOR_DISABLED;

    /* enable  power management */
    osal_pwrmgr_device( PWRMGR_BATTERY );

    return ( events ^ MOTION_SENSOR_TIMER_EVT );
  }

osal_pwrmgr_device( PWRMGR_BATTERY ); 这个就是设置功耗PM3的代码操作吗?有没有其他遗漏的地方?

谢谢!

Hi TY,

osal_pwrmgr_device( PWRMGR_BATTERY ); 这个就是设置功耗PM3的代码操作吗?

没有看到是如何设置功耗管理的寄存器的啊。

这个函数是表示允许进入睡眠,仔细看看void halSleep( uint32 osal_timeout ) 函数,流程很清晰啊。

其中有

  // HAL_SLEEP_PM3 is entered only if the timeout is zero
  halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;

HAL_SLEEP_DEEP是PM3,HAL_SLEEP_TIMER是PM2.

这种函数不要直接调,可以让他满足条件而进入。

Hi TY,

我现在想要按键开机之前是PM3状态,当按键开机后退出PM3,然后开机状态下按键关机再次进入PM3.你说这种函数不要直接调用,让他满足条件进入,但是我不知道该如何满足他的条件啊?

没有其他定时事件,就可以进入,我上面的回复有提到,特别是如下的在hal_sleep()中的语句。你可以debug跟踪进去。你的应用可以从advanced remote改。

  // HAL_SLEEP_PM3 is entered only if the timeout is zero
  halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;

但是就算有其他定时事件,按了关机键也要进入PM3睡眠,该如何去做呢? 难道要将 halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; 这条语句改成halPwrMgtMode = HAL_SLEEP_DEEP ?或者直接位操作寄存器强制进入睡眠? 但是你上面说可能协议栈不允许,会出问题。 谢谢!

取消这个定时事件。进入PM3只有外部中断才能唤醒。如果有定时事件,进入PM2,功耗也不会比PM3大多少。所以要考虑一种合理的方式。

该如何知道有没有定时事件啊?当程序运行时不知道程序中到底有哪些定时事件没完成啊?如何取消,想不通该如何处理啊。

osal_pwrmgr_powerconserve()函数。通过osal_next_timeout()来看是否还有定时事件。

osal_start_timerEx()与osal_stop_timerEx()是起停定时事件函数。理解你看到这么多函数晕,还是多花点时间看代码调试。

谢谢你的理解。这些函数我都看过了,当有定时事件时,我是等待下次定时事件完成后或者直接取消当前正在执行的定时事件,然后才可以进入深度睡眠PM3的吗?

这个睡眠是使用了PM2和PM3混合的,我想比单一PM3要灵活些。你可以等待定时事件完成(完成了你不调用osal_start_timer是不会周期运行的),定时事件会用PM2睡眠。我的意思是说不要有那种周期性睡眠的定时事件。有的话,按这套机制,你是肯定进不了PM3的。

哦,意思就是说不要有周期定时事件,系统自己就会自动进入PM3吗?还是说取消PM2的周期睡眠唤醒定时器?

没错,但是如果你是BLE的连接状态,肯定也进不了,显然,底层有个保持连接的周期唤醒的事件

明白了,非常感谢!Thanks!

有帮助的话,请确认下,close 掉这个topic,谢谢。

hi, TY

我的程序已经进入断开状态了,而且关掉了广播,关掉了其他的事件,用debug模式break的时候显示停留在halSetSleepMode函数,那能不能说明我的程序已经进入PM3了?

如果没有在bebug模式时测量的电流仍然有0.1mA, 可能是什么原因造成的呢?

有定时事件会进入PM2,没有的话进入PM3(需要外部事件唤醒)。 如果是0.1mA左右,应该还有是外设打开的。

最低功耗的测试如下Link,先照着做看能不能达到在1s连接是16uA.

http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=swra347&fileType=pdf

请问一下,你这个问题现在解决了没?我现在也碰到这个问题,想问问怎么设置?

不用的口都设置输出低,不要在debug模式下测功耗。

我现在想要按键开机之前是PM3状态,当按键开机后退出PM3,然后开机状态下按键关机再次进入PM3.这些要怎么设置?

PM3模式仅仅只能靠按键唤醒?那么PM2模式 可以都通过无线唤醒嘛?

PM3只有外部中断可以唤醒,PM2除了外部中断还可以使用sleeptimer唤醒,没有无线唤醒。STACK里的电源管理,不要自己去用代码控制。

我若直接设置halPwrMgtMode= HAL_SLEEP_DEEP,系统会进入PM3模式,但是按键后系统只能进入一次发出广播信号,发完就立刻停了。这是什么情况?

不建议自己去修改,强制进入PM3, 协议栈底层是看不到的,能否进入低功耗,不能只考虑你自己的应用。你关闭广播,关闭外设,关闭任何定时器,让系统通过自己的电源管理模块而进入PM3.

TY:

问一下,如果那样设置了,怎么通过按键唤醒?我看到很多资料都说协议栈程序已经设置好了,怎么我这里唤醒不了?

参考里面keyforb的例子。BLE-CC254x-1.4.1.43908b\Projects\ble\KeyFob。

IAR打开工程,然后ctrl+shift·+F,搜索CC2540_MINIDK, 然后跟着模仿看如何增加按键激活。

TY

能不能够告诉我大概怎么设置?看那个keyFob例程不是太懂

請問解決了嗎? 我也有同樣的問題.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top