RT-Thread论坛
直播中

吕钢格

9年用户 1075经验值
私信 关注
[问答]

STM32H750的SD卡必须复位一次才能挂载成功,否则就像死机了一样,如何解决?

STM32H750,SD卡接在SDMMC1上,JTAG仿真时,可以mount上,拔掉卡后,也可以unmount掉。拔掉仿真器时,程序像死机了一样,但是,只要把NRST引脚和地短路一下,立即可以成功运行。
请教一下各位大神,如何解决?

回帖(1)

kmno4

2025-11-7 17:09:02

针对STM32H750的SD卡在脱离仿真器时无法挂载、需手动复位的问题,以下是系统性解决方案:


1. 增加SD卡初始化重试机制


在SD卡初始化函数中(如MX_SDMMC1_SD_Init())添加重试逻辑,确保在电源波动时也能成功初始化:


HAL_StatusTypeDef ret;
uint8_t retries = 5; // 重试次数

do {
    ret = HAL_SD_Init(&hsd1); // 初始化SD卡
    if (ret != HAL_OK) {
        HAL_Delay(10); // 失败后延时10ms再试
        HAL_SD_DeInit(&hsd1); // 先反初始化
    }
} while (ret != HAL_OK && --retries > 0);

if (ret != HAL_OK) {
    // 初始化失败处理(如LED报警)
}

2. 强制复位SDMMC外设


在初始化前复位SDMMC1外设,清除残留状态:


// 在HAL_SD_MspInit()函数中添加
__HAL_RCC_SDMMC1_FORCE_RESET();  // 强制复位
__HAL_RCC_SDMMC1_RELEASE_RESET(); // 释放复位
HAL_Delay(1); // 短暂延时确保复位生效

3. 优化时钟配置


确保SDMMC时钟稳定且符合SD卡规格(≤48MHz):


// 在SystemClock_Config()中检查时钟树
RCC_PeriphCLKInitTypeDef periph_clk = {0};
periph_clk.PeriphClockSelection = RCC_PERIPHCLK_SDMMC;
periph_clk.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL; // 使用PLL提供时钟
HAL_RCCEx_PeriphCLKConfig(&periph_clk);

4. 延长上电延时


在初始化前增加电源稳定时间:


HAL_Delay(500); // 上电后延时500ms再初始化SD卡
MX_SDMMC1_SD_Init(); // 初始化SD卡

5. 检查硬件设计



  • 电源滤波:在SD卡VCC引脚添加100nF+10μF电容,确保电压稳定。

  • 信号线匹配:SDIO_D0~D3、CLK、CMD信号串联22Ω电阻,减少振铃。

  • 复位电路:确认NRST引脚有0.1μF电容接地,避免意外复位。


6. 启用SDIO时钟超时检测


HAL_SD_ConfigWideBusOperation()后启用硬件特性:


hsd1.Instance->CLKCR |= SDMMC_CLKCR_HWFC_EN; // 启用硬件流控

7. FatFS挂载重试


f_mount()失败时自动重试:


FRESULT res;
int mount_retries = 3;

do {
    res = f_mount(&SDFatFS, "", 1); // 挂载文件系统
    if (res != FR_OK) HAL_Delay(50);
} while (res != FR_OK && mount_retries-- > 0);

8. 验证脱离仿真器的启动流程


使用串口输出调试信息,定位卡死位置:


// 在main()关键节点打印日志
printf("SystemClock_Config OKrn");
MX_SDMMC1_SD_Init();
printf("SDMMC Init OKrn");
f_mount(...);
printf("FatFS Mount OKrn");

问题根源分析


当仿真器连接时,STM32的电源时序和复位状态被调试器干预,掩盖了以下问题:



  1. 电源上升时间不足:SD卡未就绪时MCU已开始初始化。

  2. 硬件状态残留:热插拔导致SDMMC寄存器状态异常。

  3. 时钟不稳定:PLL未锁定前SDMMC时钟异常。


通过上述综合措施(重点是硬件复位SDMMC外设增加初始化重试电源延时),可有效解决脱离仿真器时的SD卡挂载问题。



注意:若仍存在问题,请用示波器检查SD卡供电电压(应在3.0-3.4V间平稳上升)及CLK/CMD信号波形(无过冲/振铃)。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分