STM32单片机编程调试常见问题(一) HardFault_Handler故障分析与解决

文章目录

    • 一.概要
    • 二.什么是Hard fault
    • 三.Hard fault 产生的原因分析
    • 四.制作一个Hard fault程序并定位出问题原因
      • 1.查看堆栈指针SP的地址以及内容
      • 2.找到Return address地址
      • 3.查看汇编界面
      • 4.输入Return address地址,查找到问题代码
    • 小结

一.概要

在嵌入式开发中,偶尔会遇到单片机HardFault_Handler死机的异常,单片机无法正常运行,出现Hardfault错误时,问题比较难定位的原因在于此时代码无法像正常运行时一样,所以显得无从下手。通常情况下我们都是通过在某个区间打断点,然后通过单步执行去逐步缩小“包围圈”去找到产生Hard Fault的代码位置,接着再去推敲、猜测问题的原因。对于不是很复杂的程序,这种方法是有效的,但是当用户代码量进一步增大,再用这种单步+断点去逐步缩小包围圈的方式就很难查到问题点,效率也很低。尤其是在有操作系统的应用中,很多代码的跳转是由操作系统调度的,不是严格的顺序执行,所以很难依靠缩小包围圈的方式去有效找到问题产生的点,进一步增加了定位到Hard Fault触发原因的难度。
本文就介绍了出现HardFault_Handler出现的原因,以及发现异常之后,问题的排查分析与解决方法。

在这里插入图片描述

二.什么是Hard fault

对于Cortex-M内核,架构采用错误异常的机制来检测问题,当内核检测到一个错误时,异常中断会被触发,并且内核会跳转到相应的异常中断处理函数执行。
错误异常的中断分为以下四种:
HardFault
MemManage
BusFault
UsageFault
其中hardfault为最常见的错误类型,并且在没有开启其他异常处理的情况下,默认进入hardfault异常中断处理函数。
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 /
/
USER CODE END HardFault_IRQn 0 /
while (1)
{
/
USER CODE BEGIN W1_HardFault_IRQn 0 /
/
USER CODE END W1_HardFault_IRQn 0 */
}
}

三.Hard fault 产生的原因分析

硬件方面常见原因:
1.电源设计有错误,造成器件供电不稳;
2.电源质量不好,文波,噪声过大;
3.器件接地不良;
4.对于带有Vcap引脚的器件,管脚处理不当;
5.电路中有强干扰源,对器件造成干扰;

软件方面常见原因:
1.使用了空指针;
2.对地址偏移量的计算有误;
3.数组越界导致程序出错;
4.动态内存使用不当,导致访问了已释放的内存地址;
5.通过地址访问了已失效的局部变量;
一般因为硬件造成Hard Fault错误的可能性较低,大多数都是软件原因造成的。所以遇到硬件中断错误,基本就是通过软件来排查。

由于异常发生时,内核将R0~R3、R12、Returnaddress、PSR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址,所以我们可以通过找到Return address,从而排查出产生异常的指令。

四.制作一个Hard fault程序并定位出问题原因

硬件准备:
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。
在这里插入图片描述
程序准备:
在普通的GPIO例程中修改代码

uint32_t Data2=100,Data3;
uint8_t Temp[100],*p;
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */Data3=Data2*100;memset(Temp,0x55,100);Data=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);Data3=100*(Data2-1);if(Data3>10){Data=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);	}memset(p,0x55,1000);memset(Temp,0x55,100);Data=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

下载完程序调试运行效果:

程序进入HardFault_Handler
在这里插入图片描述

查找问题步骤:

1.查看堆栈指针SP的地址以及内容

堆栈指针SP地址为0x20000468
在这里插入图片描述

查看Memory,地址为0x20000468
在这里插入图片描述

2.找到Return address地址

内核是将R0~R3、R12、Returnaddress、PSR等寄存器依次入栈,所以找到Return address是0x08000FE7
在这里插入图片描述

3.查看汇编界面

在这里插入图片描述

4.输入Return address地址,查找到问题代码

