STM32

STM32 USB 호스트/디바이스 설정 및 사용법

임베디드 친구 2024. 11. 30. 10:31
728x90
반응형

STM32 USB 호스트/디바이스 설정 및 사용법

안녕하세요! 오늘은 STM32F429ZI 보드를 사용하여 USB 호스트/디바이스 기능을 설정하고 사용하는 방법에 대해 알아보겠습니다. 개발 환경은 STM32CubeIDE로 진행할 예정이며, IO 설정부터 USB HID 예제까지 자세히 다루겠습니다. 이번 포스팅을 통해 STM32F429ZI에서 USB를 활용하는 방법을 확실히 이해할 수 있도록 도와드리겠습니다.

1. 프로젝트 생성 및 USB 설정하기

1.1 STM32CubeIDE에서 새 프로젝트 생성

먼저 STM32CubeIDE를 실행하고 새로운 프로젝트를 생성해 주세요.

  1. File > New > STM32 Project를 선택합니다.
  2. Target Selection 화면에서 STM32F429ZI를 검색하고 선택합니다.
  3. 프로젝트 이름을 정하고 Finish를 클릭하여 프로젝트를 생성합니다.

1.2 IO 설정하기 (USB 호스트/디바이스 설정)

프로젝트가 생성되면 Pinout & Configuration 탭에서 IO 설정을 진행합니다. USB 기능을 설정하기 위해 몇 가지 핀을 활성화하고 설정을 변경해야 합니다.

1.2.1 USB OTG FS 핀 설정

STM32F429ZI는 USB OTG Full Speed(OTG FS) 기능을 지원합니다. 이를 활성화하려면 아래의 과정을 따라 주세요:

  1. Pinout & Configuration 탭에서 Connectivity 카테고리로 이동합니다.
  2. USB_OTG_FS를 선택하고, Host_Only 또는 Device_Only를 선택하여 사용할 모드를 정합니다. 이번 예제에서는 Device_Only로 설정합니다.
  3. 이 설정을 하면 자동으로 PA11 (USB_DM)과 PA12 (USB_DP) 핀이 활성화됩니다.

1.2.2 외부 크리스탈 설정

USB 통신을 안정적으로 사용하기 위해 외부 크리스탈을 설정해야 합니다.

  1. RCC (Reset and Clock Control) 설정에서 High Speed Clock (HSE)Crystal/Ceramic Resonator로 설정합니다.

이제 기본적인 USB 핀 설정이 완료되었습니다. 다음 단계에서는 USB 미들웨어를 추가하고 설정하는 방법에 대해 알아보겠습니다.

2. USB 미들웨어 설정하기

2.1 USB Device 미들웨어 추가

USB 기능을 사용하기 위해서는 USB 미들웨어를 설정해야 합니다. STM32CubeIDE에서는 이를 간편하게 설정할 수 있습니다.

  1. Middleware 탭에서 USB_DEVICE를 클릭하여 활성화합니다.
  2. Class For FS IP에서 Human Interface Device (HID)를 선택합니다.

이 설정을 통해 USB 장치를 HID로 인식할 수 있게 됩니다. HID 클래스는 키보드, 마우스와 같은 기본적인 USB 장치를 구현하는 데 사용됩니다.

2.2 Clock Configuration 설정

USB가 제대로 동작하려면 정확한 클럭 설정이 필요합니다.

  1. Clock Configuration 탭으로 이동합니다.
  2. 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 버튼 핀 설정

버튼 입력을 받기 위해 추가적인 핀 설정이 필요합니다.

  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 등)를 활용하여 더욱 흥미로운 프로젝트를 만들어 보시기 바랍니다.

728x90
반응형