STM32“死机“(实用调试技巧)

2023-05-16

2、硬件环境导致"死机"

1)供电电源电压不在合适范围 

    单片机都需要有一个能够稳定运行的电压工作范围,如果低于或者高于正常工作电压范围其单片机并不一定会立马无法工作(也有可能会立马死机),而是工作一段时间在某种环境条件满足的时候造成死机。

    处理办法:可以通过万用表或者示波器进行电压值监控并作出判断。

2)供电电源干扰杂讯较多 

    我们都知道高频杂讯会对单片机的内部各时钟或者信号造成辐射等干扰,这样会导致单片机内部电路异常工作而导致单片机死机。

    处理方法:可以使用高带宽的示波器对电源进行杂讯的显示,或者使用干净的电源做对比实验进行排查。

3)复位电路设计问题 

    复位电路分为可操作复位和不可操作复位,可操作复位一般可以通过按钮形成电平或者跳变使得其芯片复位,不可操作复位一般是电平复位,需满足复位引脚为高电平或者低电平才能完成上电复位。(所以也需要根据芯片的datasheet来查看其复位属于那种电平复位)所以如果我们复位电路设计不正确或者电路本身元件虚焊接等都会导致芯片无法正常工作。

    解决办法:了解好对应芯片的复位电路工作原理并进行电平电源的测量。

4)晶振电路异常 

    晶振电路相当于单片机的心脏,晶振与内部的电容形成一种储能元件的充放震荡电路,从而形成了类似如下图所示波形。晶振通常和锁相环一起工作产生时钟信号为单片机内部各种动作提供基准,一旦时钟信号不稳定或者是错乱等都会有可能导致芯片出现异常。

    解决办法:

    1、用示波器测量法

    通过示波器测量晶振两端,可以看到示波器上会产生同频率的正弦波出现。大体如下图所示

注意点:

1)晶振本身无法产生对应频率的正弦波,而是要配合单片机内部电路,比如说通过整形电路变成方波以后供芯片内部其他模块使用。

2)晶振尽量紧挨着IC,由于晶振输出能力有限,容易受到外界电磁波等信号的干扰。

3)晶振需要在单片机所规定的范围,因为单片机内部数字电路对频率都有限制。

    2、万用表测量法

    通过上面的震荡波形我们大致了解晶振两端的电压类似于正弦波,那么万用表测量为平均电压值,那么其电压值基本位于芯片供电电压的一半左右,如果测量为0或者VCC都认为是有问题的。

    3、IO口输出法

    对于高端一点的芯片,其存在内部的晶振,这样的芯片一般都存在能够通过配置寄存器把相应的频率通过IO口进行输出,这样我们也可以通过测量该频率来判断晶振电路的好坏。

5)IO保护 

    我们都知道我们的MCU与外界的接口就是通过引脚来传递信号的,那么每个引脚都会有其他的属性,比如耐压值,过流值等等,一旦超过!小则可能导致单片机复位或者死机,大则导致芯片损坏。有时候我们用手不小心碰到了芯片的IO引脚,导致芯片复位或者无法正常工作,也就是因为这个原因导致芯片内部逻辑错乱。

    解决办法:通过设计相关电路进行电流、电压的限制即可,比如常用在没有使用到的引脚一般接一个150欧姆左右的电阻到地,或者加一些二极管防止电流的倒灌等等。

6)硬件原因小节

    硬件方面的还有很多,比说说芯片上数字地和模拟地的处理等,这里只是为大家展示一下大伙经常遇到的现象和相应的解决办法。具体的项目实战过程中可以使用排除法,或者是采集相应的波形进行判断和处理。

3、软件异常导致"死机"

1)看门狗处理不当 

    作者之前写过一篇文章《看门狗你确定会用了吗?》里面介绍了看门狗的使用小技巧和注意事项,大家可以搜索阅读,虽然说看门狗能够在一定程度上能够缓解软件上的异常死机,不过对于硬件上的一些死机能够复位的情况相对较少,所以说watchdog对于程序死机也不一定能够确保解决的。

    有些单片机芯片默认启动代码中存在看门狗初始化,那么当我们使用的时候需要关闭看门狗,否则导致程序启动、复位循环造成死机。

