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에서 동시에 로드해서 파일 목록을 출력 하는것을 확인 할 수 있다.
반응형