在这里插入图片描述
输入地址0x08000FE7
在这里插入图片描述
找到Return address的指令,以及上一条指令,发现上一条指令指针是空指针,问题找到
在这里插入图片描述

再举一个例子

uint32_t Data2=100,Data3;
uint8_t Databuff[10000];
uint8_t Temp[100];
void Datacpy(void)
{memcpy(Temp,Databuff,10000);}
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */memset(Temp,0x55,100);Data=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);Data3=100*(Data2-1);if(Data3>10){Data=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);	}Datacpy();Data=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

根据上述方法,查出有问题的函数是void Datacpy(void),Return Address是0x080001A3,发现是操作数组的时候越界了。
在这里插入图片描述

小结

使用调试工具和技术来定位HardFault的根源在单片机开发和调试中是必不可少的,可以帮助我们快速地排查问题所在,提供产品开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549374.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Hugging Face从命令行到桌面:Chat-macOS让AI互动更简单,关键还免费!

你是否曾经觉得,命令行操作虽然强大,但总是有些难以上手?或者,你是否希望和AI互动可以像日常使用macOS应用一样直观?那你一定要试试Chat-macOS,它让你从命令行走向桌面,体验更轻松的AI互动方式。 1. 什么是Chat-macOS? Chat-macOS是一个桌面应用程序,它能够将Hug…

pdf怎么转变成jpg图片?值得推荐的几种PDF转jpg方法

pdf怎么转变成jpg图片?jpg格式的图像在电子邮件、社交媒体等在线平台上分享非常方便,用户无需担心软件兼容性问题。将PDF内容转换为jpg后,能够有效保留原始文档的视觉布局,使信息更加生动易懂,适合用于演示和展示。同时…

六级翻译 高分笔记

第一节 句子的拆分与重组 核心原则:拆主干,补修饰 一、句子的拆分与重组 1.青藏铁路是世界最高最长的高原铁路。(“的”字前面所有去掉,就是句子主干) The Qinghai-Tibet Railway is the highest and longest plate…

工控主板在工业控制中扮演什么角色

工控主板在工业控制中扮演着至关重要的角色,它是工业控制系统的核心组件,负责连接、控制和管理各种工业设备,实现自动化生产和智能化管理。具体来说,工控主板在工业控制中的作用可以归纳为以下几个方面: 一、核心控制…

综合业务区的数字化创新与智能化蓝图

数字化智能管理的关键要素之一是综合业务区的电子标签系统,该系统在提高管理工作的效率、精确跟踪资源以及改善业务流程中扮演了至关重要的角色。以下内容将对这一综合业务区采用的智能电子标签系统进行深入剖析。 一、定义与功能 1.1定义 融合多功能于一体的智能…

海外盲盒APP系统:盲盒出海热潮下的选择

近年来,盲盒市场展现出了强劲的发展态势,不仅在国内持续上演“盲盒热”,在海外市场中更是“一盒难求”!在盲盒出海的浪潮下,盲盒在国际市场中迅速火爆,一时席卷了全球市场。 海外盲盒系统是企业拓展海外市…

为本地生活赛道从业者赋能,易播易赚开启“抖音直播分享会”

9月22日,由杭州易播易赚科技有限公司主办的“抖音直播分享会”在杭州市富阳区召开,此次会议吸引了来自全国各地的抖音直播从业者、有志于加入抖音直播事业的创业者以及行业内知名专家齐聚一堂,共同探讨行业发展趋势、分享实战经验&#xff0c…

探索基于知识图谱和 ChatGPT 结合制造服务推荐前沿

0.概述 论文地址:https://arxiv.org/abs/2404.06571 本研究探讨了制造系统集成商如何构建知识图谱来识别新的制造合作伙伴,并通过供应链多样化来降低风险。它提出了一种使用制造服务知识图谱(MSKG)提高 ChatGPT 响应准确性和完整…

yolox训练自己的数据集

环境搭建 gpu按自己情况安装 nvidia-smi 查看自己的版本 CUDA和cudnn 按自己的安装,我的驱动551.76,注意不要用最新的,官网只要求驱动是大于等于,可以用低版本的cuda,我安装的是CUDA 11.1 cuda下载后&#xff0c…

