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调试方法
相关推荐
点灯小铭21 小时前
基于单片机的多路热电偶温度监测与报警器
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
tianyue1001 天前
STM32G431 ADC 多个channel 采集
stm32·单片机·嵌入式硬件
longson.1 天前
怎样避免空间碎片而且高效的分配空间
嵌入式硬件·缓存
清风6666661 天前
基于单片机的水泵效率温差法测量与报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
焦糖码奇朵、1 天前
课设:基于Arduino的无线LED开关控制系统
嵌入式硬件·物联网·arduino·信息与通信·信号处理
z20348315201 天前
定时器练习报告
单片机·嵌入式硬件
zk001 天前
内容分类目录
单片机·嵌入式硬件
安生生申1 天前
STM32 ESP8266连接ONENET
c语言·stm32·单片机·嵌入式硬件·esp8266
广药门徒1 天前
电子器件烧毁的底层逻辑与避坑指南
单片机·嵌入式硬件
我先去打把游戏先1 天前
TCP、TLS、HTTP、HTTPS、MQTT、MQTTS几种网络协议的对比与解释
嵌入式硬件·mcu·物联网·网络协议·tcp/ip·http·aws