stm32待机模式被意外唤醒之原因分析

1. 故障现象

客户在项目中使用 STM32G0B1, 由产品内置电池供电. 客户在程序中有使用到 standby 模式, 通过 WKUP2(PC13), WKUP6 引脚唤醒. 除此之外并没有其它唤醒源. 代码中有使用到 RTC,但只是用来记录日期和时间, 并没有参与 standby 的唤醒.

有两种故障现象 :

  • 第一种 : standby 被意外唤醒, 即使两个 WKUP 引脚均无触发信号.
  • 第二种 : PC13 引脚上输出一 1Hz 的方波, 即使代码中并没有配置.

Figure 1 PC13 引脚输出 1Hz 方波, 原因未明
Figure 1 PC13 引脚输出 1Hz 方波, 原因未明
故障是随机, 一般两到三天可能会出现, 暂未发现固定规律. 一旦出现, 按复位键无法恢复, 必须断电后上电才会恢复正常.

2. 故障分析

因为故障表现为断电后才能恢复, 所以判断与 RTC 域相关. 拜访客户后, 查看 RTC 和 TAMP相关寄存器,结果发现寄存器内容均于 0.
查看勘误手册, 在 2.2.6 节中发现 PC13 可能会干扰 LSE
Figure 2
Figure 2
但怎么看都跟此问题应该不相干. 为了缩小问题范围, 现场临时做了一个测试程序. 只用
WKUP2(PC13)引脚唤醒 Standby, WKUP6 则直接不用. 再代码烧进程序, 结果问题依旧, 仍然
是莫名被唤醒. 查看唤醒信号源, 结果发现 PWR_SR1.WUFI=1. 其定义如下 :
在这里插入图片描述
为内部唤醒线来的信号. 但具体是指什么并不清楚.
鉴于客户急于想解决问题, 因此, 首先想到一个 workaround. 即, 先对 RTC 域复位. 在现场测试了下对 RTC 反初始化, 结果一切都恢复正常了. 其实, RTC 域复位还可以用下面几行代码来实现 :

__HAL_RCC_PWR_CLK_ENABLE();
 HAL_PWR_EnableBkUpAccess();
 __HAL_RCC_BACKUPRESET_FORCE();
 __HAL_RCC_BACKUPRESET_RELEASE();
 HAL_PWR_DisableBkUpAccess();

至此, 客户至少有了一个 workaround 措施, 问题变得没那么紧急了. 接下来就需要查找根本原因了.

首先用 PC5 替换 PC13, 由 PC5 来做为 Standby 的唤醒源. 让客户做压力测试, 看看问题跟PC13 引脚到底有没有关系 ? 结果在测试了一周后, 问题重现. 因此得出结论 : 问题与 PC13 引脚无关. 我们不得不转换方向 .

排除了触发信号, 那么剩下的就只可能是与操作 RTC 域相关了. 客户的代码中, 与操作 RTC域相关的操作只有更新 RTC 的日期和时间操作. 客户产品是通过 CAN 总线经转换器连接 PC 的,每次连接 PC 时, PC 会发送消息给到 MCU,要求更新 RTC 日期和时间. 于是要求客户想办法让更新 RTC 的操作变得更加频繁. 很快客户反馈, 如果通过 PC 连续多次发送消息让 MCU 频繁更新RTC 的话, 问题很容易重现 ! 至此, 问题出现重大转机 !

问题变得很容易重现, 也就意味着距离找到原因不远了.

于是接下来, 让客户将更新 RTC 的操作直接由 systick 中断来触发, 每隔一定时间就更新一次RTC. 测试结果为 : 同样容易重现.

于是要客户将更新 RTC 的相关代码发过来看看.与此同时, 客户自已发现 :
在这里插入图片描述
如上所示, 图中蓝色所选的两行代码原本是没有的, 如果加上, 问题消失 。 客户询问原因.
我立即推断客户可能没有对 rtctime 这个变量做完整地初始化. 于是让客户在定义 rtctime 这个局部变量时, 同时对其进行初始化, 然后做对比测试 :

