最近负责一个项目,用到stm32f4的一款高性能芯片。研发过程中遇到一个很诡异的现象,前前后后折腾了两三天,最后才搞定。由于是新手,经验不足,排故过程很纠结~~

现象如下:

1.采用JLINK下载程序后,断电让其上电重新启动,发现有时可以正常运行,有时候无法正常运行,大约每两、三次就有一次无法正常上电启动。

2.通过JLINK调试程序,每次均正常运行。太诡异了!

发现问题后开始定位原因。首先考虑是BOOT启动出问题了,stm32f4启动方式分三种:User FLash、SystemFlash和EmbeddedSRAM,通过BOOT0和BOOT1管脚配置。程序正常运行时从User FLash启动,如果BOOT0和BOOT1配置不正确,会导致无法正常运行;而通过JLINK调试程序,程序直接下载到SRAM中运行,不存在此问题。于是,通过万用表测BOOT0和BOOT1管脚电平,都是低电平,没问题!于是,基本排除此原因了。

其次,考虑电源供电不稳定问题。通过万用表测量各个模块电压,发现电压均正常值。那也有可能是系统上电时刻,由于负载变化,导致电压跳变,之后电压又稳定了,所以测量不出来。通过示波器捕捉电压变化,未发现明显的异常跳变。通过万用表测电流为88mA,并不大。初步认为不是电源供电问题导致。

然后,考虑是否是由于复位信号不稳定的原因。板子采用了外置复位芯片,上电后会产生复位信号,此提供给处理器、蓝牙等模块。由于JLINK调试时会自动产生一个复位信号,让系统恢复默认状态,然后程序开始运行,因此调试下程序应该都能正常启动。但是如果程序断电后上电启动,如果复位信号过短或者不稳定,有可能导致无法正常启动了。完美的解释!哈哈,那一瞬间仿佛找到问题所在了。程序无法正常启动时,RESET信号手动接地(给一个低电平脉冲),处理器都开始工作了!这进一步验证了我的推断。于是锁定是复位信号不稳定导致的,开始折腾复位信号,通过示波器观察、隔离复位信号、加滤波电容、换复位芯片等方法进行定位。最后发现复位信号感觉也没有什么问题,真是怪了!纠结~~~~

后来有人建议是不是晶振不稳定。但是,晶振不稳定,调试程序时也应该出现同样现象啊,道理上解释不通啊。无解啊~~~

后来求助同事,他是电子硬件方面的专家。我们几人仔细琢磨了板子的原理图和实验现象后,他突然问你的BOOT0怎么没有接电阻到公共地啊?我说接了吧,之前还用万用表量过电平,是低电平。他说不对啊,就是没接地啊。我才猛地想起来,板子是另外一个同事焊的,交到我手里时说板子已经仔细检查过了,没问题。当时,由于项目紧张,就没有再仔细核实。我再仔细一看,确实没接地,也就是悬空状态!而之前测电压是低电平,有可能是由于下拉电阻的作用。崩溃了!这么粗心,居然没有自己检查。赶紧焊电阻接地,重新上电,发现正常了。测试了三四十次,都是正常的。看来这次真正找到原因了,就是由于BOOT0悬空而导致的。BOOT0悬空时,其状态是不确定的,会导致程序无法从UserFlash中正常启动,就可能出现时好时不好的现象了!哎,原来是这样。终于长嘘了一口气。

问题终于解决了,但是还是有一点无法理解:既然是BOOT0悬空引起的,但是为什么将处理器的RESET信号手动接地(给一个低电平脉冲),处理器又正常运行了?难道是因为再次复位上电重启时,恰好BOOT0又被识别为低电平?RESET信号影响了BOOT0的状态?看来还需要进一步做实验,才能解答此疑惑。

原文:https://blog.csdn.net/qiyueweilianga/article/details/47173975

