沁恒蓝牙系列MCU低功耗底电流异常问题排查

目录

本文针对沁恒微的蓝牙系列MCU即CH57x、58x、59x芯片,这几个系列的MCU低功耗逻辑相当类似。在BLE应用中,若出现功耗突然变高的情况,可以参考PM例程,用例程中的sleep和shutdown休眠,测试休眠的底电流。以下总结常见的底电流功耗异常原因及处理方式。

各个等级的休眠底电流,在手册中5.3章节有介绍。以CH592的手册为例:

 

准备工作:测试板上只保留最小系统,其他元器件如LED指示灯都去掉,确保只监测了蓝牙MCU的功耗。LDO可以保留,但有降压就有电流损耗,不同压差、不同LDO芯片的电流损耗不同,建议也去掉,直接用3.3v给蓝牙MCU供电。如果在硬件成本和更低功耗之间偏向于低功耗,建议保留VSW引脚处的电感以启用DCDC功能,对降低功耗帮助很大。

 

①若测试结果超过表格内的电流约1uA,可以认为是测试误差或是温度影响。

注意PM例程中默认是开启32K晶振的供电的,如果不需要使用RTC唤醒,只要GPIO唤醒,对于CH57x、CH58x,可以用下面三行代码确保关闭32K晶振的电源。

sys_safe_access_enable();
R8_CK32K_CONFIG &= ~(RB_CLK_INT32K_PON | RB_CLK_XT32K_PON);
sys_safe_access_disable();

对于CH59x,在LowPower_Sleep()的参数中新增了一项配置RB_XT_PRE_EN,用于在频繁唤醒时降低功耗,但由于该功能用到了32K晶振,故不能直接调用上面三行代码;如果一定要降低32K晶振保持供电的电流,大概0.4uA,也不需要RTC唤醒,可以去掉RB_XT_PRE_EN配置项,再调用上面三行代码确保关闭32K晶振电源。如果CH59x关掉了RB_XT_PRE_EN配置项和32K晶振的供电,在应用于BLE工程时,休眠函数也要参考CH582EVT中的CH58X_LowPower函数改写,要多一个进入Idle等待32M晶振稳定的处理。

 

②若测试结果超过表格内的电流几个uA,一般是焊接问题,尽量将引脚处的GND加焊饱满。如果测试时使用了5v供电,经过了板子上的LDO降压,有一两个uA的电流损耗也是正常。

 

③若测试结果在几十到上百uA,很可能是休眠时GPIO管脚漏电,需要明确休眠时,每一个使用到的GPIO的外部电压,配置GPIO为外部电压接近的输入上/下拉,不能配置为浮空输入。建议参考PM例程/BLE例程的HAL_SLEEP使能处理,将所有GPIO均上/下拉固定电平,包括某些内核存在但封装没有引出的IO也需要上/下拉固定电平,未引出的IO默认浮空输入也会漏电

 

④若测试结果在1mA左右,可能是由于休眠的前一刻,GPIO引脚的电平没有满足GPIO唤醒的条件,比如说配置下降沿唤醒,休眠前GPIO就处于低电平状态,无法产生下降沿,会进入Idle等级的休眠。如果此情况不是外部电压异常,可以在休眠前,代码里读取一下GPIO引脚的当前电平,配置相对应的GPIO唤醒方式,再休眠。比如说读到了GPIO当前处于低电平,就配置为上升沿唤醒再进入休眠。Idle休眠时,32M主频是继续跑的,故可以启用看门狗,超时看门狗复位来增加容错率。

 

⑤若测试结果在好几个mA,建议排查代码有没有跑到休眠执行的函数,很可能是没有进入休眠,还在主循环里跑。类似的情况有BLE主机代码或是RF的接收代码,默认启用接收扫描,接收时的功耗会达数个mA。

posted @ 2023-05-29 17:19  JayWell  阅读(1059)  评论(0编辑  收藏  举报