RTC_TimeTypeDef rtctime = {0};

测试结果为正常!
至此, 我们终于找到问题触发点了. 正是由于这个局部结构体变量未初始化, 导致其值一开始就是个未知的随机值, 在后面 RTC 更新操作前, 其部分成员并未显式赋值, 因此, 其值仍然为一随机值. 在 HAL_RTC_SetTime()函数中, 有这么一行语句:

hrtc->Instance->CR |= (uint32_t)(sTime->DayLightSaving | sTime->StoreOperation);

很明显, DayLinghtSaving, StoreOperation 由于未显式赋值, 其值为随机值, 结果在运行完这一行代码之后, RTC_CR 寄存器会被写入一个随机值! 一个不确定的随机值写入控制寄存器会发生什么就难以预料,这也就不难理解为什么故障会有两种不同的现象了.
修改后的代码在经过半个月的压力测试后, 问题不再重现. 至此, 问题可以判定为解决.

3. 后记

此问题我们采用的是常见的排除法来定位和解决的. 希望读者能从中吸取经验.克服浮躁本身
就成功了一半!

文件编号文件标题版本号发布日期
RM0444Reference manual STM32G0x1 advanced Arm®-based 32-bit MCUsRev 52020-11-20
ES0548Errata sheet STM32G0B1xB/xC/xE device errataRev 22022-04-11

本文档参考ST官方的《【应用笔记】LAT1271+待机模式被意外唤醒之原因分析》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89034100

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

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

相关文章

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…

【Unity人机交互】人工智能之爬虫开章

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

如何在内网访问其他电脑?

网络的发展使得人与人之间的通信变得更加便捷,而在公司或者家庭中,也经常遇到需要内网访问其他电脑的需求。内网访问其他电脑可以实现在局域网内部进行数据共享、文件传输、远程控制等操作,提高工作效率和便利性。本文将介绍内网访问其他电脑…

(已解决)vue运行时出现Moudle Bulid error: this.getoptios is not a function at........

1.首先查看你的less-loader版本 点击package.json 即可查看less-loader版本,我之前的版本是12.0,太高了,出现了不兼容的问题 2、卸载less-loader ctrlshift~ 打开项目终端 ,输入: npm uninstall less-loader 3.重…

浙江省某市监局 API 敏感数据保护与全链路数据安全管控实践

背景 随着政务服务数字化转型的加速,政府信息化建设、大数据分析应用以及智慧监管建设等现代化、智能化转型持续推进,新的数据安全风险也暗藏其中。为加强公共数据安全体系建设,提升数据安全主动防御能力、监测预警能力、应急处置能力、协同…

【C++】vector介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. vector的介绍3. Member functions3.1 (constructor)3.2 (destructor) 4. Capacity4.1 resize4.2 reserve4.3 shrink_to_fit 5. vector 增删查改5.1 push_back5.2 insert5.3 pop_back5.4 find5.5 erase 1. 前…

Windows Docker 部署 MongoDB 数据库

部署 MongoDB 打开 Docker Desktop,切换到 Linux 容器。然后在 PowerShell 执行下面命令,即可启动一个 MongoDB 服务。这里安装的是 7.0.7 Tag版本,如果需要安装其他或者最新版本,可以到 Docker Hub 进行查找。 docker run -d -…

基于 Amazon Bedrock 的 Claude 3 体验:ChatGPT 已经 OUT 了吗?Claude 3 数据实测

文章目录 前言一、Claude 3 系列大模型开发团队二、基于 Amazon Bedrock 的 Claude 3 体验三、Claude 3 数据实测3.1、申请模型访问权限3.2、Claude 3 回答的严谨性3.3、验证 Claude 3 较于 ChatGPT-4 数据集更新时间3.4、“二分法”判断 Claude 3 训练数据截止时间3.5、综合二…

瑞吉外卖实战学习--登录过滤器和判断是否登录过

