STM32 USB 호스트/디바이스 설정 및 사용법
안녕하세요! 오늘은 STM32F429ZI 보드를 사용하여 USB 호스트/디바이스 기능을 설정하고 사용하는 방법에 대해 알아보겠습니다. 개발 환경은 STM32CubeIDE로 진행할 예정이며, IO 설정부터 USB HID 예제까지 자세히 다루겠습니다. 이번 포스팅을 통해 STM32F429ZI에서 USB를 활용하는 방법을 확실히 이해할 수 있도록 도와드리겠습니다.
1. 프로젝트 생성 및 USB 설정하기
1.1 STM32CubeIDE에서 새 프로젝트 생성
먼저 STM32CubeIDE를 실행하고 새로운 프로젝트를 생성해 주세요.
File
>New
>STM32 Project
를 선택합니다.Target Selection
화면에서STM32F429ZI
를 검색하고 선택합니다.- 프로젝트 이름을 정하고
Finish
를 클릭하여 프로젝트를 생성합니다.
1.2 IO 설정하기 (USB 호스트/디바이스 설정)
프로젝트가 생성되면 Pinout & Configuration
탭에서 IO 설정을 진행합니다. USB 기능을 설정하기 위해 몇 가지 핀을 활성화하고 설정을 변경해야 합니다.
1.2.1 USB OTG FS 핀 설정
STM32F429ZI는 USB OTG Full Speed(OTG FS) 기능을 지원합니다. 이를 활성화하려면 아래의 과정을 따라 주세요:
Pinout & Configuration
탭에서Connectivity
카테고리로 이동합니다.USB_OTG_FS
를 선택하고,Host_Only
또는Device_Only
를 선택하여 사용할 모드를 정합니다. 이번 예제에서는Device_Only
로 설정합니다.- 이 설정을 하면 자동으로
PA11
(USB_DM)과PA12
(USB_DP) 핀이 활성화됩니다.
1.2.2 외부 크리스탈 설정
USB 통신을 안정적으로 사용하기 위해 외부 크리스탈을 설정해야 합니다.
RCC
(Reset and Clock Control) 설정에서High Speed Clock (HSE)
를Crystal/Ceramic Resonator
로 설정합니다.
이제 기본적인 USB 핀 설정이 완료되었습니다. 다음 단계에서는 USB 미들웨어를 추가하고 설정하는 방법에 대해 알아보겠습니다.
2. USB 미들웨어 설정하기
2.1 USB Device 미들웨어 추가
USB 기능을 사용하기 위해서는 USB 미들웨어를 설정해야 합니다. STM32CubeIDE에서는 이를 간편하게 설정할 수 있습니다.
Middleware
탭에서USB_DEVICE
를 클릭하여 활성화합니다.Class For FS IP
에서Human Interface Device (HID)
를 선택합니다.
이 설정을 통해 USB 장치를 HID로 인식할 수 있게 됩니다. HID 클래스는 키보드, 마우스와 같은 기본적인 USB 장치를 구현하는 데 사용됩니다.
2.2 Clock Configuration 설정
USB가 제대로 동작하려면 정확한 클럭 설정이 필요합니다.
Clock Configuration
탭으로 이동합니다.HCLK
를 180MHz로 설정하고,PLLCLK
설정에서 USB를 위한 48MHz 클럭을 확인합니다.
클럭 설정이 완료되면 코드 생성을 통해 기본 코드를 생성할 수 있습니다.
3. 코드 생성 및 USB HID 예제 작성
3.1 코드 생성하기
모든 설정이 완료되면 Project
> Generate Code
를 클릭하여 코드를 생성합니다. 생성된 코드에는 USB 디바이스 초기화 코드와 기본 설정이 포함되어 있습니다.
3.2 USB HID 초기화 코드 살펴보기
코드가 생성되면 usb_device.c
파일에서 USB 초기화 코드를 확인할 수 있습니다.
void MX_USB_DEVICE_Init(void)
{
/* Init Device Library, Add Supported Class and Start the library */
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID);
USBD_Start(&hUsbDeviceFS);
}
이 함수는 USB 디바이스를 초기화하고 HID 클래스를 등록하며 USB 통신을 시작합니다.
3.3 USB HID 데이터 전송 예제
HID 장치를 통해 데이터를 전송하는 간단한 예제를 작성해 보겠습니다. 이번 예제에서는 버튼을 눌렀을 때 PC로 데이터를 전송하는 기능을 구현합니다.
3.3.1 버튼 핀 설정
버튼 입력을 받기 위해 추가적인 핀 설정이 필요합니다.
Pinout & Configuration
탭에서PC13
핀을GPIO_Input
으로 설정합니다.PC13
은 보드에 있는 사용자 버튼(USER 버튼)과 연결되어 있습니다.
3.3.2 HID 데이터 전송 코드
이제 버튼을 눌렀을 때 USB를 통해 데이터를 전송하는 코드를 작성하겠습니다.
usbd_hid.c
파일에 사용자 정의 함수를 추가합니다.
#include "usbd_hid.h"
void Send_HID_Report(uint8_t *report, uint16_t len)
{
USBD_HID_SendReport(&hUsbDeviceFS, report, len);
}
그리고 main.c
파일에서 버튼 입력을 감지하고 HID 데이터를 전송하는 코드를 추가합니다.
#include "usb_device.h"
uint8_t HID_Buffer[4];
int main(void)
{
/* MCU Configuration */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
while (1)
{
/* Check if the button is pressed */
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET)
{
/* Prepare HID report */
HID_Buffer[0] = 0x01; // Report ID
HID_Buffer[1] = 0x00; // Padding
HID_Buffer[2] = 0x01; // X movement (example)
HID_Buffer[3] = 0x00; // Y movement (example)
/* Send HID report */
Send_HID_Report(HID_Buffer, sizeof(HID_Buffer));
/* Debounce delay */
HAL_Delay(200);
}
}
}
위 코드는 버튼을 누르면 HID 데이터를 PC로 전송하는 예제입니다. HID_Buffer
배열에 전송할 데이터를 채운 후 Send_HID_Report
함수를 호출하여 데이터를 전송합니다.
4. USB 디버깅 및 테스트
USB HID 예제가 정상적으로 동작하는지 확인하기 위해서는 PC와 STM32 보드를 USB 케이블로 연결하고, PC에서 장치 관리자(Device Manager)를 통해 장치가 인식되었는지 확인합니다. HID 장치는 별도의 드라이버 없이 기본적으로 인식되므로, 장치 관리자에 HID-compliant device
로 표시됩니다.
또한, USB 데이터 전송이 잘 이루어지는지 확인하기 위해서는 HID 테스트 프로그램(예: HID Terminal
또는 USBlyzer
)을 사용할 수 있습니다. 이 프로그램을 사용하여 STM32 보드가 전송하는 데이터를 실시간으로 확인할 수 있습니다.
5. 마무리
이번 포스팅에서는 STM32F429ZI 보드를 사용하여 USB 호스트/디바이스 기능을 설정하고, HID 예제를 통해 데이터를 전송하는 방법에 대해 알아보았습니다. STM32CubeIDE를 사용하여 간편하게 IO와 미들웨어를 설정하고, USB 디바이스로 활용할 수 있는 기본적인 예제를 구현해 보았습니다.
USB는 임베디드 시스템에서 매우 중요한 인터페이스 중 하나이며, HID는 그중에서도 쉽게 사용할 수 있는 클래스입니다. 앞으로 더 다양한 USB 클래스(예: CDC, MSC 등)를 활용하여 더욱 흥미로운 프로젝트를 만들어 보시기 바랍니다.
'STM32' 카테고리의 다른 글
STM32F429 보드의 LCD 제어 및 그래픽 라이브러리 활용 (0) | 2024.12.02 |
---|---|
STM32F429ZI Ethernet 설정 및 간단한 HTTP 서버 구현하기 (0) | 2024.12.01 |
STM32 FreeRTOS - 실시간 운영체제 프로젝트 가이드 (0) | 2024.11.29 |
STM32 인터럽트와 EXTI 설정 (0) | 2024.11.28 |
STM32 아날로그 신호 출력 DAC 설정하기 (0) | 2024.11.27 |