[STM32H5] 读取 Data Flash 莫名触发硬 fault 无数据写入也出现

[复制链接]
548|56
帛灿灿 发表于 2026-1-23 07:37 | 显示全部楼层 |阅读模式
项目里刚用到 Data Flash,还没往里面写任何数据,单纯读取就触发了硬 fault 异常,排查了地址和读写函数都没问题,芯片的 Flash 配置也按手册来的,实在摸不着头脑。
磨砂 发表于 2026-2-7 12:42 | 显示全部楼层
获取Hard Fault状态寄存器的信息 可以找到一定的原因
晓伍 发表于 2026-2-7 15:06 | 显示全部楼层
32KB Flash的组织(128页):
┌─────────────────┐
│  第0页          │ 0x00000000-0x000000FF  // 中断向量表
├─────────────────┤
│  第1页          │ 0x00000100-0x000001FF
├─────────────────┤
│  ...            │
├─────────────────┤
│  第126页        │ 0x00007E00-0x00007EFF
├─────────────────┤
│  第127页        │ 0x00007F00-0x00007FFF  // 最后一页
└─────────────────┘

16KB Flash的组织(64页):
┌─────────────────┐
│  第0页          │ 0x00000000-0x000000FF
├─────────────────┤
│  ...            │
├─────────────────┤
│  第63页         │ 0x00003F00-0x00003FFF
└─────────────────┘

jiekou001 发表于 2026-2-7 11:12 | 显示全部楼层
Hard Fault 通常意味着 CPU 执行了非法操作,结合 Data Flash 读取场景,核心原因主要集中在地址访问、时序、总线冲突、寄存器配置这几个方面,而非单纯的 "写入 / 读取" 动作本身
八层楼 发表于 2026-2-7 17:29 | 显示全部楼层
不同STM32系列的Data Flash地址不同,需要检查地址是否有错误
观海 发表于 2026-2-7 19:39 | 显示全部楼层
检查一下flash是否进行了解锁
guanjiaer 发表于 2026-2-7 21:59 | 显示全部楼层
如果启用了MPU,需要配置Flash区域权限
heimaojingzhang 发表于 2026-2-8 08:42 | 显示全部楼层
考虑检查芯片Flash大小和地址映射
keaibukelian 发表于 2026-2-8 11:13 | 显示全部楼层
检查PWR相关寄存器,确保电压调节器在正确模式
paotangsan 发表于 2026-2-8 13:39 | 显示全部楼层
检查FLASH->OPTCR或选项字节
renzheshengui 发表于 2026-2-8 15:52 | 显示全部楼层
// 如果启用了MPU,需要配置Flash区域权限
void Configure_MPU_For_Flash(void)
{
    MPU_Region_InitTypeDef MPU_InitStruct = {0};

    HAL_MPU_Disable();

    // 配置Flash区域(包括Data Flash)
    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress = 0x08000000;
    MPU_InitStruct.Size = MPU_REGION_SIZE_1MB;  // 根据实际大小
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

    HAL_MPU_ConfigRegion(&MPU_InitStruct);

    HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

wowu 发表于 2026-2-8 18:31 | 显示全部楼层
Flash控制器配置错误、内存保护设置或地址越界
sesefadou 发表于 2026-2-8 07:29 | 显示全部楼层
先解锁 Flash 控制器 或 使能特定存储区访问权限
everyrobin 发表于 2026-2-8 08:14 | 显示全部楼层
Flash 地址是否越界              
jiekou001 发表于 2026-2-8 09:16 | 显示全部楼层
HardFault 的本质是 CPU 执行了非法操作或硬件出现异常,读取 Data Flash 触发 HardFault
wwppd 发表于 2026-2-8 14:09 | 显示全部楼层
实时追踪指令流,可视化还原HardFault发生前的函数调用链
mickit 发表于 2026-2-8 15:01 | 显示全部楼层
检查Flash解锁状态              
linfelix 发表于 2026-2-8 17:21 | 显示全部楼层
先尝试写入并读取单个扇区,逐步排查问题。
jonas222 发表于 2026-2-8 17:43 | 显示全部楼层
首要怀疑对象Flash 未解锁 / 未使能访问
sdlls 发表于 2026-2-8 18:18 | 显示全部楼层
超出 Flash 物理范围              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

203

主题

8833

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0