본문 바로가기

[ST_MICRO]/STM32H7

STM32H7 CubeMx SD Card Test

STM32H7 CubeMx SD Card Test


[STM32H7 EVM] 보드에는 4bit SD 인터페이스가 있어 SD카드 FAT 연결 테스트를 Stm32CubeMx를 이용하여 해 보았다.


우선 SD카드는 하드웨어 적으로 STM32H7의 디폴트 SDMMC1에 연결되어 있다.


STM32H7 EVM보드는에 아래면에 SD소켓이 장착되어 있다.







STM32CubeMx 를 이용하여 SDMMC1을 SD 4bit 모드로 선택한다.






Middleware 탭의 FATFS에서 Mode를 SD Card로 선택 한다.




이렇게 해서 기본으로 코드 생성하면 아래와 같은 코드가 생성 되는데... 



주의 해야 할 사항은 bsp_driver_sd.c 파일에 있는 BSP_SD_Init() 함수를 호출 해 주어야 한다는 것이다.


int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  MX_SDMMC1_SD_Init();
  MX_FATFS_Init();
  /* USER CODE BEGIN 2 */
  BSP_SD_Init();
  /* USER CODE END 2 */
  //disk_initialize((BYTE) 0);
  f_opendir_scan_sd();
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

}




SD를 4bit 모드로 변환 해 주는 부분이다.


uint8_t BSP_SD_Init(void)
{
  uint8_t sd_state = MSD_OK;
  /* Check if the SD card is plugged in the slot */
  if (BSP_SD_IsDetected() != SD_PRESENT)
  {
    return MSD_ERROR_SD_NOT_PRESENT;
  }
  /* HAL SD initialization */
  sd_state = HAL_SD_Init(&hsd1);
  /* Configure SD Bus width (4 bits mode selected) */
  if (sd_state == MSD_OK)
  {
    /* Enable wide operation */
    if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK)
    {
      sd_state = MSD_ERROR;
    }
  }
  return sd_state;

}






SD 카드 읽어 파일 내용을 출력 해주면 쉽게 SD카드 테스트 완료


void f_opendir_scan_sd(void)

{
    DIR dir;
       FILINFO fno;
    TCHAR path[200] = "0:";

    res = f_mount(&SDFatFS,path,0);
    printf("SD Mount : res f_mount : %02X\n\r",res);
    if (res == FR_OK)
    {
    res = f_opendir(&dir,path);
        printf("res f_open : %02X\n\r",res);
        if (res == FR_OK)
        {
        while(1)
        {
            char *fn;
            res = f_readdir(&dir, &fno);
            if (res != FR_OK)
                printf("res = %d f_readdir\n\r", res);
            if ((res != FR_OK) || (fno.fname[0] == 0))
                break;

      fn = fno.fname;
            printf("%c%c%c%c ",
                ((fno.fattrib & AM_DIR) ? 'D' : '-'),
                ((fno.fattrib & AM_RDO) ? 'R' : '-'),
                ((fno.fattrib & AM_SYS) ? 'S' : '-'),
                ((fno.fattrib & AM_HID) ? 'H' : '-') );
            printf("%10d ", fno.fsize);
            printf("%s/%s\n\r", path, fn);
        }
        }
        res = f_mount(0,path,0);
        printf("SD Unmount : res f_mount : %02X\n\r",res);
    }
}












반응형