본문 바로가기

[STM32F746G-DISCO] SDMMC 사용하기(feat. FATFS)

by rudals.kim 2024. 7. 10. 댓글 개
반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.


STM32F746NG에 내장되어있는 SD/SDIO MMC card host interface(SDMMC)는 MultiMediaCards(MMCs), SD memory card, SDIO card와 ABP2 버스 사이의 인터페이스를 제공합니다. (아래 그림을 참고하시기 바랍니다.)

SDMMC는 아래와 같은 특징을 가지고 있습니다.
• Full compliance with MultiMediaCard System Specification Version 4.2. Card support for three different databus modes: 1-bit (default), 4-bit and 8-bit
• Full compatibility with previous versions of MultiMediaCards (forward compatibility)
• Full compliance with SD Memory Card Specifications Version 2.0
• Full compliance with SD I/O Card Specification Version 2.0: card support for two different databus modes: 1-bit (default) and 4-bit
• Data transfer up to 50 MHz for the 8 bit mode
• Data and command output enable signals to control external bidirectional drivers.

새 프로젝트를 생성하여 핀 초기화 후 SYS/RCC/NVIC/GPIO/SDMMC1/USART1/FATFS를 설정하였습니다.
이전의 게시글들에서 사용했던 장치는 제외하고 FATFS와 SDMMC1의 설정은 아래와 같이 설정하였습니다.

클럭은 SDMMC가 48MHz가 필요하여 아래와 같이 설정하였습니다.

main 함수 시작 부분에 디스크를 초기화 후 파일을 생성하는 코드를 작성하였습니다.
아래 주석의 USER CODE 영역을 참고하여 각 각의 소스를 복사해 넣으시면 됩니다.

/* USER CODE BEGIN 0 */
void create_test_file(char *filename)
{
  FIL fp;
  FRESULT res;
  uint32_t written_bytes=0;
  char buf[50];
  char *p = "FatFs example for STM32F746G-Dicovery!!!\r\n";

  res = f_open(&fp, (const char*)filename, FA_CREATE_ALWAYS | FA_WRITE);
  if(res == FR_OK){
    sprintf(buf, "%s\r\n", p);
    f_write(&fp, (const void*)buf, strlen(buf), (unsigned int*)&written_bytes);
    printf("%ld bytes written.\r\n", written_bytes);

    sprintf(buf, "Filename : %s\r\n", filename);
    f_write(&fp, (const void*)buf, strlen(buf), (unsigned int*)&written_bytes);
    printf("%ld bytes written.\r\n", written_bytes);

    sprintf(buf, "Tick : %ld\r\n", HAL_GetTick());
    f_write(&fp, (const void*)buf, strlen(buf), (unsigned int*)&written_bytes);
    printf("%ld bytes written.\r\n", written_bytes);

    f_close(&fp);
  }else{
  	printf("[ERROR] f_open failed (%d)\r\n", (int)res);
  }
}
/* USER CODE END 0 */

/* USER CODE BEGIN 2 */
DSTATUS stat;
if((stat = disk_initialize((BYTE) 0)) != RES_OK){
  printf("[ERROR] disk init error (stat:%d)\r\n", stat);
  Error_Handler();
}

f_mount(&fs, "", 1);
create_test_file("test.txt");
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */


MicroSD 카드를 꽂은 후 위 소스를 빌드하여 실행해 봅니다.
정상적으로 파일일 생성되면 "??? bytes written." 이라는 3개의 메시지가 나옵니다.
메시지 확인이 되면 전원을 차단을 후 보드에서 MicroSD를 뽑아 PC에서 읽어 봅니다.
MicroSD 카드에 TEST.TXT라는 파일이 생성되어져 있으며, 메모장으로 읽어보면 create_test_file 함수에서 적은 내용이 입력되어져 있습니다.

MicroSD 카드를 확인하기 위해 매번 꽂았다 뽑았다 하는 것이 불편합니다.
CLI(Command Line Interface)에 FATFS API를 사용하여 USART를 통해 간단히 FS 테스트를 할 수 있도록 구현해 보았습니다. (구현된 사항은 해당 디렉토리의 파일 리스트를 보여주는 기능과 파일 생성, 삭제, 쓰기, 읽기 기능입니다.)

SDMMC와 FATFS를 간단히 테스트 해 보았습니다. 정상적으로 읽기/쓰기가 잘 동작됩니다.

반응형

댓글