본문 바로가기

[ST_MICRO]/STM32H7

STMH7 EVM - USB Mass Storage Host Mode 테스트


STMH7 EVM - USB Mass Storage Host Mode 테스트





STM32H7 EVM 보드에는 USB Host 및 Device를 테스트 할 수 있는 커넥터가 있다.


CubeMX로 USB HOST 모드 설정







USB_HOST 모드설정을 Mass Storage Host Class 로 설정한다.

VBUS 파워 공급을 GPIO로 설정 할 수도 있지만 이번에는 그냥 하드웨어 적으로 Host Mode 고정으로 전원을 강제로 공급하도록 했다.






CubeMX에서  FATFS 설정은 USB Disk로 설정한다.






이렇게 CubeMX 설정으로 마무리 하여 코드를 생성하면 대부분 자동으로 생성이 된다.

생성된 코드에서 수정 할 부분을 usb_host.c 파일의 USBH_UserProcess() 함수에 추가하면 된다.


main 함수에서 주기적으로 수행하면서 처리되는 함수 인데 테스트를 위해 HOST_USER_CLASS_ACTIVE 이벤트에서 디렉토리 내용을 출력하도록 했다.

static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)
{
  /* USER CODE BEGIN CALL_BACK_1 */
  switch(id)
  {
         case HOST_USER_SELECT_CONFIGURATION:
                printf("CONFIGURATION\r\n");
                break;
         case HOST_USER_DISCONNECTION:
                Appli_state = APPLICATION_DISCONNECT;
 
                printf("DISCONNECTION\t\n");
                break;
         case HOST_USER_CLASS_ACTIVE:
                Appli_state = APPLICATION_READY;
                printf("APPLICATION_READY\r\n");

                f_opendir_scan_usb();
                break;
         case HOST_USER_CONNECTION:
                Appli_state = APPLICATION_START;
                printf("CONNECTION\r\n");
                break;
  default:
  break;
  }
  /* USER CODE END CALL_BACK_1 */

}




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

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

}


테스트 해 보면 STM32H7 EVM 보드에 USB 메모리 스틱을 연결하면 인식해서 메모리 스틱의 파일 목록을 보여 주고 있다.




반응형