石榴大王 发表于 2025-6-16 09:00

使用HAL在STM32h745上挂载SD卡时出现问题

我将SDCARD插到板上时遇到了一些问题。想使用SDIO 4-Wire将数据写入SD卡,我使用的是带Waveshare适配器的STM32 h745 Nucleo板。我能够初始化卡,能够读取CID数据,并确认它是正确的卡,但当我尝试挂载卡:
void StartDefaultTask(void const * argument){/* USER CODE BEGIN StartDefaultTask */         if(f_mount(&fs, SDPath, 0) == FR_OK)        {                HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);        }/* Infinite loop */for(;;){    osDelay(1);}/* USER CODE END StartDefaultTask */}在sd_diskio. c中的初始SD_read函数中卡住了DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count){DRESULT res = RES_ERROR;uint32_t timer;#if (osCMSIS < 0x20000U)osEvent event;#elseuint16_t event;osStatus_t status;#endif#if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)uint32_t alignedAddr;#endif/** ensure the SDCard is ready for a new operation*/   if (SD_CheckStatusWithTimeout(SD_TIMEOUT) < 0){    return res;} #if defined(ENABLE_SCRATCH_BUFFER)if (!((uint32_t)buff & 0x3)){#endif    /* Fast path cause destination buffer is correctly aligned */    uint8_t ret = BSP_SD_ReadBlocks_DMA((uint32_t*)buff, (uint32_t)(sector), count);   if (ret == MSD_OK) {#if (osCMSIS < 0x20000U)    /* wait for a message from the queue or a timeout */    event = osMessageGet(SDQueueID, SD_TIMEOUT);卡在这条语句:event = osMessageGet(SDQueueID, SD_TIMEOUT);已禁用SD_TRANSCIEVER:#defineUSE_SD_TRANSCEIVER         0U               /*!< use uSD Transceiver */

elephant00 发表于 2025-6-18 17:14

DMA通道冲突、传输大小不匹配?

onlycook 发表于 2025-6-18 17:20

SD卡电源不稳定或电压不足/

jcky001 发表于 2025-6-18 18:00

检查DMA通道配置是否正确,DMA通道与SDIO外设是否匹配。

cr315 发表于 2025-6-18 18:45

在DMA传输完成后,检查DMA中断标志位是否被清除。

cr315 发表于 2025-6-18 19:00

可能是消息队列未正确初始化或超时导致的。

flycamelaaa 发表于 2025-6-18 21:00

增加超时时间(SD_TIMEOUT),让DMA传输有足够时间完成。

powerantone 发表于 2025-6-18 22:00

SDIO中断未使能或中断优先级配置不当。

stormwind123 发表于 2025-6-18 22:00

检查SDIO中断服务程序是否被正确调用,并在其中发送消息到SDQueueID。

probedog 发表于 2025-6-18 22:00

可能是硬件连接问题。

classroom 发表于 2025-6-18 22:00

SDIO信号线可能接触不良或存在干扰。
页: [1]
查看完整版本: 使用HAL在STM32h745上挂载SD卡时出现问题