1.引言
STM32 L4 系列作为一款高性能的低功耗芯片,具有强大的运算处理性能和极低的运行和待机功耗,广泛应用于各种需要节能设备上。
2. 问题描述
客户使用 STM32L431 作为主控项目开发电子烟产品,使用了 ST 的 HAL 软件库开发。各种驱动功能正常。空闲时进入待机状态。在研发阶段测试时一切正常,但是批量生产时发现产品无法进入低功耗或者说表现为耗电过大。
3. 问题分析与定位
首先查找软件设计本身,包括各种外设的配置以及进入低功耗前的各种处理,并未发现任何异常,随即简化软件在评估板上烧录代码,然后连接电流表,功耗一切正常。经过多次验证,每次都能进入低功耗。
这样看起来就非常奇怪了,客户的硬件也没什么特殊地方。后来再次检查客户的整个流程发现,客户的烧录和测试是一直带电的,因为是电子烟产品,上面的电池是一直连接的。设计调查实验发现,客户的产品只要经过一次断电过程,再次上电就全部正常。而我们平时因测试低功耗电流需求,通常都是去掉烧录器的连接,避免额外电流消耗,所以都经过了断电过程,没有发现任何异常。而这种带有电池的产品,才会有机会发现。基于生产效率和产品终身带电池的特殊性,进行断电工序很难,不利于大规模生产。
那么问题来了,究竟是什么原因引起烧录完不能正常进入低功耗模式呢?带着问题进行查找原因。外设的查找比较容易,都是标准的并且简化掉了很多外设,那么会不会是传统外设之外的因素呢?
按照这个方向查找,想到了调试模块。
进一步查看发现烧录器将 DBG_STOP 位置 1。如上图。
如手册所描述,如果该位被置位的话,那么在低功耗下时钟并没有关闭,并且可以继续执行代码,所以芯片不能进入低功耗模式。于是对应的解决办法也出来了,进入低功耗前增加语句清除代码即可。
4. 问题解决
找到了线索后,针对问题解决起来就不复杂了,简单说,打一个补丁。
从调试界面上看,增加一句清除该位的函数即可禁止在低功耗模式下的调试功能,进而解决该问题。实际测量不需要断电也可正常进入期望的低功耗模式。
小结
由于低功耗调试位被置 1,引起超低功耗芯片 STM32L431 在不断电情况下不能正常进入低功耗模式,引起电流偏大。由于该产品特殊,从生产一直到用户手中,产品始终与电池连接(固定),才有可能导致此类问题发生,需要早研发阶段软件增加补丁的方式解决,使产品生产不用增加工序。
另外,笔者使用的 STM32 ST-LINK Utility 工具会引起该问题,而另一款常用的烧录软件 STM32CubeProgrammer v2.7.0 并未发现此问题,因此与用户采用的烧录软件有直接关系。市面上支持 STM32 低功耗产品烧录软件很多,如遇到此类问题,可以参考以上方式查找原因是否一致。