STM32 USB포트를 이용해서 UART 통신을 하기 위해서는 아래와 같이 OTG_FS 포트를 사용한다.
필요한 포트는 OTG_FS_DP/DM으로써 USB 포트를 통해 데이터를 송수신하는데 사용된다.
STM32F103 은 DP신호선에 Pull-Up register 필수임.
USB_PU는 GPIO 중 하나를 사용하면 된다. PC에서 해당 디바이스를 Serail Port로 인식할 수 있게 해준다.
디바이스 시작시 USB_PU GPIO 포트를 HIGH로 설정한다.
STM32CubeMX에서 PA11, PA12를 각각 USB_OTG_FS_DP/DM으로 설정한다.
Middleware에서 USB_DEVICE를 선택하고 Class For FS IP를 Communication Device Class(Virtual Port Com)을 선택하고 나머지는 기본값을 사용한다.
System Core에서 GPIO를 선택하고 USB가 정확하게 선택되었는지 확인한다.
USB 를 사용하기 위해서는 RCC의 High Speed Clock을 설정해주어야 한다.
Clock Configuration를 선택한 후 USB port에 48MHz 가 설정되도록 수정한다. 이때 다른 Prescaler, Mux 값을 변경하면 다른 Clock도 변경되기 때문에 주의한다.
USB_PU 포트 설정을 확인하다. 기본적으로 GPIO Output으로 설정하고 기본값은 High 를 선택한다.
설정이 모두 완료되면 Generate Code를 실행하고 Source code를 생성한다. 새롭게 생성된 코드는 이전에 있는 코드를 대체하기 때문에 이전에 작업했던 내용은 백업을 해두는 것이 좋다. 생성된 코드는 Middlewares 아래 USB Device Library와 USB_DEVICE/App이 생성된다. 여기서 주로 사용하는 파일은 usbd_cdc_if.c 파일이다.
데이터 송수신을 아래의 두 함수 CDC_Receive_FS, CDC_Transmit_FS 에서 이루어진다.
CDC_Receive_FS는 PC(master) 에서 DEVICE(stm32)로 데이터를 수신하는 기능을 담당하고, CDC_Transmit_FS는 DEVICE(stm32)에서 PC(master)로 데이터를 보내는 기능을 담당한다.
현제로서는 USART_1을 사용해야지 PC에서 자동으로 디바이스를 인식하고 나머지 USART_2~3, UART_4~5을 사용하면 인식되지 않는 문제
USB_CDC만 사용하고 USART_1을 사용하지 않으면 인식되지 않음
USB_CDC는 USART_1을 remapping해서 Virtual CDC를 구현하기 때문에 USART_1을 설정해 주어야하고 사용하면 안됨..
참고할 만한 사이트들...
https://pcbartists.com/firmware/stm32-firmware/stm32-usb-device-not-recognized-solution/