본문 바로가기
Embedded Program

VCP (Virtual COM Port) TX 구현(STM32F407x)

by rlawnsghtest 2025. 4. 25.

오늘은 집에서 놀고 있는 STM32F407VG-DISC1 보드로 USB Virtual COM Port (VCP) 를 구현해서 PC(Tera Term) 과 통신하는 과정을 처음부터 차근차근 정확하게 안내해드릴게요.

1. 개요

STM32F407 보드는 USB Full-Speed Device 컨트롤러가 내장되어 있습니다.
이걸 이용해서 PC에 "가상 COM포트(USB CDC)" 장치처럼 보이게 만들 수 있어요.

즉, USB 케이블 하나로 MCU와 PC를 UART처럼 통신할 수 있게 됩니다.

※ CDC: Communication Device Class = USB를 통해 시리얼 포트처럼 통신하는 USB 표준

 

2. 준비물

  • STM32F407VG-DISC1 보드 (집에서 놀고 있는...)
  • USB Micro-B 케이블 (보드 연결용)
  • STM32CubeIDE (개발 툴)
  • Tera Term (PC 통신용 터미널 프로그램)
  • Windows 드라이버 (필요시 자동 설치 또는 STM 드라이버 수동 설치)

3. 연결 방식

STM32F407 보드는 기본적으로 2개의 USB 커넥터가 있습니다.

  • CN1: ST-LINK용 (디버그용 USB, 통신 아님)
  • CN5: USB OTG FS 포트 (이걸 사용해야 해요)

CN5 (USB_OTG_FS) 단자에 USB 케이블 연결할 겁니다.
이걸로 Virtual COM 통신을 합니다.

4. CubeIDE 프로젝트 생성

STM32CubeIDE 실행
② [File] → [New] → [STM32 Project] 클릭
③ Board Selector 에서 "STM32F407VG-DISC1" 입력하고 선택
④ 프로젝트 이름 설정하고 [Finish]

✅ 여기까지 하면 기본 프로젝트가 하나 만들어집니다.

 

5. CubeMX 설정 (USB 설정)

CubeMX 화면에서 핀 설정 및 미들웨어 추가해줄게요.

[핀이름 설정]

  • USB_OTG_FS 모듈을 Device Only 모드로 활성화해야 해요.

CubeMX 좌측 트리에서

  • "Connectivity" → "USB_OTG_FS" → 모드 선택: Device_Only

[Middleware 설정]

  • "Middleware" → "USB_Device" 활성화 → "Communication Device Class (CDC)" 선택

 

✅ 이렇게 하면, 자동으로 필요한 USB Stack이 추가됩니다.

참고: USB FS PHY는 내부 PHY 사용합니다. 외부 PHY 필요 없음.

 

6. Clock 설정

USB는 정확한 48MHz 클럭이 필수입니다.
CubeMX에서 Clock Configuration 들어가서:

  • HSE (외부 크리스탈 8MHz) 사용
  • PLL 세팅해서 USB Clock 48MHz가 나오게 조정

(보통 STM32F4 Discovery 보드는 HSE가 기본으로 설정되어 있고, 별 조정 필요 없을 수도 있어요.)

 

7. 생성된 코드 확인

이제 [Project Manager] 탭에서 코드 생성 후 열기.

중요한 기본 함수들:

  • MX_USB_DEVICE_Init() → USB 디바이스 초기화
  • CDC_Transmit_FS() → 데이터 송신 함수 (PC로 데이터 보낼 때 사용)

CubeIDE에서 자동으로 USB CDC 예제 코드를 넣어줍니다.

 

8. 코드 수정 (통신 테스트용)

usb_device.c 파일에서 USB 초기화 코드가 이미 되어 있습니다.
이제 메인루프에서 간단한 테스트 코드를 추가할게요.

 

main.c 파일 수정:

     
#include "usb_device.h"
#include "usbd_cdc_if.h"  // CDC 함수 사용하려고 필요

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_USB_DEVICE_Init();

  while (1)
  {
    char msg[] = "Hello PC via USB CDC\r\n";
    CDC_Transmit_FS((uint8_t*)msg, strlen(msg));  // PC로 데이터 전송
    HAL_Delay(1000); // 1초마다 전송
  }
}

 

✅ 이렇게 하면 MCU가 USB를 통해 1초마다 PC로 "Hello PC via USB CDC"를 보내게 됩니다.

 

9. PC 연결 (Tera Term)

  1. STM32F407 보드에 CN1 USB 포트로 연결
  2. Windows에 자동으로 STM32 Virtual COM Port Driver가 설치됨
    • 장치관리자에서 COM 포트 추가된 것 확인
    • (혹시 자동설치 안되면 수동으로 STM 드라이버 설치 가능)
  3. Tera Term 실행
  4. Serial → 새로 생긴 COM포트 선택
  5. 통신속도는 USB CDC라서 아무거나 괜찮지만 기본 115200bps 추천

화면에 1초마다 "Hello PC via USB CDC" 메시지가 올라오는 걸 확인할 수 있어요!

10. 정리

✅ 요약해서 전체 순서:

순서내용
1 STM32F407VG-DISC1 보드 준비
2 CN1 USB 포트 사용
3 CubeIDE 프로젝트 생성
4 USB_OTG_FS를 Device_Only로 설정
5 Middleware → USB Device (CDC) 추가
6 Clock 설정 확인 (USB 48MHz)
7 코드 생성 후 CDC_Transmit_FS() 사용
8 PC에 USB 연결 → Tera Term으로 통신 확인

자, 성공 했나?

다음 포스팅은 tera term에서 입력을 받아서 다시 출력하는 echo 기능을 설명할께요.