Skip to main content
Visitor II
August 13, 2024
Question

STM32U545 Nucleo Fails to Initialize SDMMC

  • August 13, 2024
  • 1 reply
  • 1033 views

Hello,

 

I am attempting to use an STM32U545 nucleo board with an external SD card shield from Adafruit

https://www.adafruit.com/product/4682
However, each time I attempt to initialize the SDMMC peripheral, the call to HAL_SD_Init fails with a DTIMEOUT error. I have tried mirroring the settings used in the STM32U5-Eval example included with the cube, however this too fails. Below are the settings being used to initialize the peripheral, generated directly from the Cube.

 

 

 

void MX_SDMMC1_SD_Init(void)
{

 /* USER CODE BEGIN SDMMC1_Init 0 */
 if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3) != GPIO_PIN_SET) return;
 /* USER CODE END SDMMC1_Init 0 */

 /* USER CODE BEGIN SDMMC1_Init 1 */

 /* USER CODE END SDMMC1_Init 1 */
 hsd1.Instance = SDMMC1;
 hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_FALLING;
 hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
 hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B;
 hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
 hsd1.Init.ClockDiv = 1;
 if (HAL_SD_Init(&hsd1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN SDMMC1_Init 2 */

 /* USER CODE END SDMMC1_Init 2 */

}

void HAL_SD_MspInit(SD_HandleTypeDef* sdHandle)
{

 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 if(sdHandle->Instance==SDMMC1)
 {
 /* USER CODE BEGIN SDMMC1_MspInit 0 */

 /* USER CODE END SDMMC1_MspInit 0 */

 /** Initializes the peripherals clock
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SDMMC|RCC_PERIPHCLK_CLK48;
 PeriphClkInit.IclkClockSelection = RCC_CLK48CLKSOURCE_HSI48;
 PeriphClkInit.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_CLK48;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

 /* SDMMC1 clock enable */
 __HAL_RCC_SDMMC1_CLK_ENABLE();

 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 /**SDMMC1 GPIO Configuration
 PC8 ------> SDMMC1_D0
 PC12 ------> SDMMC1_CK
 PD2 ------> SDMMC1_CMD
 */
 GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_12;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

 /* SDMMC1 interrupt Init */
 HAL_NVIC_SetPriority(SDMMC1_IRQn, 14, 0);
 HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
 /* USER CODE BEGIN SDMMC1_MspInit 1 */
 /* USER CODE END SDMMC1_MspInit 1 */
 }
}

 

 

 

This issue happens regardless of if I use 1bit or 4bit mode on the SDMMC. A logic analyzer on the SDMMC lines showed no errors/issues, so at this point it feels like an issue in the HAL library. Debugging the code, I can see that values have been populated internally on the structures used by the HAL, but for whatever reason a DTIMEOUT occurs immediately after the first transaction from the peripheral and is never cleared, but is eventually checked by the HAL_SD_Init call which causes it to throw an error.

    This topic has been closed for replies.

    1 reply

    ST Employee
    August 14, 2024

    Hello @aroby95 

     

    This post has been escalated to the ST Online Support Team for additional assistance.  We'll contact you directly.

     

    Regards,

    Roger