본문 바로가기

[ST_MICRO]/STM32H7

STM32H7 EVM - USB 메모리 스틱, SD Card 동시 테스트





STM32 EVM 보드의 USB와 SD Card 를 동시에 제어해서 2개의 드라이버 제어를 해 보았다.

STM32 CubeMX에서 FATFS설정을 SD Card와 USB Disk 를 동시에 체크하면 된다. 그리고 VOLUME이 2개로 자동 설정되어 있다.






CubeMX 자동 생성된 코드에서 fatfs.c 파일의 MX_FATFS_Init() 함수를 보면 SD Card와 USB가 동시에 Link되어 있는것을 확인 할 수 있다. 여기서 드라이버 순서를 수정하면 되겠다.

uint8_t retSD;    /* Return value for SD */
char SDPath[4];   /* SD logical drive path */
FATFS SDFatFS;    /* File system object for SD logical drive */
FIL SDFile;       /* File object for SD */
uint8_t retUSBH;    /* Return value for USBH */
char USBHPath[4];   /* USBH logical drive path */
FATFS USBHFatFS;    /* File system object for USBH logical drive */
FIL USBHFile;       /* File object for USBH */

void MX_FATFS_Init(void)
{
  /*## FatFS: Link the SD driver ###########################*/
  retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
  /*## FatFS: Link the USBH driver ###########################*/
  retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath);
  /* USER CODE BEGIN Init */
  /* additional user code for init */    
  /* USER CODE END Init */

}




주의 할 부분은 드라이버 VOLUME가 2개가 되었기 때문에 드라이버 패스를 지정해 주어야 하는데... 

"0:", "1:"과 같이 패스명을 지정해 주면 된다.


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);
    }
}


void f_opendir_scan_usb(void)
{
    DIR dir;
       FILINFO fno;
    TCHAR path[200] = "1:";

    res = f_mount(&USBDISKFatFs,path,0);
    printf("usb Mount : res f_mount : %d\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("usb Unmount : res f_mount : %d\r\n",res);
    }
}




테스트 결과 STM32에서 USB 메모리 스틱과 SD Card에서 동시에 로드해서 파일 목록을 출력 하는것을 확인 할 수 있다.



반응형