TI论坛
直播中

李雨晨

7年用户 189经验值
私信 关注
[问答]

如何设置CC2540功耗模式?

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等其他模式吗?
谢谢!

回帖(29)

凌云志

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

李雨晨

2019-11-5 04:32:27
引用: shenzhenqide 发表于 2019-11-5 17:12
建议不要直接这样调。如果你是基于协议栈开发的话,睡眠管理是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的代码操作吗?有没有其他遗漏的地方?
谢谢!
举报

李雨晨

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

Hi TY,
osal_pwrmgr_device( PWRMGR_BATTERY ); 这个就是设置功耗PM3的代码操作吗?
没有看到是如何设置功耗管理的寄存器的啊。
举报

凌云志

2019-11-5 04:47:34
引用: wangrubing 发表于 2019-11-5 17:31
Hi TY,
你好!我看了HIDAdvRemote的例程,看到如下代码: 
if ( events & MOTION_SENSOR_TIMER_EVT )

这个函数是表示允许进入睡眠,仔细看看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.
这种函数不要直接调,可以让他满足条件而进入。
                                                                          
举报

更多回帖

发帖
×
20
完善资料,
赚取积分