
1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性,被广泛用于各类工业产品中,包括一些需要低功耗需求的应用。 2. 问题描述 用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片,用来作为收音机频道存贮和各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试,连续工作 72 小时实验中,进入 STOP 模式后,会出现无法再继续运行的情况(屏幕没有显示输出,外部中断无反应)。 3. 问题重现 通常调查问题时采取调试监控的方式。但是用户产品是在检测外部掉电时,测外部电压(汽车 ACC 电源,轿车 12V)下降后,立刻进入低功耗模式,然后通过 RTC 和外部中断(PC13 下降沿触发即汽车打火上电)唤醒 MCU 继续工作。 那么既然是已经进入低功耗模式,并且在几十个小时内才会出现故障,通常的用 ST-LINK 在线调试方式显然很困难重现问题,即使幸运的遇到了故障,也很容易错过引起故障的代码部分,看到了现象却无法定位。 在此种情况下,正面分析出问题的可能性极小,况且用户代码量超过 200k。这时候采用排除法不失为一种可行的办法。通过增加测试样本数量,进行并行测试提高定位效率。 在实践中,根据代码结构时序采用提高触发唤醒频率的方式减少故障发生的时间。 ![]() 在经过一段时间的实验,并从增加和减少该段代码的排除中,最后验证并定位到下面的代码引起故障发生。 ![]() 反复分析我们可以看到,在进入 STOP 前,用户需要停止 ADC 和 DMA。但是在停止 DMA时,用户程序直接停掉 DMA 的时钟。从函数名称上看,是从其他软件直接搬过来,并且误以为是DMA 的默认初始化动作。 ![]() 查询参考手册,停止循环模式的 DMA 应该从外设停止开始,而不是简单粗暴的停止 DMA 时钟。 而且,在程序顺序上客户是先停止了 DMA 的时钟然后才去停止 ADC 的 DMA 请求。显然,当 DMA 开始工作时,突然停止时钟会使 DMA 和总线处于一个不确定阶段状态,因此才有极低概率发生唤醒故障。 到此已经找到了发生的原因,按说应该找到了前因后果。但奇怪的是无意中发现振荡器的波形比较奇怪,并不符合低功耗模式。 ![]() 完整版请查看:附件 ![]() |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南