电子产业一站式赋能平台

PCB联盟网

搜索
查看: 48|回复: 0
收起左侧

ARM Cortex-M (STM32)如何调试HardFault

[复制链接]

710

主题

710

帖子

2893

积分

三级会员

Rank: 3Rank: 3

积分
2893
发表于 前天 08:04 | 显示全部楼层 |阅读模式

54xa3ywtuut64010513747.gif

54xa3ywtuut64010513747.gif

点击上方蓝色字体,关注我们


4
步骤 4: 定位并修复源代码
根据反汇编窗口中定位到的指令地址,结合 .map 文件或调试器的符号信息,找到对应的 C 源代码行。


分析原因:
  • 空指针/野指针:检查 MMFAR 或 BFAR 指向的地址,或者出错指令访问的指针变量是否为 NULL 或指向了无效/已释放的内存区域。
  • 数组越界:检查数组索引是否超出了边界,导致访问了非法内存。
  • 堆栈溢出: 如果 stacked_sp 的值非常接近或超出了定义的堆栈区域的边界,或者 PC 指向了堆栈区域,则很可能是堆栈溢出。检查函数调用深度、局部变量大小、中断嵌套。可以尝试增大堆栈空间 (startup_stm32xxxx.s 文件中定义)。
  • 未对齐访问:检查代码中是否有对 uint16_t, uint32_t 等多字节类型的指针进行强制类型转换和解引用,而该指针的地址不是 2 或 4 的倍数。例如:uint32_t* p = (uint32_t*)0x20000001; val = *p;。可以修改数据结构或使用 memcpy 来避免。
  • 除零错误:检查代码中是否存在除数为零的情况。
  • MPU 配置错误:如果使用了 MPU,检查 MPU 区域的配置是否正确,是否允许了必要的读/写/执行权限。
  • 访问无效外设地址:检查 BFAR 是否指向了一个未启用时钟或不存在的外设寄存器地址。
  • 中断/RTOS 问题:如果 HardFault 发生在中断处理或 RTOS 任务切换期间,问题可能更复杂,可能涉及中断优先级配置错误、临界区保护不足、任务堆栈太小等。检查 LR 的 EXC_RETURN 值有助于判断上下文。
    根据分析出的原因修改代码,重新编译、下载并运行代码,确保HardFault 不再发生。

    hwljzs55tts64010513847.jpg

    hwljzs55tts64010513847.jpg

    0u2duswks0i64010513947.gif

    0u2duswks0i64010513947.gif

    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表