사용 MCU: STM32F103VCT
안녕하세요.
STM32F103에 있는 USB IP중 CDC(Communication Device Class)를 CubeMX로 적용하는 방법에 대해 알아봅시다.
CDC를 사용하면 Uart 핀에 Uart To Serial 모듈을 따로 쓰지 않고 바로 USB를 통해 컴퓨터와 통신 할 수 있다는 장점이 있습니다.
제가 가지고 있는 보드의 USB 회로는 아래와 같습니다.
컴퓨터에서 USB를 인식하려면 PA1 핀이 High 상태로 있어야 합니다.
USB in a NutShell - Chapter 2 - Hardware (beyondlogic.org)
PA11과 PA12에 연결된 저항은 22옴이 사용되었습니다.
CubeMX를 실행 시켜
Connectivity > USB 메뉴에 Device(FS)를 체크해줍니다.
그러면 아래 처럼 USB_DP 핀과 USB_DM핀이 활성화 될 것입니다.
Middleware > USB_DEVICE 메뉴로 가서 Class For FS IP를 Communication Device Class (Virtual Port Com)을 선택해주고 GENERATE CODE를 해줍니다.
Device Descriptor 탭으로 가면 아래 화면처럼 설정되어 있습니다.
VID는 Vendor ID의 약자로 제조사 아이디를 뜻합니다.
디폴트 설정으로 1155로 설정되어있는데
모든 VID는 usb.org에서 관리되어 있습니다.
https://usb.org/sites/default/files/vendor_ids051920_0.pdf에서 확인해 보면
1155는 STMicroelectonics라는 것을 확인 할 수 있습니다.
VID를 위 리스트에 없는 숫자로 해도 정상적으로 동작합니다. (15768)
PID는 Product ID 로 제품 ID를 설정해 주는 파라미터입니다.
PA1핀도 Output으로 설정해주고 Generate Code를 해줍니다.
USB 송수신에 관련된 함수는 usbd_cdc_if.c 파일에 있습니다.
// usbd_cdc_if.c
// USB로부터 수신한 데이터가 있을경우 호출되는 함수
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
...
}
// USB로부터 데이터를 송신하기 위한 함수
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
...
}
제가 가지고 있는 보드는 PA1핀을 High로 만들어줘야지 컴퓨터가 USB를 인식한다고 했습니다.
따라서 프로그램이 시작되면 PA1핀을 High로 만들어 주고 printf가 USB를 통해 출력되도록 코드를 수정해줍니다.
/*
1초마다 USB로 "Hello CDC Test\r\n" 출력하기 예제
*/
// USB로 printf를 출력시키기 위한 설정 함수
int _write(int file, char *ptr, int len){
//HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 100);
// USB로 ptr를 출력합니다.
CDC_Transmit_FS(ptr, len);
return (len);
}
int main(void)
{
static uint32_t time = 0;
...
MX_GPIO_Init();
MX_USB_DEVICE_Init();
...
// PA1 Pin High
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
while (1)
{
if (HAL_GetTick() - time > 1000) {
time = HAL_GetTick();
printf("Hello CDC Test\r\n");
}
}
}
프로그램 다운로드를 완료한 후 장치관리자에 보면 아래와 같이 USB 직렬 장치라고 인식이 됩니다.
가지고 있는 시리얼 통신 프로그램으로 COM15에 연결하면 1초마다 Hello CDC Test 라는 메세지가 나타날 것입니다.
'MCU > STM32:HAL' 카테고리의 다른 글
[STM32F]FSMC와 LCD (0) | 2021.02.28 |
---|---|
[STM32F]FSMC로 LCD(SSD1963) 제어하기 (2) | 2021.02.07 |
[STM32F][HAL] USART Interrupt (0) | 2020.12.23 |
[STM32F][HAL] DAC (Digital to Analog Converter) (0) | 2020.12.22 |
[STM32F][HAL] OUTPUT COMPARE 사용하기 (0) | 2020.06.01 |
[STM32F][HAL] HAL_Delay (0) | 2020.05.21 |
[STM32F][HAL] ADC - ADC Calibration (4) | 2020.05.17 |
[STM32F][HAL]GPIO (0) | 2020.05.10 |