7.37. 系统休眠

Overview

介绍系统休眠


7.37.1. 系统休眠配置与API

  • 系统休眠配置:配置文件在 app_config.h ,参考: apps/wifi_story_machine/include/app_config.h

    • wifi处于STA模式或者开启蓝牙情况下,整个系统自动休眠。

      ①在打开app_config.h打开如下宏,没有则添加上 #define CONFIG_LOW_POWER_ENABLE //低功耗开关

      ②在打开app_config.h修改 TCFG_LOWPOWER_LOWPOWER_SEL 宏,没有则添加上 #define TCFG_LOWPOWER_LOWPOWER_SEL (RF_SLEEP_EN | SYS_SLEEP_EN | RF_FORCE_SYS_SLEEP_EN)

      Note

      一般只开启 (RF_SLEEP_EN) 或者 (RF_SLEEP_EN | SYS_SLEEP_EN | RF_FORCE_SYS_SLEEP_EN)

      SYS_SLEEP_EN :操作系统时休眠使能,需要使操作系统空闲休眠或跟随RF休眠的必须使能。

      SYS_SLEEP_BY_IDLE :允许操作系统时空闲休眠使能,前提使能 SYS_SLEEP_EN

      RF_SLEEP_EN :允许wifi和蓝牙的RF休眠。

      RF_FORCE_SYS_SLEEP_EN :允许RF休眠时强制操作系统休眠,前提使能 SYS_SLEEP_EN

      操作系统空闲休眠则RF必须处于休眠。以上配置是根据系统状态进行的休眠,最好的效果是 (RF_SLEEP_EN | SYS_SLEEP_EN | RF_FORCE_SYS_SLEEP_EN)

      ③在打开board.c需添加上:低功耗配置和版籍电源初始化加上power_init()函数,参考 apps/wifi_story_machine/board/wl82/board_7911B.c

      /************************** LOW POWER config ****************************/
      static const struct low_power_param power_param = {
              .config         = TCFG_LOWPOWER_LOWPOWER_SEL,
              .btosc_disable  = TCFG_LOWPOWER_BTOSC_DISABLE,         //进入低功耗时BTOSC是否保持
              .vddiom_lev     = TCFG_LOWPOWER_VDDIOM_LEVEL,          //强VDDIO等级,可选:2.2V  2.4V  2.6V  2.8V  3.0V  3.2V  3.4V  3.6V
              .vddiow_lev     = TCFG_LOWPOWER_VDDIOW_LEVEL,          //弱VDDIO等级,可选:2.1V  2.4V  2.8V  3.2V
              .vdc14_dcdc     = TRUE,                                                            //打开内部1.4VDCDC,关闭则用外部
              .vdc14_lev              = VDC14_VOL_SEL_LEVEL,                             //VDD1.4V配置
              .sysvdd_lev             = SYSVDD_VOL_SEL_LEVEL,                            //内核、sdram电压配置
              .vlvd_enable    = TRUE,                                //TRUE电压复位使能
              .vlvd_value             = VLVD_SEL_25V,                        //低电压复位电压值
      };
      
      static void board_power_init(void)
      {
              power_init(&power_param);//电源初始化,包括休眠的参数
              ....
      }
      
    • 强制整个系统休眠API函数

      u8 low_power_all_group_force_sleep(u32 us);//强制休眠API函数
      

      Note

      注意 :强制休眠API函数,单位us,返回值:0正常休眠,大于0被io唤醒(值和board.c的唤醒IO配置的.attribute相关),小于0休眠失败(两次休眠时间间隔小于10ms,应用层需要在返回值小于0情况下,可多次尝试请求休眠,或者延时10ms后即可)

      low_power_all_group_force_sleep() 休眠函数使用不能使用在开启蓝牙,可以使用在开启wifi,但开启wifi情况下需要注意掉线等问题(休眠时间不能过长,一般1秒内) 使用该函数是wifi的RF和操作系统都会进入休眠状态。

    • 禁止和允许wifi或蓝牙的RF硬件自动休眠API函数

      void low_power_hw_unsleep_lock(void);//RF硬件禁止休眠
      
      void low_power_hw_unsleep_unlock(void);//RF硬件允许休眠
      

      Note

      RF硬件休眠的禁止和允许函数,和强制休眠函数 low_power_all_group_force_sleep() 无关,当强制休眠则禁止RF硬件休眠函数也无效。 当需要禁止RF硬件自动休眠,则调用low_power_hw_unsleep_lock(); 当需要允许RF硬件自动休眠,则调用low_power_hw_unsleep_unlock(); 当开启禁止RF硬件自动休眠,则操作系统不会进入休眠。

    • 设置系统idle空闲休眠时间API函数

      void power_set_sys_sleep_internal_us(u32 sys_sleep_internal_us);//设置系统的idle空闲休眠时间
      

      Note

      设置系统空闲休眠时间和操作系统相关,只有当操作系统都处于空闲状态才能进入休眠,休眠时间也根据操作系统空闲时间进行休眠,一般为20ms-50ms,用户需要加大休眠时间达到降低功耗,则使用power_set_sys_sleep_internal_us()函数自定义时间, 同时app_config.h的 TCFG_LOWPOWER_LOWPOWER_SEL 需要或上 SYS_SLEEP_BY_IDLESYS_SLEEP_EN