CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!
无匹配项 共计114个匹配页面

介绍

BLE SoC支持Active、Idle、Deep Sleep三种功耗模式,在无活跃业务时会进入深度睡眠,将关闭除Always On域、SRAM外所有片上外设的电源,并切换到低速时钟域运行。每个外设模块的状态分为RESET(设备未初始化)、READY(设备就绪)、BUSY(设备忙),当配置为Deep Sleep时,系统会判断每个外设是否处于RESET或者READY状态,只有每个外设都不处于BUSY状态,即外设无活跃业务,系统才会进入深度睡眠模式。当收到唤醒源唤醒事件后,会执行一次复位启动过程并恢复到睡眠前的上下文。

为保持睡眠唤醒后和进入睡眠前的状态一致,在执行Deep Sleep流程之前,需要备份正在使用的外设模块的寄存器。在唤醒流程中,调用各个模块睡眠唤醒函数,再将备份的外设寄存器还原。在APP_DRV中有一套备份和恢复的程序框架,实现了外设睡眠恢复的自动管理,用户使用APP_DRV,则无需自行备份恢复这些寄存器,显著降低了使用复杂度。

软件现有两种实现方式:
  • 一种是备份和恢复函数在HAL层实现,且外设状态通过g_devices_state的bit位进行标识。该方式适用于GR5526,APP_DRV接口主要实现备份和恢复函数的注册和调用,如pwr_register_sleep_cb、pwr_enter_sleep_check_new和pwr_wake_up_ind_new。
  • 另一种备份和恢复函数在各个外设驱动进行实现,例如xxx_prepare_for_sleep和xxx_wake_up_ind,且外设状态通过外设句柄状态位标识,使用hal_xxx_get_state函数可获取外设状态。该方式适用于GR551x,各模块在初始化时会调用pwr_register_sleep_cb函数,注册各个模块的备份恢复相关函数。
图 4 睡眠函数注册流程

系统进入睡眠前,会调用pwr_enter_sleep_check,检查各个模块是否可以进入睡眠,可以则调用xxx_prepare_for_sleep备份正在使用的外设模块的寄存器;如果该模块在进入睡眠时设备正在进行不可打断的工作,暂时不能进入睡眠,则调用xxx_sleep_canceled取消睡眠状态,恢复相关寄存器;系统唤醒后,调用pwr_wake_up_ind,从而调用各个模块的xxx_wake_up_ind,将备份的外设寄存器还原。

扫描关注

打开微信,使用“扫一扫”即可关注。