STM32出现HardFault_Handler故障的缘由主要有两个方面:指针
一、内存溢出或者访问越界。这个须要本身写程序的时候规范代码,遇到了须要慢慢排查。调试
二、堆栈溢出。增长堆栈的大小。blog
出现问题时排查的方法:ip
一、添加软件断点,一旦在调试过程当中出现Hard Fault 则会停在__breakpoint(0)处。内存
void HardFault_Handler(void) { if (CoreDebug->DHCSR & 1) { //check C_DEBUGEN == 1 -> Debugger Connected __breakpoint(0); // halt program execution here } while (1) { } }
当进入HardFault断点后,菜单栏Peripherals >Core Peripherals >FaultReports打开异常发生的报告,查看发生异常的缘由。io
上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。
相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(以下图左侧,断点停在Hard Fault服务程序中)class
(2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也能够直接双击)变量
这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p还没有为成员变量分配内存空间,直接访问未分配的内粗空间确定出错。软件
补充:
[1] 在复杂的状况下,即便定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2]在问题不明晰的状况下,尝试分析反汇编代码,就本身遇到的,部分状况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常bug