简介
Bluetooth LE SoC支持Active、Idle、Sleep三种功耗模式,在无活跃业务时会进入深度睡眠,将关闭除Always On域、SRAM外所有片上外设的电源,并切换到低速时钟域运行。每个外设模块的状态分为RESET(设备未初始化)、READY(设备就绪)、BUSY(设备忙),当配置为Deep Sleep时,系统会判断每个外设是否处于RESET或者READY状态,只有每个外设都不处于BUSY状态,即外设无活跃业务,系统才会进入深度睡眠模式。当触发系统唤醒后,会执行一次复位启动过程并恢复到睡眠前的上下文。
为保持外设在睡眠唤醒后和进入睡眠前的状态一致,在执行Deep Sleep流程之前,需要备份正在使用的外设模块的寄存器。在APP驱动中有一套备份和恢复的程序框架,实现了外设睡眠恢复的自动管理,用户使用APP驱动时无需自行备份恢复这些寄存器,显著降低了使用复杂度。
软件现有两种实现方式:
- 一种是备份和恢复函数在HAL层实现,且外设状态通过g_devices_state的bit位进行标识。APP驱动接口只实现备份和恢复函数的注册和调用,如pwr_register_sleep_cb、pwr_enter_sleep_check_new和pwr_wake_up_ind_new。该方式适用于GR5526、GR5x25、GR533x。
- 另一种备份和恢复函数在各个外设驱动进行实现,例如xxx_prepare_for_sleep和xxx_wake_up_ind,且外设状态通过外设句柄状态位标识,使用hal_xxx_get_state函数可获取外设状态。各模块在初始化时会调用pwr_register_sleep_cb函数,注册各个模块的备份恢复相关函数。该方式适用于GR551x。
系统进入睡眠前,会调用pwr_enter_sleep_check,检查各个模块是否可以进入睡眠,可以睡眠则调用xxx_prepare_for_sleep备份正在使用的外设模块;系统唤醒后,调用pwr_wake_up_ind,从而调用各个模块的xxx_wake_up_ind,将备份的外设寄存器还原。