본문 바로가기

[STM32F746G-DISCO] USB CDC로 사용하기 (Device Mode)

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


STM32F746G-DISCO보드를 사용하여 USB Device mode에서 CDC(Communication Device Class) 테스트를 해 보았습니다. 윈도우 PC와 STM32F746G-DISCO보드를 USB로 연결 후 가상의 COM 포트(Virtual COM Port)를 이용하여 USB-to-RS232 브릿지로 동작시키는 것을 말합니다. 간단히 pc에서 uart를 사용하기 위해 사용하는 usb-to-serial로 이해하시면 쉽게 이해가 가실 겁니다.

STM32F746G-DISCO의 예제에는 CDC_Standalone이 없어서 STM32756G_EVAL의 CDC_Standalone 예제를 참고하여 테스트되었습니다. (예제 위치 : STM32Cube_FW_F7_V1.16.1/Projects/STM32756G_EVAL/Applications/USB_Device/CDC_Standalone)

STM32CubeIDE에서 새 프로젝트를 생성합니다.
초기화 후 RCC/SYS/USART1/USB_DEVICE/USB_OTG_FS만 설정하였습니다.

USB_OTG_FS는 Device모드로 설정하였고 Class를 CDC(Virtual Port Com)으로 설정하였습니다.

제공되는 예제에서 주의 깊게 봐야 하는 파일은 usbd_cdc_interface.c입니다.
이 파일이 실제 PC와 보드 사이의 인터페이스 역할을 해 주는 부분입니다.
다른 함수는 그대로 사용되었으며 간단한 송/수신 loopback 테스트를 위해 CDC_Receive_FS와 CDC_Trasmit_FS 함수만 아래와 같이 변경하였습니다.

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  uint8_t result = USBD_OK;

  if (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) {
    return USBD_FAIL;
  }

  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  CDC_Transmit_FS(Buf, *Len);

  return result;
  /* USER CODE END 6 */
}

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  uint16_t i;
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;

  if(!hcdc)
      return USBD_FAIL;

  if (hcdc->TxState != 0)
    return USBD_BUSY;

  for (i=0; i < sizeof(UserTxBufferFS); i++) {
    UserTxBufferFS[i] = 0;
  }

  for (i=0; i < Len; i++) {
    UserTxBufferFS[i] = Buf[i];
  }

  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */
  return result;
}


실행하기 전에 윈도우 PC에서 Virtual COM Port를 사용하기 위해서는 ST에서 제공되는 driver를 먼저 설치해야 합니다. 아래 사이트에서 다운로드 받습니다.

 

STSW-STM32102 - STMicroelectronics

STSW-STM32102 - STM32 Virtual COM Port Driver, STSW-STM32102, STMicroelectronics

www.st.com

다운로드 받은 en.stsw-stm32102.zip의 압축을 해제 해 보니 제가 받은 버전은 VCP_1.5.0 입니다.

설치가 완료되었으면 코드를 빌드 후 다운로드합니다.
Micro USB 케이블을 CN13(USB_FS) 단자에 꽂으면 윈도우 PC상에 가상 COM 포트가 새로 생성됩니다.
(CubeIDE에서 다운로드에 사용되는 COM4 외에 Virtual COM Port로 COM6이 생성되었습니다.)


UART 프로그램으로 테스트를 해 봅니다. COM6 포트 송/수신이 정상적으로 동작됩니다.

반응형

댓글