ble协议栈中关于低功耗处理sleep的问题

1.

  cfg.WakeUpTime = WAKE_UP_RTC_MAX_TIME;

  cfg.sleepCB = CH57X_LowPower;    // 启用睡眠

这个WAKE_UP_RTC_MAX_TIME是不是作为CH57X_LowPower()函数的参数传入了?还是在协议栈中做了别的处理

2.

u32 CH57X_LowPower( u32 time )

{

#if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE)

  u32 tmp, irq_status;


  SYS_DisableAllIrq( &irq_status );

  tmp = RTC_GetCycle32k();

  if ( ( time < tmp ) || ( ( time - tmp ) < 30 ) )

  {    // 检测睡眠的最短时间

    SYS_RecoverIrq( irq_status );

    return 2;

  }

  RTC_SetTignTime( time );

  SYS_RecoverIrq( irq_status );

#if( DEBUG == Debug_UART1 )  // 使用其他串口输出打印信息需要修改这行代码

  while( ( R8_UART1_LSR & RB_LSR_TX_ALL_EMP ) == 0 )

    __nop();

#endif

// LOW POWER-sleep模式

  if ( !RTCTigFlag )

  {

    LowPower_Sleep( RB_PWR_RAM2K | RB_PWR_RAM16K | RB_PWR_EXTEND );

#if (defined (DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)

    PWR_DCDCCfg( ENABLE );

#endif

    time += WAKE_UP_RTC_MAX_TIME;

    if( time > 0xA8C00000 )   time -= 0xA8C00000;

    RTC_SetTignTime( time );

    LowPower_Idle();

    HSECFG_Current( HSE_RCur_100 );     // 降为额定电流(低功耗函数中提升了HSE偏置电流)

  }

  else

  {

    return 3;

  }

#endif

  return 0;

}

这个函数中,执行LowPower_Sleep()进入睡眠,后边 LowPower_Idle()函数是做什么用的?


这里的后面的LowPower_Idle 实际上是一个1ms 左右的延时,是为了等待外部高频晶体稳定.

在以往的例程中,是通过delayus(1500) 来实现,

但是为了进一的降低功耗,后面使用了LowPower_Idle 休眠,

但是这可能引来了一个风险:

1.在非RTC唤醒的情况下,后面由于传参仍然是基于前面 调用

u32 CH57X_LowPower( u32 time ) 传进来的时间,可能导致 接下来进入LowPower_Idle 中,直到 再一次产生唤醒条件


所以,你可以

1,将这部分替换为delayus(1500) 

或者:

2,LowPower_Idle  之前的 RTC_SetTignTime( time ) 的time 根据当前时间,而不是传进来的时间.


只有登录才能回复,可以选择微信账号登录