0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32G0B1看似无法唤醒的一种异常现象分析

jf_pJlTbmA9 来源:STM32单片机 作者:STM32单片机 2023-10-25 17:09 次阅读

1. 引言

STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性,被广泛用于各类工业产品中,包括一些需要低功耗需求的应用。

2.问题描述

用户使用STM32G0B1 作为汽车多媒体音响控制器控制芯片,用来作为收音机频道存贮和各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试,连续工作72 小时实验中,进入STOP 模式后,会出现无法再继续运行的情况(屏幕没有显示输出,外部中断无反应)。

3. 问题重现

通常调查问题时采取调试监控的方式。但是用户产品是在检测外部掉电时,测外部电压(汽车ACC 电源,轿车12V)下降后,立刻进入低功耗模式,然后通过RTC 和外部中断(PC13 下降沿触发即汽车打火上电)唤醒MCU 继续工作。

那么既然是已经进入低功耗模式,并且在几十个小时内才会出现故障,通常的用ST-LINK 在线调试方式显然很困难重现问题,即使幸运的遇到了故障,也很容易错过引起故障的代码部分,看到了现象却无法定位。

在此种情况下,正面分析出问题的可能性极小,况且用户代码量超过200k。这时候采用排除法不失为一种可行的办法。通过增加测试样本数量,进行并行测试提高定位效率。

图1 是为了方便说明问题,模拟用户关键程序。主要是进入STOP 前后外设的处理,来复现故障现象。

wKgaomUDwhGATobsAAA66HPolD4760.png

图1 模拟ACC掉电唤醒程序

在经过一段时间的实验,并从增加和减少该段代码的排除中,最后验证并定位到下面的代码引起故障发生。

wKgZomUDwhKACQVtAAAg1cYhrL4518.png

图2 定位到引起的故障代码

反复分析我们可以看到,在进入STOP前,用户需要停止ADCDMA。但是在停止DMA时,用户程序直接停掉DMA的时钟。从函数名称上看,是从其他软件直接搬过来,并且误以为是DMA的默认初始化动作。

wKgZomUDwhSAU60FAAJMwFNTc4o239.png

图3 DMA正确的停止方式

查询参考手册,停止循环模式的DMA应该从外设停止开始,而不是简单粗暴的停止DMA时钟。而且,在程序顺序上客户是先停止了DMA的时钟然后才去停止ADC的DMA请求。显然,当DMA开始工作时,突然停止时钟会使DMA和总线处于一个不确定阶段状态,因此才有极低概率发生唤醒故障。

到此已经找到了发生的原因,按说应该找到了前因后果。但奇怪的是无意中发现振荡器的波形比较奇怪,并不符合低功耗模式。

wKgaomUDwhWADZr6AARY114ga8k295.png

图 4 外部振荡器HSE 波形

在发生故障状态时发现外部震荡器还在持续震荡,因此判定此时并非进入低功耗模式。利用IAR编译器以HOT PLUG的方式连接调试与观测。

通过调试界面可以看到,代码会不停的进入DMA中断。

wKgZomUDwheAaoKNABbR_LM_OmI635.png

图5 故障模式下的调试

wKgaomUDwhqAMWNYAA6icbL5qbw524.png

图6 代码进入循环过程

奇怪的是每次并没有看到DMA的寄存器内容,原因是已经关闭了DMA外设的时钟。所以无法看到任何状态标志。退出中断时在C语言下就无法单步调试了。切换到汇编界面下,可以看到代码可以继续运行到系统时钟配置函数,但是在配置函数中的除法部分进入了循环,然后又发生了DMA中断,并且循环没有出来。

显然,正常的调试手段已显示出逻辑的不正常。

4.小结

至此,情况已经明了。由于软件在进入低功耗前试图关闭ADC加DMA工作,没有按照手册的规范,通过外设停止的方式关闭,而是简单粗暴的关闭DMA时钟,导致总线和运行逻辑出错,无法继续执行。

外部看起来像是进入低功耗模式后,外部中断触发没有执行,芯片没有唤醒,实际上是DMA进入了不正常的循环中断方式导致了系统卡在循环代码下。

芯片的外设功能强大,每种外设运行的方式也不相同,因此停止外设时需根据外设特点以及参考手册的建议来实施,切不可按自己想象的方式执行,这样引起隐蔽的偶发故障就很难去定位解决了。

