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

1. 引言

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

2. 问题描述

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

3. 问题重现与解决

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

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

在此种情况下,正面分析出问题的可能性极小,况且用户代码量超过 200k。这时候采用排除法不失为一种可行的办法。通过增加测试样本数量,进行并行测试提高定位效率。 在实践中,根据代码结构时序采用提高触发唤醒频率的方式减少故障发生的时间。

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

图 1 模拟 ACC 掉电唤醒程序
在这里插入图片描述
在经过一段时间的实验,并从增加和减少该段代码的排除中,最后验证并定位到下面的代码引起故障发生。
图 2 定位到引起的故障代码
在这里插入图片描述
反复分析我们可以看到,在进入 STOP 前,用户需要停止 ADC 和 DMA。但是在停止 DMA时,用户程序直接停掉 DMA 的时钟。从函数名称上看,是从其他软件直接搬过来,并且误以为是DMA 的默认初始化动作。

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

到此已经找到了发生的原因,按说应该找到了前因后果。但奇怪的是无意中发现振荡器的波形比较奇怪,并不符合低功耗模式。
图 4 外部振荡器 HSE 波形
在这里插入图片描述
在发生故障状态时发现外部震荡器还在持续震荡,因此判定此时并非进入低功耗模式。利用IAR 编译器以 HOT PLUG 的方式连接调试与观测。

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

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

4. 小结

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

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

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

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


本文档参考ST官方的《【应用笔记】LAT1236+看似无法唤醒的一种异常现象分析》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89034127

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/489136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子显微镜——相机

相机种类 相机种类繁多,下面根据相机接口和图像传感器类型进行分类。 根据数据接口分类 1. USB相机 USB相机通常可以指代多种不同类型的USB接口相机,其中包括UVC(USB Video Class)相机和U3V(USB3 Vision)相机等,它们通常使用SOC进行开发。以下是它们的区别和特点: …

Java版AI人工智能源码 Chat GPT智能AI源码

Java版AI人工智能源码 Chat GPT智能AI源码 技术框架 基于前后端分离架构以及Vue3、uni-app、SpringBoot2.5技术栈开发, 包含PC端、H5端、小程序端、APP端。 AI人工智能系统介绍 Chat GPT AI人工智能系统聚合对接国内外知名主流大语言模型接口及中转平台&#x…

100WQR80-15-7.5_耐高温潜水排污泵

在现代工业生产中,对设备的耐高温性能要求越来越高。特别是在涉及液体排放和污水处理的场合,不仅需要设备有强大的排污能力,还要求能在极端高温环境下稳定运行。面对这一挑战,我们隆重推出100WQR80-15-7.5型号的耐高温潜水排污泵&…

【日常记录】【CSS】css文字渐变擦除

文章目录 1、代码2、自定义css属性 1、代码 主要思路是: 1、弄一个一样的,覆盖到上面去 2、然后改一下文字颜色,改成透明,背景颜色改成 渐变,可以从透明到一个实色,这样就能显示出来下面的文字 3、只有 行内…

Redis实现排行榜功能实战

前言 在日常的服务器开发过程中,经常会遇到排行榜的需求。这里我们主要讨论使用redis zset来实现一般的常用排行榜。也就是单key排行榜,分数为整数,一般长度不过万。 ZSet概述 Redis的ZSet(Sorted Set)是一种有序集…

谷歌AI搜索惊现恶意网站推荐!用户安全再遭威胁?

近日,谷歌推出的新搜索生成体验(SGE)功能引发广泛关注。然而,这一旨在提升搜索体验的AI功能却陷入了争议,有报道称其可能在生成的响应中推广欺诈网站和恶意软件,为用户带来安全风险。 AI-321 | 专注于AI工具分享的网站 AI工具集 …

文件的介绍

文件介绍 文件是计算机中用于存储数据的一种载体。一般储存在磁盘上。 文件通常以一定的格式和结构存储数据,可以包含文本、图像、音频、视频等各种类型的信息。 文件可以通过文件系统进行管理和组织,用户可以对文件进行创建、打开、编辑、保存、复制…

Chrome 插件各模块之间的消息传递