2)没有超时处理的while 

    程序尽量不要写while(!条件满足);这样的语句,一旦条件不满足就一直处于循环当中,条件发生异常就会导致程序一直卡死在当前位置无法继续执行。比如说我们常用的等待某个指令接受,等待某个电平信号翻转等等。

    解决办法:1)加上等待超时处理,设置一个最长的延时时间;

    2)尽量采用轮询的机制对相关信号或者数据进行查询来进行处理;

    3)该现在一般出现在程序运行中,对于出现比较频繁的死机可以用仿真器进行暂停查找出现异常的代码;

    4)对于任务运行较慢的情况,也可以通过串口在进入while前打印进入等待信息,出while后打印退出等待的信息,便于程序员分析问题。

3)中断处理时间过程 

    我们大部分的芯片都是单核的,在同一时刻就只能有一个任务在执行,同时中断和主程序是先后执行的,执行情况如下:

    当中断服务函数中运行的程序花费的时间太长或者由于中断不正确使用导致频繁的进入中断服务函数而使得主程序得不到执行,表现出死机的假象。

    解决办法:看过的往期的小伙伴一定看过《如何测定程序运行时间》,该文章中详细的为大家讲述了多种手段获得程序运行时间,那么我们同样可以测定中断服务函数的时间来进行判断和处理问题。

4)堆栈溢出 

    堆栈溢出可能是很多程序员的噩梦,堆栈其实分为堆和栈两种结构:堆主要是我们malloc自动分配的内存,而栈则是我们进行函数调用等进行的保护现场使用的容器,对于跑RTOS的小伙伴对每个任务的堆栈分配也值得注意的,对于堆栈太大则浪费内存,太小就会容易溢出!比如一旦我们的栈溢出会导致程序相关寄存器的值无法恢复,从而导致程序紊乱。(对于堆栈的理解的具体实例可以观看之前写的ucos移植到stm32有比较形象的解析)

    解决办法:1)对于堆可能我们大部分玩单片机的小伙伴用得不是很多,对于大部分性能强大一些的单片机我们一般模拟一套堆;而对于栈,一旦我们怀疑到这一点上,一般的处理办法是加大堆栈看是否程序跑飞,或者是尽量减少函数嵌套和局部变量的使用等。

    2)通过设计堆栈溢出监控程序,基本的原理就是通过检测堆栈的末端安插特殊的字符序列,一旦堆栈溢出势必会修改该部分数据,从而等到检测,不过也会存在漏检测问题。具体设计根据需求来设计。

5)数据越界、指针使用不当 

    数据越界和指针使用可能是很多小伙伴们遇到过的问题,它也是会造成程序异常的原因,小则随便改变一下不该修改的数据,大则程序直接飞了,这也是很多小伙伴在项目过程中遇到的比较头疼的bug,经常有一些小伙伴们说"这个变量我其他地方都没有用,怎么就变了呢?",还有使用了非法指令或者访问了非法地址从而触发的异常中断,比如stm32里面的hardFault中断,我们一般都会在该中断服务函数里面写一个死循环来阻止程序继续运行。

    处理办法:1)首先对于数据越界问题,这个大部分是因为我们平时没有养成非常好的编程习惯,对于函数参数没有范围限定等处理,导致数据的下标越界,导致程序异常。作者在往期非常多的文章中总结了非常多的代码书写规范等。推荐阅读往期中的《根据库学驱动编程》和《嵌入式编程之代码重构》等。

    2)对于上面的两个问题对于一般高性能单片机都会触发对应的异常中断,比如stm32中的hardFault异常中断,一旦数据越界、指针访问错误或者是堆栈溢出基本上都会触发该中断。

触发HardFaultHandler处理办法:

1)我们会在中断中安插一条while死循环,我们可以通过仿真器查看当前CPU中各寄存器中的数据,因为我们知道在从主程序到中断服务函数的切换过程中需要保存中断现场,那么一定会保存返回的地址,我们需要查看对应芯片的入栈顺序,从而找到发生异常地址的下一条程序,从而定位问题。

