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调试方法
相关推荐
iCxhust1 小时前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
zhaoshuzhaoshu3 小时前
嵌入式开发之IIC接口详解-STM32
嵌入式硬件·软件工程
SUNNYSPY0014 小时前
AO3402-ASEMI开关电源专用AO3402
单片机
iCxhust5 小时前
MTK8088单板机制作(一)时钟电路
汇编·单片机·嵌入式硬件·微机原理·8088单板机
2601_958352905 小时前
双麦 DSP 音频拾音模块 A-68:多场景远场语音交互的声学解决方案
嵌入式硬件·音视频·降噪·回音消除·音频处理模块
崇山峻岭之间5 小时前
单片机直流有刷电机速度环PID控制实验
单片机·嵌入式硬件
xiangw@GZ5 小时前
智能锁浮空系统指纹头金属环ESD防护技术分析
单片机·嵌入式硬件
ACP广源盛139246256735 小时前
IX7008 PCIe 交换芯片@ACP#RTX Spark 经济型 8 口扩展芯片(对比 ASM1806)
大数据·人工智能·分布式·嵌入式硬件·gpt·spark·电脑
项目題供诗6 小时前
STM32-DMA直接存储器存储(二十)
stm32·单片机·嵌入式硬件
耳朵东先生6 小时前
STM32 开发利器:SEGGER RTT 日志打印与 Shell 实践解析
单片机·嵌入式硬件