Chrome 插件各模块之间的消息传递 一、消息传递 1. 消息传递分类 Chrome 插件的 Action、Background 和 content_script 三个模块之间的信息传输插件和插件之间的信息传输网页向插件进行信息传输与原生应用进行消息传递 2. 消息传递 API runtime API runtime.sendMessage(…

新房装修后,经验总结和坑点复盘

房子装修的时候,谁在盯着你的钱包?谁想从你这里捞钱?一是负责签合同的装修公司,二是负责实际装修的工地工头。装修公司要从你这份合同里为公司赚取运营成本和利润,工地装修工头要从你这里赚取他私人的利益。 在签合同…

C语言例4-13:已知圆柱体的底半径是1.5,高是2.0,计算其体积并输出。

代码如下&#xff1a; //已知圆柱体的底半径是1.5&#xff0c;高是2.0&#xff0c;计算其体积并输出。 #include<stdio.h> #define PI 3.1415926 int main(void) {float radius1.5, high2.0,vol;vol PI*radius*radius*high; //计算圆柱体的体积printf("vol %7.…

jsonpath和json数据(序列化loads()、反序列化eval())及断言处理(断言封装)

jsonpath&#xff1a;对json串进行搜索 安装jsonpath 安装&#xff1a;pip install jsonpath 导入&#xff1a; from jsonpath import jsonpath jsonpath能通过简单的方式就能提取给定JSON中的字段。 jsonpath官方地址&#xff1a;https://goessner.net/articles/JsonPath/ 在…

AI视频渲染原理是什么?

一、AI渲染原理 AI视频渲染是一种结合了人工智能技术的新型渲染方式&#xff0c;它主要通过深度学习和其他机器学习方法来优化传统渲染流程&#xff0c;以提高效率和质量。以下是AI视频渲染可能涉及的一些基本原理&#xff1a; 1. **智能采样**&#xff1a; - AI可以帮助决定在…

Go第三方框架--gin框架(二)

4. gin框架源码–Engine引擎和压缩前缀树的建立 讲了这么多 到标题4才开始介绍源码&#xff0c;主要原因还是想先在头脑中构建起 一个大体的框架 然后再填肉 这样不容易得脑血栓。标题四主要涉及标题2.3的步骤一 也就是 标题2.3中的 粗线框中的内容 4.1 Engine 引擎的建立 见…

R语言学习——Rstudio软件

R语言免费但有点难上手&#xff0c;是数据挖掘的入门级别语言&#xff0c;拥有顶级的可视化功能。 优点&#xff1a; 1统计分析&#xff08;可以实现各种分析方法&#xff09;和计算&#xff08;有很多函数&#xff09; 2强大的绘图功能 3扩展包多&#xff0c;适合领域多 …

【Python实用标准库】argparser使用教程

argparser使用教程 1.介绍2.基本使用3.add_argument() 参数设置4.参考 1.介绍 &#xff08;一&#xff09;argparse 模块是 Python 内置的用于命令项选项与参数解析的模块&#xff0c;其用主要在两个方面&#xff1a; 一方面在python文件中可以将算法参数集中放到一起&#x…

基于nodejs+vue基于协同过滤算法的私人诊python-flask-django-php

实现后的私人诊所管理系统基于用户需求分析搭建的&#xff0c;并且会有个人中心&#xff0c;患者管理&#xff0c;医生管理&#xff0c;科室管理&#xff0c;出诊医生管理&#xff0c;预约挂号管理&#xff0c;预约取消管理&#xff0c;病历信息管理&#xff0c;药品信息管理&a…

国内IP节点更换攻略,一键解决烦恼

在如今的互联网时代&#xff0c;网络已经成为人们生活中不可或缺的一部分。而对于许多网民来说&#xff0c;网络速度的快慢直接关系到他们的上网体验。在国内&#xff0c;很多用户常常遇到一个问题&#xff0c;那就是网络速度不稳定。有时候可以流畅地上网&#xff0c;有时候却…

【LeetCode热题100】108. 将有序数组转换为二叉搜索树(二叉树)

一.题目要求 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#x…

React Native 应用打包上架

引言 在将React Native应用上架至App Store时&#xff0c;除了通常的上架流程外&#xff0c;还需考虑一些额外的优化策略。本文将介绍如何通过配置App Transport Security、Release Scheme和启动屏优化技巧来提升React Native应用的上架质量和用户体验。 配置 App Transport…

【目标检测】西红柿成熟度数据集三类标签原始数据集280张

文末有分享链接 标签名称names: - unripe - semi-ripe - fully-ripe D00399-西红柿成熟度数据集三类标签原始数据集280张