2)我们可以在hardFaultHandler函数中写入一条返回的语句,然后把断点打在该位置,一旦程序运行到该位置,然后单步调试即可到达异常位置的下一条,从而定位问题。

3)对于现在的IDE都会有堆栈等异常检测的功能,可以了解一下进行使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32“死机“(实用调试技巧) 的相关文章

  • 【gcc】gcc优化等级 -O1 -O2 -O3 -Os -Ofast -Og|gcc关闭优化

    目录 优化等级 O1 O2 O3 Os Ofast Og cmake 生成 debug和 release 版 Cmake设置优化等级 Debug和Release 方案 About table About question gcc g 43
  • 嵌入式期末复习题(二)

    考试题型 一 选择题 每小题2分 xff0c 15题 xff0c 共30分 二 填空题 每题2分 xff0c 10题 xff0c 共20分 三 简答题 每题5分 xff0c 4题 xff0c 共20分 四 分析题 每题5分 xff0c 3题
  • 嵌入式期末复习题(三)

    1嵌入式系统的定义 嵌入式系统是用于控制 监视或辅助操作机器和设备的装置 嵌入式系统是以应用为中心 xff0c 以计算机技术为基础 xff0c 软硬件可裁剪 xff0c 适应应用系统对功能 可靠性 成本 体积和功耗等严格要求的专用计算机系统
  • 解决Ubuntu 网速慢的问题

    Ubuntu 网速慢 xff0c 主要是把时间浪费在域名解析上 我们可以用dnsmasq解决这问题 具体如下 xff1a 1 安装dnsmasq 命令 sudo apt get install dnsmasq 2 编辑dnsmasq的配置文
  • C++中的char,char*,char[]

    char C 43 43 中的char是字符的意思 xff0c 可以用例如 39 a 39 来表示 xff0c 每个字符串string都是由很多个单独的字符char组成 char char 是一个指针 xff0c 例如 xff1a char
  • VSCode 运行C++程序

    0 省流自强版 本方法来自以下两个参考链接 xff0c 可自行参照去执行安装 xff1a 1 https code visualstudio com docs languages cpp 2 https www youtube com wa
  • 了解CV和RoboMaster视觉组(四)视觉组使用的硬件

    NeoZng neozng1 64 hnu edu cn 4 视觉组接触的硬件 虽然别人总觉得视觉组就是整天对着屏幕臭敲代码的程序员 xff0c 实际上我们也会接触很多的底层硬件与传感器 xff0c 在使用硬件的同时很可能还需要综合运用其他
  • VINS-RGBD运行指令

    创建工程VINS RGBD catkin ws 将代码放入src文件夹当中 git clone https github com STAR Center VINS RGBD 进行编译 cd VINS RGBD catkin ws catki
  • ubuntu16.04安装realsense D435i驱动及固件

    安装Realsense SDK xff1a 1 下载source并且确定git版本 xff1a 1 git clone https github com IntelRealSense librealsense xff08 下载源 xff09
  • ROS入门(七)——仿真机器人三(Gazebo+Xacro)

    所用的学习链接 xff1a 奥特学园 ROS机器人入门课程 ROS理论与实践 零基础教程P271 277 以上视频笔记见http www autolabor com cn book ROSTutorials 前文参考 ROS入门 五 仿真机
  • ROS入门(九)——机器人自动导航(介绍、地图、定位和路径规划)

    所用的学习链接 xff1a 奥特学园 ROS机器人入门课程 ROS理论与实践 零基础教程P289 314 以上视频笔记见http www autolabor com cn book ROSTutorials 一 介绍 官方链接 xff1a
  • Keil工程添加源文件和头文件(.c和.h)的方法

    在此把Keil项目添加源文件和头文件的方法做个记录 xff1a 1 Keil项目添加源文件和头文件的方法之一 1 1 右键点击项目名称 xff0c 弹出菜单中选择Add Group xff0c 我们把所有需要添加的源文件都放在这个Group
  • 漂亮的html表格

    原文 xff1a http www textfixer com resources css tables php css table01 一个像素边框的表格 xff1a Info Header 1 Info Header 2 Info He
  • SIPp之认证注册

    欢迎大家转载 xff0c 为保留作者成果 xff0c 转载请注明出处 xff0c http blog csdn net netluoriver xff0c 有些文件在资源中也可以下载 xff01 如果你没有积分 xff0c 可以联系我 xf
  • HTTP:DIGEST认证的请求和响应报文

    以下是HTTP DIGEST认证的请求和响应报文的例子 xff0c 供以后参考 IE first request GET boe checkedServlet HTTP 1 1 Accept image gif image jpeg ima
  • Linux配置篇 | Ubuntu配置apt镜像源

    以下以 Ubuntu18 04 LTS 为例 xff0c 也适用于 Ubuntu 其他版本 一 修改apt镜像源 xff08 1 xff09 备份apt配置文件 xff1a cp etc apt sources list etc apt s
  • STC89C52RC单片机额外篇 | 04 - 认识头文件<intrins.h>与_nop_函数

    1 lt intrins h gt 头文件 头文件 lt intrins h gt 在我们51单片机日常开发中经常使用 xff0c 特别是 nop 函数 xff0c 以下是 lt intrins h gt 的内容 xff1a span cl
  • HTTP协议详解 - 通过C++实现HTTP服务剖析HTTP协议

    前言 C C 43 43 程序员一般很少会接触到HTTP服务端的东西 xff0c 所以对HTTP的理解一般停留在理论 本文章实现通过C 43 43 实现了一个http服务 xff0c 可以通过代码对HTTP协议有更深的理解 xff0c 并且
  • GIT 中如何打标签

    前言0x1 GIT 标签常用指令0x2 轻量标签0x3 附注标签0x4 远程仓库中的标签 前言 在我们开发的过程中 xff0c 可能经过多次 commit 提交才会确定一个版本 xff0c 那么除了用 commit comments 来标识
  • 用VSCode开发C++项目

    写在前面 最近在新学C 43 43 xff0c 又不想用VisualStudio那么庞大的IDE xff0c VS体量稍微有那么点笨重 xff08 主要还是因为穷 xff0c 没钱换电脑 xff0c 目前的电脑开个VS要个两三分钟 xff0