此外ST已经建立好完整强大的生态系统,按照cube 软件库的规范编写调用驱动函数可以避免少走类似的弯路。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348790
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99031
收藏 人收藏

    评论

    相关推荐

    STM32G0 Keil仿真下再退出仿真程序才运行正常怎么解决啊?

    如题 我用stm32g0开发 直接下载运行程序运行异常,具体就是进入stop模式无法唤醒,但是我用keil debug 然后再退出debug 这个时候程序跑的正常 就是能进入stop模
    发表于 04-19 07:22

    使用CubeMX生成的STM32G0B1工程,通过I2C读取EEPROM时,TXIS位直保持0导致无法发送从机地址怎么解决?

    使用CubeMX生成的STM32G0B1工程,通过I2C读取EEPROM时,TXIS位直保持0,导致无法发送从机地址。 调用的函数时:HAL_I2C_Mem_Read( hi2c
    发表于 04-03 08:12

    STM32G0B1无法操作FLASH,解锁FLASH失败的原因?

    使用STM32G0B1写内部的Flash时出现问题,代码: #pragma arm section code = \"RAMCODE\" uint32_t
    发表于 04-02 07:45

    STM32G0空闲中断异常,且DMA接收不到数据是怎么回事?

    板子:STM32G0B1 方式:UART2空闲中断+DMA接收 问题:烧写程序后,板子上电就自动进入空闲中断,但此时没有数据发送,当采用上位机发送数据时,可以进入空闲中断,但DMA接收不到数据? 求帮助,感谢感谢!
    发表于 03-26 07:03

    stm32g0b1配置usbhost不能跑通怎么解决?

    用cubemx配的不能跑通,g0b1的例程也没有,跑c1的USBdevice可以跑,host不行,难搞难搞,有大佬可以帮忙下么,谢谢了
    发表于 03-14 07:55

    STM32G0B1CCT6休眠唤醒后ADC不能ready怎么解决?

    休眠唤醒后ADC_ISR的Bit 0 ADRDY: ADC ready直为0,是偶发现象,是可能什么原因造成的呀,这块调用的while
    发表于 03-11 07:09

    STM32G0B1CCT6使用外部时钟不能被唤醒的原因?

    G0B1CCT6使用外部时钟休眠后不能被唤醒,且休眠的功耗也比内部时钟大。 但是G0B1VET6就可以外部时钟休眠唤醒,两个有什么区别吗,谢谢!
    发表于 03-11 06:17

    变压器运行中常见的异常现象应如何处理呢?

    变压器运行中常见的异常现象应如何处理?
    的头像 发表于 03-08 09:19 350次阅读
    变压器运行中常见的<b class='flag-5'>异常现象</b>应如何处理呢?

    STM32G0B1 hal有没有复位所有寄存器的函数或者demo?

    本人用的STM32G0B1,我想boot跳转后,先清理寄存器.hal有没有复位所有寄存器的函数或者demo?
    发表于 03-08 07:31

    STM32G0B1短接外部晶振后CANFD1不工作怎么解决?

    STM32G0B1,单独用HSI和HSE,can1都可以工作 短接外部晶振后,iic可正常工作,但CANFD1无法工作,进不到接收中断。寄存器如图所示
    发表于 03-08 07:06

    ADXL356输出异常是什么原因导致的?

    ADXL356信号输出异常,有时上电时输出正常,有时上电时输出异常,(测试20次,有4次输出异常异常现象为芯片上电只有直流信号(X,Y,Z轴输出全为
    发表于 12-28 06:56

    如何发现电动机运行的异常现象

    电动机巡视检查的目的是为了及时地发现运行中存在的问题,并及时做出正确的反应和处置,以确保运行安全。维护值班人员可根据仪表指示、继电保护装置及各种指示信号发现异常现象,也可以根据自己的经验,通过
    的头像 发表于 09-11 16:47 816次阅读

    请问STM32U5的USB如何在STM32CubeMX上直接配置?

    STM32U5的USB配置不能和STM32G0B1那样直接在STM32CubeMX上直接配置什么类了吗
    发表于 08-07 06:10

    工业设备以振动为基础的异常现象探测方案

    开发一种解决办法,监测半导体裂谷制造设施内机器人的健康状况,对工业设备进行振动异常探测。 建立参数,以便以最低限度的数据潜伏和保护IP敏感生产数据的方式对机器人故障进行有效和实时的远程监测和警报
    发表于 08-03 06:04

    应用笔记 | 看似无法唤醒一种异常现象分析

    各类工业产品中,包括一些需要低功耗需求的应用。 2.  问题描述 用户使用STM32G0B1 作为汽车多媒体音响控制器的控制芯片,用来作为收音机频道存贮和 各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试,连续工作72 小时实验中,进入STOP 模式后,会出现无法
    的头像 发表于 07-24 18:45 423次阅读
    应用笔记 | <b class='flag-5'>看似</b><b class='flag-5'>无法</b><b class='flag-5'>唤醒</b>的<b class='flag-5'>一种</b><b class='flag-5'>异常现象</b><b class='flag-5'>分析</b>