在TMOS系统中手动管理休眠
链接: https://pan.baidu.com/s/1jGtbfLcnl5hyvStpEYX7zQ?pwd=wch6
提取码: wch6
以CH58x、CH59x为例,使用电池供电的应用,多数会选用Sleep或Shutdown等级的休眠,那么至少要有RTC或是GPIO唤醒中的其中一种手段唤醒MCU(BAT低电压唤醒取决于VIO33引脚上的电压,不是代码能够控制的,暂且排开)。
在BLE代码中,为了让BLE协议栈能够在休眠期间及时唤醒发包,维持BLE的连接,一般是建议在BLE工程中启用HAL_SLEEP,让协议栈管理休眠,协议栈会利用RTC唤醒来安排低功耗;如果用户对逻辑把握准确,BLE使用频次不高,也是可以参考PM代码中的休眠,自行管理休眠的。
比如某应用中,蓝牙MCU不需要一直循环工作,再等待外部信号时才需要工作,故不由RTC唤醒,只由外部GPIO信号唤醒;蓝牙MCU醒来后跑BLE,期间MCU全速工作不休眠,通信完后才休眠,等待下一次外部GPIO信号唤醒;要求MCU不能复位,RAM要保持供电。此时可以参考下方代码块安排休眠。
注①:CH592有提前唤醒功能(在LowPower_Sleep()函数中配置RB_XT_PRE_EN位),但需要一直保持32K时钟的电源。压缩包代码中没有配置该功能,故可以彻底关闭32K电源。在频繁唤醒的场景下(如连接间隔比较短的BLE连接中),启用RB_XT_PRE_EN配置可以帮助节省电流。
注②:在BLE连接状态下不要直接手动调用LowPower_Sleep()执行休眠,会导致BLE状态机错误。要确保BLE断开后再执行休眠。压缩包代码中查询了当前是否处于连接态,需要再进一步确认的话,需要在“Connected...”打印处再加标志,判断状态机已处于“广播态”。为了提供断开BLE连接的handle参数,压缩包代码中做了如下声明:
extern peripheralConnItem_t peripheralConnList; //XXX 在peripheral.c中定义的静态变量,删去static修饰,改为全局变量