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调试方法
相关推荐
少年、潜行2 小时前
【开源】STM32HAL库移植Arduino OneWire库驱动DS18B20和MAX31850
stm32·嵌入式硬件·开源·ds18b20·max31850
四夕白告木贞5 小时前
stm32week12
stm32·单片机·嵌入式硬件·学习
美好的事情总会发生5 小时前
晶振不集成到芯片内部的原因分析
嵌入式硬件·硬件工程·智能硬件
xx155802862xx6 小时前
STM32实现2小时延时的最佳方法探讨
单片机·嵌入式硬件
许有杨7 小时前
STM32 的 GPIO和中断
stm32·单片机·嵌入式硬件
轩辰~7 小时前
STM32F103系列单片机寄存器操作和标准库操作
stm32·单片机·嵌入式硬件
小禾苗_9 小时前
32单片机——外部中断
单片机·嵌入式硬件
昊昊昊昊昊明9 小时前
10天学会嵌入式技术之51单片机-day-8
单片机·嵌入式硬件
昊昊昊昊昊明9 小时前
10天学会嵌入式技术之51单片机-day-6
单片机·物联网·51单片机
电鱼智能的电小鱼9 小时前
SAIL-RK3588协作机器人运动控制器技术方案
linux·嵌入式硬件·数码相机·机器人·无人机·边缘计算