STMCU小助手
发布时间:2023-2-15 21:30
|
1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性,被广泛用于各类工业产品中,包括一些需要低功耗需求的应用。 2 H' n9 z. k& F* o6 z: y. Z" g 2. 问题描述 2 U, K; e5 V( Q' w5 f* j5 b 用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片,用来作为收音机频道存贮和各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试,连续工作 72 小时实验中,进入 STOP 模式后,会出现无法再继续运行的情况(屏幕没有显示输出,外部中断无反应)。' n% W3 M2 X6 a . u( O* K$ O9 L8 a8 f; k3 a 3. 问题重现 通常调查问题时采取调试监控的方式。但是用户产品是在检测外部掉电时,测外部电压(汽车 ACC 电源,轿车 12V)下降后,立刻进入低功耗模式,然后通过 RTC 和外部中断(PC13 下降沿触发即汽车打火上电)唤醒 MCU 继续工作。: ], G; p1 l2 G9 X" ~ 那么既然是已经进入低功耗模式,并且在几十个小时内才会出现故障,通常的用 ST-LINK 在线调试方式显然很困难重现问题,即使幸运的遇到了故障,也很容易错过引起故障的代码部分,看到了现象却无法定位。 0 m2 c' C3 d6 \0 s3 f% @2 c) M 在此种情况下,正面分析出问题的可能性极小,况且用户代码量超过 200k。这时候采用排除法不失为一种可行的办法。通过增加测试样本数量,进行并行测试提高定位效率。 在实践中,根据代码结构时序采用提高触发唤醒频率的方式减少故障发生的时间。9 u: R9 R( A& n9 c, f8 K- M5 ]$ G 1 T6 G. g- p; ~" d: ? % W/ a* _8 m# c
/ b1 d$ m5 J& }6 c 在经过一段时间的实验,并从增加和减少该段代码的排除中,最后验证并定位到下面的代码引起故障发生。" a- G/ s2 B1 X# l9 n } ) ~) \4 z" x) w7 T0 D
7 S! k4 a/ b4 B k3 B7 v 反复分析我们可以看到,在进入 STOP 前,用户需要停止 ADC 和 DMA。但是在停止 DMA时,用户程序直接停掉 DMA 的时钟。从函数名称上看,是从其他软件直接搬过来,并且误以为是DMA 的默认初始化动作。 5 u; @" S" d& f. r t5 v* E
- q* i; l" s E5 o6 C+ X4 |; t- W 查询参考手册,停止循环模式的 DMA 应该从外设停止开始,而不是简单粗暴的停止 DMA 时钟。 而且,在程序顺序上客户是先停止了 DMA 的时钟然后才去停止 ADC 的 DMA 请求。显然,当 DMA 开始工作时,突然停止时钟会使 DMA 和总线处于一个不确定阶段状态,因此才有极低概率发生唤醒故障。 * K; Y( q+ R" N) y6 ]' s+ G* A 到此已经找到了发生的原因,按说应该找到了前因后果。但奇怪的是无意中发现振荡器的波形比较奇怪,并不符合低功耗模式。) [, y3 j2 Q' o0 @+ K 3 T% w3 M& C1 R- @2 n
5 ?% U7 @/ M/ Z2 b7 K 完整版请查看:附件
看似无法唤醒的一种异常现象分析_v1.0.pdf
(899.26 KB, 下载次数: 0)
|
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版