BT 进deep sleep 由软件触发,退出deep sleep mode 有三种方式:
- Sleep Deepsltime auto wakeup
- 软件写soft_wake_req 寄存器提前唤醒BT(该寄存器在BT DM reg中,需确保有BT AHB clock)
- External wake up :外部唤醒源唤醒,目前有以下几个唤醒源:PMM GPIO,rtc tmr0/1,charger 充电唤醒,电池恢复电量唤醒
- Enter BT deep sleep mode
- BT 进deep sleep前,软件配置寄存器radio_sleep_en, osc_sleep_en, twext,twosc,twrm, deepsltime (寄存器功能描述请见寄存器文档)
- 软件触发进入Deep sleep 流程: 配置寄存器deep_sleep_en
- HW 经过最多不超过4个RTC cycle进入DEEP_SLEEP 状态,且拉高deep_sleep_stat
Deepsldur开始计数。在该clock cycle BT 16M clock 被clock gating,
- 再经过1个RTC cycle BT clock(clkncnt和finecnt)被low power clock domain register锁存,且拉低osc_en和 radio_en, bt ahb clock 被gating (影响soft wake up)
- BT deep sleep auto wakeup
- 在 BT sleep time到之前TWOSC个 RTC cycle osc_en 拉高, 使能BT ahb clock
- 在 BT sleep time到之前TWRM 个RTC cycle radio_en 拉高, 使能BT phy 16M工作时钟
- BT deepsldur达到设定的sleep time时,HW 产生wakeup 信号,同时打开BT 16M工作时钟
- 随后HW wakeup信号经过16M clock double sync 触发BT FSM工作,产生wake up interrupt,finecnt 恢复到sleep之前值,开始递减
- 软件在wakeup int中读寄存器DEEPSLDUR,得到当次SLEEP RTC cycle数,再根据RTC monitor的结果,计算本次需要补偿的BT clk值,配置寄存器FINECNTCORR ,CLKNCNTCORR和DEEP_SLEEP_CORR_EN
- 等待finecnt 减到0,将FINECNTCORR ,CLKNCNTCORR补偿到FINECNT 和CLKNCNT
注:DEEP_SLEEP_CORR_EN在第一个 finecnt 减到0之后使能也没关系,CLKN 会正常跳转
- 产生wakeup 后第一个 CLKN 中断,对齐312.5us边界
- BT deep sleep soft wake up
Soft wake up 和 auto wake up基本流程一致,的主要区别如下:
- Soft_wake 前需force enable BT AHB clock(apb_glb1_reg中的peri1_bt_soc_en)
- Soft_wake_up 生效后osc_en 拉高, 等到TWEXT 时间后产生HW wake up信号