一、定位HardFault的核心方法

  1. 启用调试器捕获异常上下文

      • 在Keil中启动调试模式,当程序触发HardFault时,调试器会自动暂停。通过查看Call Stack窗口寄存器窗口(如LRPCSP),可获取异常发生时的程序状态。

      • 关键寄存器分析

        • SCB->CFSR(可配置故障状态寄存器):判断故障类型(如内存访问错误、未对齐访问、指令执行错误)。

        • SCB->HFSR(硬件故障状态寄存器):确认是否为HardFault的直接触发原因。

        • SCB->MMFAR/SCB->BFAR:记录导致内存管理或总线故障的具体地址。

      • 堆栈回溯分析

          • 通过SP寄存器获取异常时的堆栈指针,手动解析堆栈中保存的返回地址PC值)。在反汇编文件(.map.lst)中查找对应的代码位置。

          • 示例步骤:

            • 在调试器中查看SP的值,找到堆栈中保存的PC(通常位于SP+24偏移处)。

            • 使用fromelf工具生成反汇编文件(.axf.lst),根据PC值定位出错的汇编指令及对应的C代码行。

          • 自定义HardFault处理函数

            • 在代码中重写HardFault_Handler函数,捕获异常信息并输出(如通过串口)。需在启动文件(如startup_stm32fxxx.s)中确保异常向量指向此函数。

            • 示例代码片段:

          void HardFault_Handler(void) {    volatile uint32_t *sp = (uint32_t*)__get_MSP(); // 获取堆栈指针    uint32_t pc = sp[6]; // 提取PC值    printf("HardFault at 0x%08X\n", pc);    while(1);}

          4.示例讲解

          (1)HardFault_Handler出现的情况一般有两种:

              一种是:数组越界.

              一种是:堆栈溢出,程序指针指飞。

          (2)制造一个HardFault故障;

          void Test_UART(void){  uint8_t *pData;  *pData = 10;  printf("%d,\r\n", *pData);}

          (3)将上面函数Test_UART放在程序里面运行,将会出现以下情况:

          这里写图片描述

          (4)值得特别注意是,你要先判断将MSP(R14(LR) = 0xFFFFFFE9)或PSP(R14(LR) = 0xFFFFFFFD)的值作为SP值来使用。在Registers里面找到R14(LR)的值,我的这里是:0xFFFFFFFD

          说明一下:

              0xFFFFFFF9对应的是要看MSP寄存器

              0xFFFFFFFD对应的是要看PSP寄存器

          图片

          所以这里需要查找的内存地址是MSP的值:0x20005EA8

          (5)在memory里面查找MSP的值:0x20005EA8,然后在对应的行里面找到地址,地址一般格式都是:0x080085EF这样的。

          图片

          (6)在Disassembly里面右键选择Show Code at Address,把找到的地址输进去进行搜索,然后就会找到相对应的代码,这里的代码就是在进入循环中断之前的时候的情况,仔细查看这部分函数被调用或者数组内存使用情况。

          图片

          图片

          不过你也可以简单这样操作:

          在中断HardFault_Handler中的while()处打上断点,让程序执行到此处停止。

          图片

          在keil中打开Call Stack + Locals,然后在HardFault_Handler上 右键选择:Show Caller Code,就会跳转到进入循环中断之前的函数处。仔细查看这部分函数被调用或者数组内存使用情况。

          图片

          关注我,获取更多技术干货

          Logo

          智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

          更多推荐