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

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

3天内不再提示

STM32硬件错误的调试技巧

小麦大叔 来源:小麦大叔 作者:小麦大叔 2022-07-21 14:39 次阅读

在用KeilSTM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。

这说明STM32出现了硬件错误。

4651ec2c-08a8-11ed-ba43-dac502259ad0.png

硬件错误中断

STM32出现硬件错误可能有以下原因:

数组越界操作;

内存溢出,访问越界;

堆栈溢出,程序跑飞;

中断处理错误;

遇到这种情况,可以通过以下2种方式来定位到出错代码段。

方法1:

在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。

466c27d6-08a8-11ed-ba43-dac502259ad0.png

示例

1.2 在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。

如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值;

我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。

467999d4-08a8-11ed-ba43-dac502259ad0.png

寄存器信息

1.3 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”;

在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。

地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。

4691ad3a-08a8-11ed-ba43-dac502259ad0.png

内存信息

1.4 在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。

在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。

仔细查看附近区域的相关代码来排查错误具体原因。

46b206c0-08a8-11ed-ba43-dac502259ad0.jpg

方法2:

2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。

46d05efe-08a8-11ed-ba43-dac502259ad0.jpg

CallStack

2.2 在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。

然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。

审核编辑 :李倩

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

    关注

    2270

    文章

    10900

    浏览量

    355895
  • 硬件
    +关注

    关注

    11

    文章

    3324

    浏览量

    66216
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62591

原文标题:简单实用!STM32硬件错误的调试技巧

文章出处:【微信号:knifewheat,微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何进行硬件调试

    硬件调试硬件系统设计、开发和制造过程中不可或缺的一环,旨在对可能出现的问题进行分析和解决。以下是进行硬件调试的一般步骤和方法: 一、准备阶
    的头像 发表于 11-10 10:17 643次阅读
    如何进行<b class='flag-5'>硬件</b><b class='flag-5'>调试</b>?

    socket编程中的错误处理技巧

    错误处理能够确保程序在遇到异常情况时不会崩溃,而是能够优雅地处理问题。 提升用户体验 :通过适当的错误处理,可以给用户提供清晰的错误信息,避免用户感到困惑。 便于调试和维护 :良好
    的头像 发表于 11-01 17:47 858次阅读

    开发攻略之STM32调试端口的映射

    最近有一个项目用到了STM32F103RB系列单片机,由于引脚数量较少,不得不使用到了单片机的PB3和PB4两个引脚。而这两个引脚刚好又是STM32系列的JTAG调试引脚,如果要用于普通IO的功能
    的头像 发表于 08-03 08:11 438次阅读
    开发攻略之<b class='flag-5'>STM32</b><b class='flag-5'>调试</b>端口的映射

    说说硬件调试中发现的那些低级错误

    说说硬件调试中发现的那些低级错误 2024-07-03 11:47**·**一博高速先生 高速先生成员--周伟 最近遇到很多debug相关的咨询,曾经我们说过,我们做过的板子越多,遇到问题的概率也
    发表于 07-03 12:02

    说说硬件调试中发现的那些低级错误

    硬件调试中会经常遇到各种意想不到的问题,有些调试花了几个月,各种能想到的办法都尝试了,最后发现却是一个非常低级的错误,有多低级?请看今天的内文介绍。
    的头像 发表于 07-03 12:00 338次阅读
    说说<b class='flag-5'>硬件</b><b class='flag-5'>调试</b>中发现的那些低级<b class='flag-5'>错误</b>

    STM32F103用CAN调试器接到该板子后给其发消息,调试器会显示总线数据错误的原因?

    项目里有个CAN收发相关的板子,用的是STM32F103芯片。在与上位机的CAN交互过程中经常会出现通讯错误的情况,表现在上位机发送报文后没有收到回复。用CAN调试器接到该板子后给其发消息,
    发表于 05-27 07:42

    stm32f030的硬件i2c中断方式读写数据,为什么调试不出来?

    有没有哪位大神用过stm32f030的硬件i2c中断方式读写数据的?看文档感觉可以用的,但是怎么就是调试不出来呢。
    发表于 05-11 08:02

    ucosiii的串口打印输出遇到了硬件错误怎么解决?

    我练两天调试了ucos-iii之前是应为一些问题发现系统运行错误,但是到了第二天打开工程从新编译下载程序测试,发现一刚刚开始打印串口消息就出现了硬件错误(段
    发表于 04-24 06:03

    stm32cubeIDE移植的UCOSIII,定义float变量后进入硬件错误怎么解决?

    如题:stm32cubeIDE移植的UCOSIII,STemwin,用的stm32407芯片,定义float变量后进入硬件错误 之前是Keil5移植的时候也遇到了这个问题,然后是在启动
    发表于 04-12 06:09

    stm32cubemx生成的can代码,运行调试显示显性位错误的原因?

    stm32cubemx生成的can代码,运行调试显示显性位错误,找不到原因,芯片是stm32f103z,求助各位。
    发表于 04-07 07:56

    用CUBE生成STM32H743工程,用iar编译器进入硬件错误是哪里的问题?

    最近在用CUBE 生成STM32H743工程,用iar编译器进入硬件错误,用MDK就没问题,STM32H743只能用MDK吗?
    发表于 04-07 06:07

    STM32 USART中断与ADC DMA中断冲突造成硬件错误的原因?

    开启时会造成硬件错误HardFault_Handler?分开使用时没有问题,USART中断优先级比DMA的高,有没有人知道什么原因啊
    发表于 04-02 06:26

    stm32l051 hal库如何使用硬件i2c从机?

    stm32l051 hal库如何使用硬件i2c从机,有没有相关参考程序。现在调试过程中一直进入AF错误,是什么原因导致的?
    发表于 03-27 08:24

    STM32F429使用外部SPI flash,只要执行Bitmap::cache(id)就进入硬件错误怎么解决?

    ,就进入硬件错误。 执行Bitmap::cacheAll()函数也会进入硬件错误。 正常执行cache函数之后会进入TouchGFXHAL::blockCopy()函数,然后执行自定义
    发表于 03-27 07:39

    ug内部错误,内存访问违例怎么解决

    问题,并提供一些预防这些问题的最佳实践方法。 一、内部错误原因和解决方法 1. 软件错误:软件错误是引起内部错误的最常见原因之一。这可能是由于编程
    的头像 发表于 12-27 16:27 6290次阅读