py 元组,列表,函数的学习和使用

代码 下面两个Python脚本&#xff0c;分别解决问题。 1. 脚本 test1.ipynb # 创建一个元组 t1 和一个空列表 list1 t1 (1, 2, R, py, Matlab) list1 [] # 使用 while 循环&#xff0c;将 t1 中的元素添加到 list1 i 0 while i < len(t1): list1.append(t1[i]) …

实时监控图像中的人脸识别:理解人脸识别技术指南

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 在当今的数字时代&#xff0c;人脸识别技术已经成为一个关键技术&#xff0c;它正在从安全到个性化体验等多个领域进行革新。从门禁控制到考勤系统&#xff0c;再到走失儿童的检测&#xff0c;人脸识别的应用非常广泛&am…

MySQL的安装(环境为CentOS云服务器)

卸载内置环境 我们初期使用root账号&#xff0c;后期再切换成普通账号 使用 ps axj | grep mysql 查看系统中是否有MySQL相关的进程 使用 systemctl stop mysqld 关停进程 使用 rpm -qa | grep mysql 查看MySQL相关的安装包 使用 rpm -qa | grep mysql | xargs yum -y remo…

基于php的酒店管理系

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

力扣 滑动窗口最大值

滑动窗口最大值 题目描述 题目分析 维护一个定长窗口的最大值&#xff0c;每当窗口滑动时都有一个新的元素进入和一个原有的元素离开。 比较简单的方法就是用一个优先队列维护窗口最大值 但是堆的计算成本时最坏时是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 优化&#xff1a;…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中&#xff0c;性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题&#xff0c;我们需要对 MySQL 进行性能剖析。那么&#xff0c;如何在 MySQL 中进行性能剖析呢&#xff1f;本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

实施自动化测试的五个条件

摘要&#xff1a; 谈到什么是组成一次自动化测试的“恰当实施”经常会关注你需要用的工具&#xff0c;但是那仅仅是等式的一部分。巴斯 迪杰斯特拉详细说明了你需要考虑的其他四件事&#xff0c;他们如何致力于你的自动化测试的成功&#xff0c;以及关联到不能适当关注它们中任…

MNIST手写数字数据集

数据集 官网链接失效&#xff0c;我找到数据集后&#xff0c;上传到码云&#xff0c;并在这里分享。 打开链接&#xff0c;进入如下目录&#xff0c;即可找到如下八个文件&#xff1a; 下面是一些可有可无的介绍。 Mnist数据集介绍 Mnist数据集包含70000张手写数字图片&#x…

5G NR 协议规范表(对应3GPP 协议编号)

文章目录 5G NR 协议规范表&#xff08;对应3GPP 协议编号&#xff09;5G 架构相关协议5G 新空口相关协议无线接入网相关协议终端相关协议 5G NR 协议规范表&#xff08;对应3GPP 协议编号&#xff09; 5G 架构相关协议 5G 新空口相关协议 无线接入网相关协议 终端相关协议

Woocommerce怎么分类显示产品?如何将Shopify的产品导入到Woocommerce?

WooCommerce作为WordPress的一个电子商务插件&#xff0c;功能强大、使用简洁&#xff0c;能够轻松集成到WordPress网站中&#xff0c;为用户提供了一个完整的在线商店解决方案&#xff0c;在国外还是挺受欢迎的。 Woocommerce怎么分类显示产品&#xff1f; 在Woocommerce中&a…

[ComfyUI]Flux:太美了!古风华服与现代DJ演绎。灼灼荷花瑞,亭亭出水中

大家好我是安琪&#xff01;&#xff01;&#xff01; F.1-汉服人像艺术-国风-氛围感 简介 今天介绍一款Flux LORA模型&#xff1a;F.1-汉服人像艺术-国风-氛围感-liangyi&#xff0c;这是一款以古代汉服女性写真为主题的Flux LORA模型。属于人物主体&#xff0c;增加中国传统…