stm32 非debug模式程序无法运行相关推荐

  1. stm32拔掉jlink,程序不能运行(或者主板不工作)。

    当你拔掉jlink的USB口,程序不能运行了(或者主板不工作). 这是复位的问题,当JLINK在板子上连接的时候,断电情况下,会一直把RESET拉低,导致芯片一直处在复位状态,所以不能正常工作. 把j ...

  2. CLion的debug模式程序正常运行,run模式下出现停止运行

    问题复现 然后使用debug模式运行 一般出现这种情况,就不是代码的问题了,那么就是软件的问题 解决办法 那就是找到编译好的exe文件,然后设置该文件以兼容模式运行. 然后在点击运行就可以执行成功了 ...

  3. stm32芯片休眠模式_STM32的运行、睡眠、停止和待机四种工作模式

    01 前言 按功耗由高到低排列,STM32具有运行.睡眠.停止和待机四种工作模式.上电复位后 STM32 处于运行状态,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中, ...

  4. n行Python代码系列:两行程序判断是否处于Debug模式

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.引言 最近看到好几篇类似"n行Python代码-"的博文,看起来还 ...

  5. 简单粗暴的“Debug模式”

    在项目中,通常会遇到:调试程序和程序在线上运行时程序运行的参数不一样, 例如线上运行时程序是获取线上的机器的ip,而调试程序时,我们会指定一个ip进行调试. 又或者项目要与多个系统进行数据交换,调试的 ...

  6. Python源码解析:内存管理(DEBUG模式)的几个理解点

    写了这多贴子,顺带写点自己的感想吧!其实很多贴子在写的时候很踌躇,比如这次打算写的python内存管理,因为内存管理都比较琐碎,在软件架构里,也是很容易出问题的地方,涉及的细节内容非常多,要写好写明白 ...

  7. Debug模式下加载文件,运行程序异常的慢

    今天在进行单元测试的时候,debug模式下加载速度很慢,但是run模式下速度很快. 原因:在debug模式下,断点位置不当,解决办法 移除编译器中的所有断点. 转载于:https://www.cnbl ...

  8. idea调试怎么跳出循环_使用IDEA的Debug调试功能,查看程序的运行过程

    Debug追踪,使用IDEA的断点调试功能,查看程序的运行过程 知乎视频​www.zhihu.com 1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 ...

  9. QT 32位程序Debug模式发布问题

    1. 32位release模式没问题. 直接运行"windeployqt xx.exe",再将exe和dll文件全部copy到remote机器,可以运行 2. debug模式下出错 ...

  10. IDEA debug模式下修改变量后运行

    首先运行Debug模式来到30行,可以见到这个时刻入参configPath,对于if的判断结果是true ALT + F8 然后选中变量,右键可以修改变量值 如果断点的位置跑过了,又想修改重新跑到断点 ...

最新文章

  1. 数组、ArrayList、链表、LinkedList
  2. docker tensorflow-jupyter简单使用
  3. thinkphp中__construct与_initialize()的区别
  4. c语言define定义全局变量,webpack中使用DefinePlugin定义全局变量
  5. leetcode547. 省份数量
  6. MSDN宇宙版到货!
  7. SSM框架笔记13:Spring MVC基础
  8. php xml 接口调用,php的SimpleXML方法读写XML接口文件实例解析
  9. 第5条:用枚举表示状态、选项、状态码
  10. Mac/Homebrew查找nginx安装目录和nginx.conf配置文件目录
  11. 永恒python配合什么主武器_「和平精英武器组合」游戏的主副武器应该怎么搭配?这三种配合让你战斗力提升...
  12. HDU 3533 简单bfs 主要是MLE问题
  13. Spring Boot系列——日志配置
  14. 这台计算机上没有安装驱动程序,这台计算机上没有安装‘HP LaserJet Pro M402-403 PLC6'打印机驱动程序,如果不安装...
  15. 为什么越长大越不想过生日
  16. 前端发起请求,后端响应请求的整个过程
  17. 配置管理神器 Viper
  18. linux实验mkdir命令,linux基础命令(1)mkdir命令
  19. 网页字体在Frontpage2000制作网页中的讲解
  20. 用Python实现一个决策树分类器

热门文章

  1. 第一节:用Cube学32之简单IO口操作(点灯及按键)
  2. mysql join 实践
  3. linux yum list、search、-y、install、update、remove、grouplist、groupinstall、groupremove
  4. 什么是 DevSecOps?系列(一)
  5. Android 手机的坐标
  6. NLP语义匹配 | 经典前沿方案整理
  7. 2021 年“微软学者”奖学金全亚洲 11 人名单公布!
  8. 【人机对话】对话的囧境?
  9. 2021年了,Transformer有可能替代CNN吗?未来有哪些研究方向?
  10. 清北中科院12位大咖联手,带你入门AI热门领域NLP!限时只需199