方法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 3,查看使用的是哪个堆栈查看LR的值可以知道进入hardfault时候程序用的是哪个堆栈。 4,根据堆栈查找PC的值根据上面步骤可以确定使用的堆栈,然后根据M3/4的入栈顺序可以知道:栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。在PC以前都是通用寄存器,所以通常查到的第一个地址就是PC的地址,也就是进入异常前要执行的命令。如果详细计算的话堆栈地址加上20也就是0x14就是PC的地址。要注意的是地址在寄存器中的顺序。例如下图: 5,根据PC的值查找语句命令在反汇编窗口中点击右键,选中show disassembly at address 在窗口中输入PC地址即可定位产生异常的命令。 |
|