cancel
Showing results for 
Search instead for 
Did you mean: 

SDMMC FATFS mount Hardfault

EthanMankins
Senior

I have followed How to create a file system on a SD card using STM32CubeIDE the best I can using the STM32H7B3I-DK. With this board I do not see the DMA tab under SDMMC1, so I have skipped that. I am failing the f_mount(). I am using a touchGFX project and a 128GB microSD card. The failure occurs while calling fmount(). I have debugged and got the following stack:

 

HardFault_Handler() at stm32h7xx_it.c:93 0x8007d6e	
<signal handler called>() at 0xfffffff1	
memcpy() at 0x8036658	
prvCopyDataToQueue() at queue.c:2,102 0x8020a04	
xQueueGenericSendFromISR() at queue.c:995 0x80202d4	
osMessageQueuePut() at cmsis_os2.c:1,766 0x801ef94	
touchgfx::OSWrappers::signalVSync() at OSWrappers.cpp:95 0x8002de2	
HAL_LTDC_LineEventCallback() at TouchGFXGeneratedHAL.cpp:196 0x8005a2e	
HAL_LTDC_IRQHandler() at stm32h7xx_hal_ltdc.c:713 0x8011446	
LTDC_IRQHandler() at stm32h7xx_it.c:233 0x8007df2	
<signal handler called>() at 0xffffffed	
SDMMC_GetCmdResp1() at stm32h7xx_ll_sdmmc.c:1,273 0x801acf8	
SDMMC_CmdAppCommand() at stm32h7xx_ll_sdmmc.c:885 0x801aaa0	
SD_PowerON() at stm32h7xx_hal_sd.c:3,186 0x8017a6a	
HAL_SD_InitCard() at stm32h7xx_hal_sd.c:523 0x8016a08	
HAL_SD_Init() at stm32h7xx_hal_sd.c:404 0x8016894	
BSP_SD_Init() at bsp_driver_sd.c:51 0x8000a9e	
SD_initialize() at sd_diskio.c:192 0x8000c7e	
disk_initialize() at diskio.c:59 0x801b208	
find_volume() at ff.c:3,036 0x801c82a	
f_mount() at ff.c:3,297 0x801cd5c	
SDInit() at main.c:817 0x800704a	
StartDefaultTask() at main.c:892 0x800719a	
pxPortInitialiseStack() at port.c:214 0x801f6d8	

 

With no SD card inserted the system just prints the failure messages, but with an sd card the system hard faults and locks up ... I am having a hard time understanding what is causing the issue.

 

I have modified the code slightly to troublseshoot:

 

void SDInit(void)
{
    // Mount the file system on the SD card (assumes SDPath is defined)
    if (f_mount(&SDFatFS, (TCHAR const*)SDPath, 1) != FR_OK)
    {
        printf("Failed to mount\r\n");
    }
    else{
        printf("Mount Good\r\n");
    }
}

void WriteSDCard(void)
{
    if (f_open(&SDFile, "STM32.TXT", FA_OPEN_ALWAYS | FA_WRITE) != FR_OK)
    {
        printf("Failed to open file on write\r\n");
    }
    else
    {
    	printf("File Opened on write\r\n");
        f_lseek(&SDFile, f_size(&SDFile));
        res = f_write(&SDFile, wtext, sizeof(wtext), &byteswritten);
        if (res != FR_OK)
        {
        	printf("Failed to write\r\n");
        }
        else
        {
            printf("%u bytes written to STM32.TXT\r\n", byteswritten);
        }
        f_close(&SDFile);
    }
}

void ReadSDCard(void)
{
    if (f_open(&SDFile, "STM32.TXT", FA_READ) != FR_OK)
    {
    	printf("Failed to open file on read\r\n");
    }
    else
    {
    	printf("File Opened on read\r\n");
        res = f_read(&SDFile, rtext, sizeof(rtext) - 1, &bytesread);
        if (res == FR_OK)
        {
            rtext[bytesread] = '\0';
            printf("File contents: \n%s\n", rtext);
        }
        else
        {
            printf("Failed to read\r\n");
        }
        f_close(&SDFile);
    }
}
void SDDeInit(void)
{
    // Unmount the SD card (optional step to release resources)
    f_mount(NULL, (TCHAR const*)NULL, 0);
}

void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN 5 */
	printf("Starting SD Card Program\r\n");
	SDInit();
	f_mkfs((TCHAR const*)SDPath, FM_ANY, 0, rtext, sizeof(rtext));
  /* Infinite loop */
  for(;;)
  {
//	  if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_8) == GPIO_PIN_SET){
//		  printf("Pin high\r\n");
//	  }
//	  if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_8)== GPIO_PIN_RESET){
//		  printf("Pin low\r\n");
//	  }

	  if(writeFlag){
		  printf("Attempt Write\r\n");
		  writeFlag = 0;
		  WriteSDCard();
	  }
	  if(readFlag){
		  printf("Attempt Read\r\n");
		  readFlag = 0;
		  ReadSDCard();
	  }

	  osDelay(100);
  }

  SDDeInit();
  /* USER CODE END 5 */
}

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
EthanMankins
Senior

SOLVED: Change OSTask priority to Realtime

View solution in original post

1 REPLY 1
EthanMankins
Senior

SOLVED: Change OSTask priority to Realtime