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调试方法
相关推荐
钰珠AIOT3 小时前
通过显微镜发现电池座子两端连锡短路,是直接拆掉重新换一个新的座子还是如何处理连锡?是通过热风枪还是烙铁更好?
单片机·嵌入式硬件·机器人
z20348315204 小时前
如何通过状态机解决按键识别问题(二)
c语言·单片机·嵌入式硬件
芜狄4 小时前
用寄存器点亮灯
单片机·嵌入式硬件
余生皆假期-11 小时前
硬件基础知识补全【四】通用、整流和肖特基二极管
单片机·嵌入式硬件
czhaii11 小时前
双直流电机BTS7960模块正反转程序
单片机·嵌入式硬件
一路往蓝-Anbo12 小时前
第 1 章:M33 领航——STM32MP257F-DK 硬件解密与启动逻辑重构
linux·stm32·嵌入式硬件·重构
一路往蓝-Anbo13 小时前
第 2 章:全能开发环境与交叉编译工具链构建
stm32·单片机·嵌入式硬件·网络协议
我在这里呀15 小时前
DSP 多个 PWM 同步总出问题?28377S 同步链路和主从配置一次讲清!
单片机·嵌入式硬件
余生皆假期-16 小时前
硬件基础知识补全【六】BJT 晶体管 (三极管)
单片机·嵌入式硬件
嵌入式×边缘AI:打怪升级日志16 小时前
ARM Cortex-M 单片机启动流程与向量表深度解析(保姆级复习笔记)
arm开发·笔记·单片机