STM32F407ZE执行SRAM1中代码触发HardFault故障排查
SRAM运行代码触发HardFault排查方案
以下按故障出现概率从高到低排序排查:
- 第一优先级检查MPU配置:Cortex-M4内核的SRAM区域默认常被配置XN(Execute Never,禁止执行)属性,若未手动修改MPU配置,CPU尝试从SRAM取指时会直接触发MemManage错误,未开MemManage中断时直接升级为HardFault。
需将SRAM1对应的地址区间配置为Normal内存属性,清除XN位,同时关闭该区间的写保护限制。
注意:部分MCU的MPU配置在system初始化文件中默认开启,不要只检查自己写的应用代码,要核对启动流程中所有MPU相关配置。
- 检查向量表重定位配置:代码整体迁移到SRAM1运行时,必须在跳转到main函数前配置
SCB->VTOR寄存器,将向量表基地址指向SRAM1内的向量表起始位置,地址需满足至少128字节对齐要求。若VTOR仍指向默认Flash基地址,首次中断或函数跳转时会从Flash取无效地址直接跑飞。 - 核对链接脚本与启动文件匹配性:
- 确认
.text、.rodata、.init、.init_array等所有代码、只读常量段全部分配到SRAM1地址区间,无遗漏段被分配到CCMRAM或Flash区域 - 确认链接脚本中SRAM1的起始地址、长度配置与芯片手册完全一致,避免代码段越界分配到非法地址
- 确认启动文件中初始栈指针取值来自重定位后的向量表首项,不要硬编码Flash区域的栈地址
- 确认
- 检查跳转合法性与总线配置:
- Cortex-M4仅支持Thumb指令集,跳转目标地址最低位必须置1,若跳转地址为偶数会直接触发用法错误
- 跳转前必须使能SRAM1对应的总线时钟,部分低功耗型号SRAM1时钟默认关闭,直接访问会触发总线错误
- 核对AHB总线矩阵配置,确认Cortex-M4 I-bus、D-bus对SRAM1有完整访问权限,无主从访问拦截配置
- 若开启了芯片读保护、RAM写保护,需先解除对应保护位,避免SRAM1写入代码后读取值异常,执行非法指令触发故障
- HardFault寄存器快速定位方法:
- 读取
SCB->CFSR寄存器值:若IBUSERR位为1,为取指总线错误,对应前述MPU、时钟、权限配置问题;若INVPC、INVSTATE位为1,为跳转地址非法或Thumb位未置1 - 触发故障后查看LR值,若为
0xFFFFFFF9/0xFFFFFFFD,可分别从MSP/PSP指针位置读取栈帧中的PC值,核对该PC地址是否落在SRAM1的合法代码区间,快速定位出错指令位置。
- 读取
内容的提问来源于stack exchange,提问作者Sheikh Muhammad Junaid Aslam
相关产品推荐
相关产品推荐

