keil MDK hardfault调试步骤

hardfault

Cortex-M3/4的Fault简介
(http://blog.csdn.net/wang_yf_/article/details/53436041 fault详解)、

方法1:调试步骤

###1,添加断点###
在进入hardfault后进入断点。

/** 
  * @brief  This function handles Hard Fault exception. 
  * @param  None 
  * @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
keil MDK hardfault调试步骤_第1张图片
###3,查看使用的是哪个堆栈###
查看LR的值可以知道进入hardfault时候程序用的是哪个堆栈。(图片仅示意位置)
keil MDK hardfault调试步骤_第2张图片
keil MDK hardfault调试步骤_第3张图片
###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
keil MDK hardfault调试步骤_第4张图片
###5,根据PC的值查找语句命令###
在反汇编窗口中点击右键,选中show disassembly at address 在窗口中输入PC地址即可定位产生异常的命令。
keil MDK hardfault调试步骤_第5张图片

这里写图片描述

方法2:调试步骤

再仿真状态下,调出Call Stack Window,观察进入断点前,堆栈保存了哪些参数,可以清楚的看出来。
keil MDK hardfault调试步骤_第6张图片
Call Stack 窗口可以显示出当前堆栈和函数局域变量值。当进入断点时,通过这个窗口就可以看出来进入异常时函数所保存的变量,并且还可以查询调用这个变量的语句。非常好用。!!!!

你可能感兴趣的:(STM32代码,Cortex-M3)