STM32 程序卡着不动,可能是发生了硬件错误,进入了HardFault_Handler处理程序中

1.前言

STM32 程序卡着不动,可能是发生了硬件错误,进入了HardFault_Handler处理程序中。
在这里插入图片描述

2.问题描述

调试STM32程序时,遇到一个很古怪的问题。程序本应输出CRC的内容。结果没有任何打印输出。通过缩小问题范围,定位应该是hexStringToCRC16函数中出了问题。
在这里插入图片描述
DEBUG模式,单步调试时,发现程序卡在sscanf函数不动了。再调试发现进入了硬件错误,while(1)循环,所以一直卡着不动了。
在这里插入图片描述
该函数就是把hexStr中的数据放入data中,而data是在堆上申请的一块空间。刚开始怀疑:是不是data空间申请的小了,下标访问越界,想了下,不是。
在这里插入图片描述
把问题现象描述了一下,在大模型中查找答案。没想到,大模型给了我惊喜。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到提示,我就想是不是STM32 堆空间不够用了。就把堆空间扩大了一倍。然后问题解决。
在这里插入图片描述

3.问题解决

在这里插入图片描述
另外,由该问题引发的思考。
重要!
当发生硬件错误后,程序进入了硬件错误处理流程。如果HardFault_Handler采用默认配置,没有修改,就进入了死循环中。因此,开发者应当根据具业务需要,重写该函数。比如,当发生硬件错误中断时,让程序复位,或者 对异常做些处理,走入专门的异常处理流程中。
在这里插入图片描述
在这里插入图片描述
2024/10/25日更新
STM32中堆栈大小设置不合适,可能触发HardFault硬件中断。

如下图所示,
在这里插入图片描述

根据问题现象,初步还以可能是程序中 定义了大量的临时变量,导致栈空间不够了,而程序在跳转到一个函数时,需要操作栈空间,会有压栈出栈的操作,所以有可能是栈空间不够了,从而产生了HardFault中断。
最后定位到是一个临时变量,申请的空间太大了,改小后,程序正常。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同志啊为人民服务!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值