MCU HardFault_Handler调试方法

一.获取内核寄存器的值

1.在MDK的DEBUG模式下,当程序出现跑飞后,确定卡死在HardFault_Handler中断处

  1. 通过Register窗口读取LR寄存器的值来确定当前系统使用堆栈是MSP还是PSP
LR寄存器值 堆栈寄存器
0xFFFFFFF9 MSP寄存器
0xFFFFFFFD PSP寄存器

如下图所示,当前程序使用的是PSP堆栈寄存器

二、查看堆栈寄存器保存的值

  1. 通过Register窗口确定MSP或PSP的地址
    如下图所示,当前程序卡死时使用的堆栈寄存器为:PSP寄存器,地址为:0x20010318
  2. MSP、PSP堆栈寄存器介绍
    由于异常发生时,内核将r0、r1、r2、r3、r12、r14(lr)、pc、xprs寄存器依次入栈
    r14(lr):保存的是产生异常中断前内核执行的指令地址
    r15(pc):保存的内核正在执行的指令地址

    3 查看堆栈寄存器的保存值
    将上面PSP寄存器的地址(0x20010318)输入到MDK的Memory窗口中得到的数据如下,第六个数为lr寄存器的保存值

三、定位lr寄存器地址的函数名

  1. 在工程编译后的map文件中,根据lr的地址确定运行函数,如下图所示在产生异常中断前,最后执行的地址为0x0801D727在函 prvAddCurrentTaskToDelayedList中,
  2. 分析产生异常中断的原因

四、获取lr寄存器保持地址的方法

  1. 通过MDK在线调试如上面介绍的流程
  2. 通过jlink工具使用命令行也可以完成上述过程的定位
    JLink Commander调试方法
相关推荐
BackCatK Chen16 分钟前
第16篇:TMC2240多轴联动软件设计|2轴_3轴同步控制框架(保姆级)
嵌入式硬件·自动化·tmc2240·多轴联动·同步控制·2轴联动·3轴联动
Hello_Embed24 分钟前
STM32F030CCT6 开发环境搭建
笔记·stm32·单片机·嵌入式·freertos
国科安芯26 分钟前
航空级电机控制系统的抗辐照MCU功能安全设计与电磁兼容验证方法
单片机·嵌入式硬件·安全·性能优化·架构·安全性测试
myron66881 小时前
基于STM32LXXX的模数转换芯片ADC(ADS1220IPWR)驱动C程序设计
c语言·stm32·嵌入式硬件
隔壁大炮1 小时前
I2C基本电路结构
单片机·嵌入式硬件·铁头山羊
爱吃番茄鼠骗3 小时前
STM32C8T6---解析bin文件
stm32·单片机·嵌入式硬件
myron66884 小时前
基于STM32LXXX的模数转换芯片ADC(CS1237-SOP8)驱动C程序设计
c语言·stm32·嵌入式硬件
风痕天际4 小时前
ESP32-S3开发教程五-按键中断2(使用FreeRTOS)
单片机·嵌入式硬件·esp32·vs code·esp32s3·esp-idf
天天爱吃肉82184 小时前
新能源汽车多测试设备联调与多物理信息融合测试方法及数据价值挖掘
人工智能·嵌入式硬件·机器学习·汽车
小吴同学啊13 小时前
基于N32G457QEL7软件开发的基础准备
单片机·n32g457·国名技术单片机