STM32代码|keil MDK hardfault调试步骤

hardfault Cortex-M3/4的Fault简介
(http://blog.csdn.net/wang_yf_/article/details/53436041 fault详解)、
方法1:调试步骤 ###1,添加断点###
在进入hardfault后进入断点。

/** * @briefThis function handles Hard Fault exception. * @paramNone * @retval None */ void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ if (CoreDebug->DHCSR & 1) {//check C_DEBUGEN == 1 -> Debugger Connected __breakpoint(0); // halt program execution here } while (1) { } }

###2,查看具体fault种类###
通过菜单栏Peripherals >Core Peripherals >Fault Reports打开fault reports
STM32代码|keil MDK hardfault调试步骤
文章图片

###3,查看使用的是哪个堆栈###
查看LR的值可以知道进入hardfault时候程序用的是哪个堆栈。(图片仅示意位置)
STM32代码|keil MDK hardfault调试步骤
文章图片

STM32代码|keil MDK hardfault调试步骤
文章图片

###4,根据堆栈查找PC的值###
根据上面步骤可以确定使用的堆栈,然后根据M3/4的入栈顺序可以知道:栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。在PC以前都是通用寄存器,所以通常查到的第一个地址就是PC的地址,也就是进入异常前要执行的命令。如果详细计算的话堆栈地址加上20也就是0x14就是PC的地址。要注意的是地址在寄存器中的顺序。例如下图:
1)堆栈地址:0x200122F8+0x14=0x2001230c
2)PC的值:9d 19 00 08 转换成地址:0x0800199d
STM32代码|keil MDK hardfault调试步骤
文章图片

###5,根据PC的值查找语句命令###
在反汇编窗口中点击右键,选中show disassembly at address 在窗口中输入PC地址即可定位产生异常的命令。
STM32代码|keil MDK hardfault调试步骤
文章图片

【STM32代码|keil MDK hardfault调试步骤】STM32代码|keil MDK hardfault调试步骤
文章图片

方法2:调试步骤 再仿真状态下,调出Call Stack Window,观察进入断点前,堆栈保存了哪些参数,可以清楚的看出来。
STM32代码|keil MDK hardfault调试步骤
文章图片

Call Stack 窗口可以显示出当前堆栈和函数局域变量值。当进入断点时,通过这个窗口就可以看出来进入异常时函数所保存的变量,并且还可以查询调用这个变量的语句。非常好用。!!!!

    推荐阅读