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
文章图片
###3,查看使用的是哪个堆栈###
查看LR的值可以知道进入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
文章图片
###5,根据PC的值查找语句命令###
在反汇编窗口中点击右键,选中show disassembly at address 在窗口中输入PC地址即可定位产生异常的命令。
文章图片
【STM32代码|keil MDK hardfault调试步骤】
文章图片
方法2:调试步骤 再仿真状态下,调出Call Stack Window,观察进入断点前,堆栈保存了哪些参数,可以清楚的看出来。
文章图片
Call Stack 窗口可以显示出当前堆栈和函数局域变量值。当进入断点时,通过这个窗口就可以看出来进入异常时函数所保存的变量,并且还可以查询调用这个变量的语句。非常好用。!!!!
推荐阅读
- STM32学习之Flash(主存储块、系统存储器和选项字节)详解
- STM32代码|STM32 多个定时器PWM波输出频率不同。
- STM32开发资料汇总
- stm32 ADC基础配置
- 定时器PWM波输出频率问题