Skip to content

[Bug] STM32F407 SD卡初始化时触发INVSTATE HardFault,PC指向数据区0x20002cb4 #11133

@LinuxMint-User

Description

@LinuxMint-User

RT-Thread Version

5.3.0

Hardware Type/Architectures

stm32f407-atk-explorer

Develop Toolchain

GCC

Describe the bug

🐛 问题摘要

问题标题:STM32F407 SD卡初始化时触发INVSTATE HardFault,PC指向数据区0x20002cb4

软件环境:RT-Thread 5.3.0

📋 问题现象

  1. 正常初始化

    [I/SDIO] SD card capacity 62367744 KB.
    [I/SDIO] SD card switch to High Speed / SDR25 mode
    
  2. 突然崩溃

    hard fault on handler
    usage fault: SCB_CFSR_UFSR:0x02 INVSTATE 
    pc: 0x20002cb4
    
  3. 关键地址

    • PC指向:0x20002cb4(RAM数据区)
    • 此地址对应:rt_scheduler_lock_nest变量
    • 错误类型:INVSTATE(无效指令状态)

🔍 问题分析

根本原因

SD卡检测线程(mmcsd_detect_thread)栈溢出,导致函数返回地址被破坏。

崩溃链条

栈溢出 → 返回地址被覆盖为0x20002cb4 → 函数返回时PC加载错误地址 → 
CPU尝试执行数据 → 触发INVSTATE异常 → HardFault

调试证据

  1. 崩溃时PC指向RAM数据区,非代码区
  2. 栈中保存的返回地址被破坏
  3. 地址0x20002cb4是调度器锁计数变量
  4. 崩溃发生在高速模式切换时,此时栈使用深度最大

💡 解决方案

  1. 增大 RT_MMCSD_STACK_SIZE 栈大小

🎯 问题复现

  1. 插入SD卡
  2. 系统自动检测并初始化
  3. 尝试切换到高速模式时崩溃
  4. 设置不同栈大小(RT_MMCSD_STACK_SIZE)具体跑飞情况不同,该例是其中一种,看上去是不同大小的栈,程序执行到的位置不同进而触发不同的问题。在某些情况下系统能捕捉到栈溢出,某些情况则直接跑飞,调试较为困难

📁 相关文件

  • components/drivers/sdio/dev_mmcsd_core.c - SD卡检测线程
  • components/drivers/sdio/dev_sd.c - SD卡驱动
  • bsp/stm32/libraries/HAL_Drivers/drivers/drv_sdio.c - 硬件驱动

该 issue 的提出旨在揭示使用 SD 卡功能过程中可能遇到的问题,方便之后的人在移植 BSP 或在没有查看相关使用手册的情况下遇到使用 SD 卡功能系统跑飞时的 debug。当然如果这个潜在问题在未来能够有相关修复是再好不过了。

Other additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions