本帖最后由 糊糊糊锅 于 2022-4-24 10:10 编辑
#技术资源# #申请原创# 出现HardFault_Handle硬件错误的原因主要有两个方面:
1.内存溢出或者访问越界(包括使用野指针)
2.堆栈溢出
遇到hardfault中断可以使用以下方法进行排查定位:
1.在中断HardFault_Handle中的while()处打上断点,全速运行后,想办法让程序出现问题触发HardFault,让程序执行到此处停止。 2.看左侧Registers Window窗口(界面上找不到窗口的话,Keil菜单栏点击“View”——“Registers Window”),在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。
3.Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x20011BA0,然后在对应行里找到地址。地址一般以0x08开头的32位数。注意从右往左看。
4.在Keil菜单栏点击“View”——“Disassembly Window”(此反汇编窗口一般默认已经开启),在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address…”。在弹出框“Show Code atAdress”的地址框中输入地址0x08002D0C进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。 |