Skip to main content
OE1
Associate II
May 6, 2020
Question

Bug Report : CubeMX 5.6.1 Code Generation STM32L5 HAL_SD_MspInit

  • May 6, 2020
  • 3 replies
  • 1103 views

Hi,

I'm using CubeIDE 1.3.1 with CubeMX 5.6.1, target is a STM32L5 with SDMMC.

I had a problem during SD initialisation, which gave me a timeout error every time from SDMMC_CmdGoIdleState call in SD_PowerON.

I finally found the problem : the function HAL_SD_MspInit generated by CubeMX in the file stm32l5xx_hal_msp.c is just setting things in the PeriphClkIni structure but never uses it : here's the code generated :

void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 if(hsd->Instance==SDMMC1)
 {
 /* USER CODE BEGIN SDMMC1_MspInit 0 */
 
 /* USER CODE END SDMMC1_MspInit 0 */
 /** Initializes the peripherals clock 
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SDMMC1;
 PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_PLLSAI1;
 PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSAI1SOURCE_HSE;
 PeriphClkInit.PLLSAI1.PLLSAI1M = 4;
 PeriphClkInit.PLLSAI1.PLLSAI1N = 48;
 PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV17;
 PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV4;
 PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV8;
 PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK;
 
 /* Peripheral clock enable */
 __HAL_RCC_SDMMC1_CLK_ENABLE();
 
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 /**SDMMC1 GPIO Configuration 
 PC8 ------> SDMMC1_D0
 PC9 ------> SDMMC1_D1
 PC10 ------> SDMMC1_D2
 PC11 ------> SDMMC1_D3
 PC12 ------> SDMMC1_CK
 PD2 ------> SDMMC1_CMD 
 */
 GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
 |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, 7, 0);
 HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
 /* USER CODE BEGIN SDMMC1_MspInit 1 */
 
 /* USER CODE END SDMMC1_MspInit 1 */
 }
 
}

The fix was to add HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); somewhere after the line 20 and before the end of the function. I did add it in the user code line 54 and everything works as it should.

This topic has been closed for replies.

3 replies

Khouloud ZEMMELI
ST Employee
May 7, 2020

​Hello @OE​ 

Could you please share your ioc file?

Thanks

Khouloud

OE1
OE1Author
Associate II
May 7, 2020

Sure!

Here it is

Khouloud ZEMMELI
ST Employee
June 5, 2020

​@OE​ , Thanks for your feedback, issue fixed, the fix will be available for the next release.

Regards,

Khouloud