随机推荐

  • petalinux2018.3 error 记录

    petalinux config get hw description 61 报错 INFO sourcing bitbake ERROR Failed to source bitbake ERROR Failed to config pr
  • petalinux 编译,源码编译

    1 测试环境 Ubuntu 16 04PetaLinux 2019 1PetaLinux 2019 1 ZCU106 BSPZCU106 2 PetaLinux介绍 PetaLinux是Xilinx基于Yocto推出的Linux开发工具 Y
  • Optitrack Motive软件安装及使用说明

    Motive 软件安装程序 http www naturalpoint com optitrack downloads motive html 安装Motive需要安装两个底层插件 xff0c Directx aug2009 redist
  • Failed to get convolution algorithm. This is probably because cuDNN failed to initialize

    Failed to get convolution algorithm This is probably because cuDNN failed to initialize from tensorflow compat v1 import
  • C语言---整型字符串转换

    C语言提供了几个标准库函数 xff0c 可以将任意类型 整型 长整型 浮点型等 的数字转换为字符串 以下是用itoa 函数将整数转 换为字符串的一个例子 xff1a include lt stdio h gt include lt stdl
  • 约瑟夫环(C语言单项循环链表)

    约瑟夫环 C 语言单项循环链表 约瑟夫环 问题描述 xff1a 约瑟夫问题的一种描述是 xff1a 编号为1 xff0c 2 xff0c xff0c n 的n 个人按顺时针方向围坐一圈 xff0c 每人持一个密码 xff08 正整数 xff
  • 交换机VLAN的定义、意义以及划分方式

    什么是VLAN 虚拟网技术 xff08 VLAN xff0c Virtual Local Area Network xff09 的诞生主要源于广播 广播在网络中起着非常重要的作用 xff0c 如发现新设备 调整网络路径 IP地址租赁等等 x
  • coredump简介与coredump原因总结

    coredump简介与coredump原因总结 什么是coredump xff1f 通常情况下coredmp包含了程序运行时的内存 xff0c 寄存器状态 xff0c 堆栈指针 xff0c 内存管理信息等 可以理解为把程序工作的当前状态存储
  • 嵌入式设备web服务器比较

    现在在嵌入式设备中所使用的web服务器主要有 xff1a boa thttpd mini httpd shttpd lighttpd goaheand appweb和apache等 Boa 1 介绍 Boa诞生于1991年 xff0c 作者
  • memfd.c:40:12: error: static declaration of ‘memfd_create’ follows non-static declaration

    qemu编译安装出错 xff1a memfd c 40 12 error static declaration of memfd create follows non static declaration 修改 xff1a a util m
  • windows10 驱动开发环境 VS2019+WDK10

    windows10 驱动开发环境 1 下载SDK https developer microsoft com zh cn windows downloads windows 10 sdk 通用驱动demo xff1a https githu
  • 在用户配置文件中添加 IDF_PATH 和 idf.py PATH

    在用户配置文件中添加 IDF PATH 和 idf py PATH CMake 英文 注解 本文档将介绍如何使用 CMake 编译系统 目前 xff0c CMake 编译系统仍处于预览发布阶段 xff0c 如您在使用中遇到任何问题 xff0
  • error C3861: “gets”: 找不到标识符

    error C3861 gets 找不到标识 把 gets 改成 gets s 用VS2015打开一个win32工程 xff0c 生成解决方案失败 报错信息 xff1a 命令行 error D8016 ZI 和 Gy 命令行选项不兼容 选中
  • ROS和Optitrack通信

    ROS xff1a indigo Ubuntu xff1a 14 04 目的 xff1a 一台计算机通过Optitrack获得刚体 xff08 crazyflie2 0 xff09 的姿态信息并广播到同一局域网的其他计算机上 xff08 如
  • 运算放大电路(三)-加法器

    加法器 由虚短知 xff1a V 61 V 43 61 0 a 由虚断及基尔霍夫定律知 xff0c 通过R2与R1的电流之和等于通过R3的电流 xff0c 故 V1 V R1 43 V2 V R2 61 Vout V R3 b 代入a式 x
  • 一个嵌入式硬件高手的设计心得

    一 xff1a 成本节约 现象一 xff1a 这些拉高 拉低的电阻用多大的阻值关系不大 xff0c 就选个整数5K吧 点评 xff1a 市场上不存在5K的阻值 xff0c 最接近的是 4 99K xff08 精度1 xff09 xff0c
  • 跟着我从零开始入门FPGA(一周入门系列)第五

    5 同步和异步设计 前面已有铺垫 xff0c 同步就是与时钟同步 同步就是走正步 xff0c 一二一 xff0c 该迈哪个脚就迈那个脚 xff0c 跑的快的要等着跑的慢的 异步就是搞赛跑 xff0c 各显神通 xff0c 尽最大力量去跑 x
  • 硬件原理图设计规范(二)

    1 可编程逻辑器件 编号 级别 条目内容 备注 1 推荐 FPGA的LE资源利用率要保证在50 xff5e 80 之间 xff0c EPLD的MC资源的利用率要保证在50 xff5e 90 之间 对于FPGA中的锁相环 RAM 乘法器 DS
  • 嵌入式Linux应用程序开发-TCP-IP网络通信应用程序

    作为全世界最优秀的开源操作系统 xff0c Linux内部已经集成了强大的网络协议栈 xff0c 并向应用层提供丰富的系统调用 xff0c 开发者可以基于通用的系统调用接口 xff0c 使用Linux内核提供的网络功能 如果要分析Linux
  • STM32“死机“(实用调试技巧)

    2 硬件环境导致 34 死机 34 1 供电电源电压不在合适范围 单片机都需要有一个能够稳定运行的电压工作范围 xff0c 如果低于或者高于正常工作电压范围其单片机并不一定会立马无法工作 也有可能会立马死机 xff0c 而是工作一段时间在某