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调试方法
相关推荐
电子元器件选型哥9 分钟前
组串电流检测和MPPT电流检测,到底有什么区别?
单片机·嵌入式硬件·硬件工程师·电子元器件·器件选型
Freak嵌入式28 分钟前
树莓派 Pico GPIO 深度解析:从 MCU 架构到寄存器控制,底层原理与实践指南
java·开发语言·科技·单片机·嵌入式硬件·架构
Freak嵌入式39 分钟前
实战对比:用 mpremote/Putty/MobaXterm 连接树莓派 Pico REPL,谁更省心?
java·大数据·开发语言·科技·单片机·嵌入式硬件
Freak嵌入式1 小时前
告别死循环!Pico 外部中断控制 LED,比轮询高效 100 倍
java·开发语言·stm32·单片机·嵌入式硬件
AOI小白新手上路1 小时前
江科协51单片机入门:新建第一个Keil工程,点亮第一个LED(含完整代码)
stm32·单片机·51单片机
自小吃多2 小时前
PCB Editor软件网络飞线常规处理笔记
笔记·嵌入式硬件
深圳市恒锐丰科技杨生2 小时前
CL4056D 1A 单节锂电池线性充电芯片|ESOP‑8/DFN2×2‑8 便携充电方案
嵌入式硬件·硬件工程
Messy create2 小时前
【BMS-AFE-被动均衡】
嵌入式硬件·能源
恒锐丰科技林技术员2 小时前
SS6289 桥式驱动芯片:高可靠性有刷直流电机驱动优选方案
经验分享·嵌入式硬件·硬件工程
水果里面有苹果12 小时前
39-UM960-RTK模块-和芯星通
嵌入式硬件