完善登录功能 1、创建自定义过滤器LoginCheckFiler1.1通过WebFilter创建过滤器1.2 验证是否可以拦截请求1.3 代码 2、在启动类加入注解ServletComponentScan 用来扫描过滤器触发所有的过滤器ServletComponentScan 3、完善过滤器的处理逻辑3.1判断是否需要是要放行的请求3.2判断…

斌之曲科技集团迎接绵阳科技城新区领导考察,共探数字新能源

2024年3月22日上午,一场旨在促进科技与经济发展深度融合的考察活动在上海斌之曲科技集团总部隆重举行。绵阳科技城新区经济合作局局长陈桂全一行到访,集团董事长田斌先生、总裁廖彬曲女士热情接待,双方就科技创新、市场布局等议题进行了深入探…

js逆向入门之简概实例--MD5

目录 js逆向入门之简概&实例--MD5 爬虫: 爬虫流程: 逆向js原因: 网站反爬: 什么是MD5? js加密特征: 练习开始 正常请求 加post请求 伪装加U-Sign参数 伪装加Content-Type参数 请求参数变字符串 代码实现: 真逆开始 补充知识点: 代码 免责声明…

【数据结构刷题专题】—— 二叉树

二叉树 二叉树刷题框架 二叉树的定义: struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL); };1 二叉树的遍历方式 【1】前序遍历 class Solution { public:void traversal(TreeNode* node, vector&…

[C#]winformYOLO区域检测任意形状区域绘制射线算法实现

【简单介绍】 Winform OpenCVSharp YOLO区域检测与任意形状区域射线绘制算法实现 在现代安全监控系统中,区域检测是一项至关重要的功能。通过使用Winform结合OpenCVSharp库,并结合YOLO(You Only Look Once)算法,我们…

Maven高级(工程分模块开发,聚合于继承,版本锁定,Mavne私服的搭建和发布)【详解】

目录 一、Maven复习 1. Maven基本概念 1 Maven的作用 2 Maven的仓库 3 坐标的概念 2. Maven安装配置 3. Maven构建项目 4. Maven依赖管理 5. Maven依赖传递 二、工程分模块开发 1. 分模块开发介绍 2. 工程分模块示例 (1) 创建父工程 (2) 创建pojo模块步骤 (3) 创…

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…

如何学习VBA_3.2.19:利用Shell函数运行可执行程序

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效率,而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册,现在已经全部完成,希望大家利用、学习。 如果…

Java-Java基础学习(4)-多线程(2)

3.7. Lambda表达式 为什么要使用lambda表达式 避免匿名内部类定义过多;可以让代码看起来更简洁;去掉一堆没有意义的代码,只留下核心逻辑 属于函数式编程的概念,格式 (params) -> expression [表达式](params) -> statement…

【教学类-44-11】20240324 杨任东竹石体 Regular(实线字体)制作的数字描字帖(AI对话大师缩略版)

作品展示 背景需求: 之前有三款阿拉伯数字字体,但是与《幼儿用数字描字簿》字体有差异 【教学类-44-05】20240201 德彪钢笔行书(实线字体)制作的数字描字帖-CSDN博客文章浏览阅读396次,点赞6次,收藏5次。【…

Python之Web开发中级教程----中级教程成果下载

Python之Web开发中级教程----中级教程成果下载 到目前为止,中级教程已经完成。 按照一步步的教程搭建虚拟机中的环境,包括内容如下: Ubuntu操作系统搭建 Python 配置 Redis 安装配置 Python库中包括 Pip安装 Pyinstaller安装 Redis安装 Jie…

strlen和sizeof

定义 strlen 和 sizeof 是 C 语言中两个用于确定字符串或数据类型大小的常用操作符&#xff0c;但它们的工作方式和目的有所不同。下面是对这两个操作符的详细解释&#xff1a; strlen strlen 是一个库函数&#xff0c;定义在 <string.h> 头文件中。它用于计算以空字符…