stm32cube出现Hardfault的调试方法(emwin死机)

这篇具有很好参考价值的文章主要介绍了stm32cube出现Hardfault的调试方法(emwin死机)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

stm32cube出现Hardfault的调试方法

在STM32芯片开发中,当程序运行时出现HardFault异常,通常是由于以下原因引起的:

  • 程序中出现了无效的指令,比如指向不存在的内存地址或未初始化的指针;

  • 栈溢出,导致程序无法正常运行;

  • 部分寄存器值异常,例如SP(栈指针)、PC(程序计数器)、LR(链接寄存器)等;

  • 硬件问题,如时钟问题或存储器故障。

当HardFault发生后,事后诸葛亮分析方法:

首先,当程序异常时,将触发HardFault中断,进入HardFault_Handler,如下图所示:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

由于STM32中断前,处理器会将错误信息推送到堆栈上。该信息包括程序计数器、故障状态寄存器和处理器寄存器。我们可以使用调试器从堆栈中读取这些信息,并对其进行分析以确定错误的原因。

简单地,我们可以利用IDE的优势,查找到堆栈的内容,如下图:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

查找出出现硬错误进入HardFault_Handler前,堆栈的情况,这里可以看出,故障前,是调用了GUI_SetText函数,然后再调用GUI_ALLOC_LockH,我们可以直接通过查找调用过GUI_SetText函数的相关程序有无异常,从而查找出问题,我这里的问题是对未创建的控件进行操作,导致出现HardFault。

对于发生故障时,顺藤摸瓜,查找中断和堆栈的变化原理:

中断的堆栈变化如下图所示:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

根据上图内容,我们需要得到中断前的PC(Return address)值,具体步骤:

(1)在HardFault_Handler中断服务程序里面取得当前SP值

(2)当前SP值加上6*4(Byte),得到中断前PC值的地址

确定SP:

因为堆栈寄存器SP实际有两个,一个是MSP,一个是PSP。不同的情况,使用不同的SP。需要通过LR寄存器确定使用的是哪个SP,详细解释如下图所示:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

总结一下上表,可以得出,合法的EXC_RETURN值共3个,如下表所示:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

读取了当前LR的值,如下图所示:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

从LR的值可以看出,程序进入中断前使用的是MSP,将MSP的值放在Memory Monitor中搜索,如下图 所示:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

选择Hex Integer格式:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

找到MSP的地址:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

在中断的描述中已经详细说明,根据MSP的地址加上6*4(Byte)可以找到中断前PC的值:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

利用反编译工具,找到PC值上对应的程序段:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

往上滑,找到出现故障的函数名:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

打开Debug文件里的map文件,查找地址0x8026BF7附近的函数段也是GUI_SetText

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

确定是emwin的API GUI_SetText出现了问题,一般是对未创建的控件进行操作,导致出现HardFault,搜索与SetText函数有关的代码,定位到错误代码为:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

修改成只有打开控件后才能操作控件的内容:

stm32进入hardfault原因,c语言,stm32,Powered by 金山文档

故障至此修复。文章来源地址https://www.toymoban.com/news/detail-728838.html

到了这里,关于stm32cube出现Hardfault的调试方法(emwin死机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32_断点调试无法进入串口接收中断

    先说结果,可能是stm32调试功能/keil软件/调试器(试过STLINK和JLINK两种)的问题,不是代码; 配置完串口后,可以发送数据到串口助手,但不能接收数据并做处理,所以第一步,想确定有没有接收到单个字节进入中断。 开始打断点调试,发现串口数据寄存器DR能收到数据,串

    2024年02月08日
    浏览(49)
  • STM32和emWin必须知道的那些事

    emWin 是由德国 SEGGER 公司开发,可为图形 LCD 设计提供高级支持,极大简化了 LCD 设计。 为恩智浦ARM 微控制器用户免费提供的 emWin 图形库。   在国内做嵌入式系统的大部分都使用 emwin, 其简单来说就是一套图形库。   STemWin是SEGGER公司授权给ST(意法半导体)的。使用

    2024年01月23日
    浏览(35)
  • STM32开发时HardFault错误的排查

    本篇是 嵌入式开发-STM32硬件I2C驱动OLED屏 一文的扩展。 把相关的问题记录一下,给遇到HardFault_Handler问题的朋友做个参考。 做STM32开发,经常遇到HardFault错误,也就是程序不会正常运行,此时若停止程序运行,会发现跳转到下面的程序段,并死循环运行,也就是著名的HardFa

    2024年02月07日
    浏览(34)
  • STM32调试特定函数出现Cannot access Memory

    超出数组索引 指针访问越界 对空指针进行操作 都容易出现这个问题 如果是函数没有跑, 就出现Cannot access Memory 搜索到的结果大多是这种回复 可以参考一下

    2024年02月16日
    浏览(40)
  • STM32FreeRTOS任务通知(STM32cube高效开发)

    1、任务通知可模拟队列和信号量 任务通知是FreeRTOS另外一种进程间通信技术。不需要创建任何中间对象,可以直接从任务向任务或ISR向任务发送通知,传递一个通知值任务通知可以模拟二值信号量、计数信号量、或长度为1的消息队列,使用任务通知,一般效率更高,消耗内

    2024年03月13日
    浏览(48)
  • 【STM32Cube开发记录】1-下载和安装STM32CubeIDE

    【STM32Cube开发记录】1-下载和安装STM32CubeIDE 【STM32Cube开发记录】2-STM32CubeProgrammer的使用 【STM32Cube开发记录】3-STM32CubeMX的使用 【STM32Cube开发记录】4-标准库 HAL库 LL库 【STM32Cube开发记录】5-寄存器和存储器映射 【STM32Cube开发记录】6-STM32核心功能 【STM32Cube开发记录】7-Debug调试功

    2024年01月17日
    浏览(44)
  • 1、STM32CubeMX和STM32Cube库(HAL)详细介绍

    目录 前言 STM32Cube生态 STM32Cube 是什么?         STM32Cube 软件工具套件 STM32Cube Embedded 软件 STM32CubeMX ​编辑         也许大家在学习正点原子或者其他32视频和代码的时候都听过HAL库,是的这是ST官方最新的函数库,而以前的标准库已不再更新与发展。而跟随而来的就是

    2024年02月03日
    浏览(59)
  • 在MDK调试STM32出现“could not stop cortex-m device”软件解决办法

    这个问题出现的原因很多,答案最多的都是硬件或配置原因,总结为: 1.BOOT0和BOOT1的接法; 2.NRST引脚在开机过程出现低电平导致片子处于在reset状态; 3.或者是编译选项里你没选器件,或者是下载选项里没选器件; 4.主频超频了; 5.编辑器版本原因; 6.调试过程没关闭看门狗

    2024年02月13日
    浏览(100)
  • 无线路由器死机经常出现断线现象解决方法

    有不少的人认为,无线路由器这种东西插上就用啊!也不用设置什么啊?用的不也挺好的吗?对于一般的应用当然是这样的,不过要是遇到一些诸如:为什么总吊线、为什么速度变慢等问题时,作为普通消费者的你是不是就无从下手了? 路由器死机解决办法 1.查放置的环境是否通

    2024年02月07日
    浏览(43)
  • STM32Cube HW-493激光发射

    文章代码使用 HAL 库。 HW-493激光模块 是一种小型化的激光发射模块,其主要特点是体积小、功耗低、精度高、可靠性强。它采用了半导体激光器作为光源,搭配高精度光学透镜,可以发射出稳定、准确、高亮度的激光光束。 VCC : +5 V 电压。(电源电压范围为 3.5V-5.5V,过高或

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包