Mikrokontrolery STM32 oferują zaawansowaną obsługę komunikacji USB, umożliwiając implementację urządzeń peryferyjnych takich jak pamięci masowe, interfejsy HID czy DFU, co jest kluczowe w projektach robotycznych i elektronicznych wymagających szybkiej wymiany danych z komputerem.

Wstęp do USB w rodzinie STM32

Rodzina mikrokontrolerów STM32 od STMicroelectronics wyróżnia się zintegrowanymi peryferiami USB, dostępnymi w różnych seriach jak F1xx (linia Connectivity: STM32F105/107), F2xx, F4xx czy L1xx.

W nowszych modelach dostępne są kontrolery USB 2.0 full-speed (12 Mb/s) oraz high-speed (480 Mb/s), co pozwala na bezpośrednią komunikację bez zewnętrznych układów scalonych.

W robotyce USB służy do debugowania, aktualizacji firmware’u czy przesyłania danych z sensorów (np. akcelerometrów po I2C) z jednoczesnym tunelowaniem przez USB.

Bootloader USB DFU to wbudowany mechanizm w serii Connectivity Line (STM32F105/F107), umożliwiający programowanie pamięci Flash bez dedykowanego programatora JTAG/SWD. Działa w standardzie Device Firmware Upgrade (DFU), ułatwiając bezpieczne aktualizacje oprogramowania.

Tryby pracy interfejsu USB w STM32

STM32 obsługuje USB jako urządzenie peryferyjne (device) lub w niektórych modelach jako host. Najpopularniejsze klasy to:

  • DFU – do programowania Flash i bajtów opcji;
  • CDC – wirtualny port szeregowy (USB–UART);
  • HID – klawiatury, myszy, joysticki idealne do sterowania robotami;
  • MSC – pamięć masowa USB;
  • Custom – niestandardowe protokoły, np. do przesyłania danych telemetrycznych z robota.

W serii STM32F107 bootloader wspiera kanały UART, CAN i USB DFU z fabryki, co upraszcza inicjalne programowanie.

Aktywacja trybu bootloadera USB DFU

Poniżej opis uruchomienia bootloadera USB w STM32F105/F107:

  1. ustaw pin BOOT0 = 1, BOOT1 = 0 (poprzez jumper lub kod),
  2. zasil układ – mikrokontroler wystartuje z pamięci systemowej (bootloader),
  3. podłącz przez USB (kabel typu A–B) do komputera.

System Windows wykryje urządzenie DFU i zainstaluje sterownik. Pobierz narzędzie DfuSe Demonstration od STMicroelectronics – zawiera sterownik i aplikację do flashowania.

W oknie DfuSe urządzenie pojawi się jako „STM Device in DFU mode” z VID/PID (np. STM32F107VBT6); dostępne obszary obejmują „Internal Flash” (pamięć główna) i „Option Bytes” (konfiguracja).

Programowanie przez USB DFU – krok po kroku

Do programowania wymagany jest plik .dfu, wygenerowany z HEX/BIN za pomocą DfuFile.exe. Postępuj zgodnie z instrukcją:

  1. uruchom DfuSe Demo,
  2. kliknij „Upgrade” i wybierz plik .dfu,
  3. potwierdź ostrzeżenie o braku weryfikacji VID/PID,
  4. zaczekaj na zakończenie – proces flashowania kończy się komunikatem sukcesu.

Zalety – brak potrzeby programatora sprzętowego jak ST-LINK. Wady – mniejsza wygoda niż SWD; wymaga ręcznej zmiany BOOT0. W robotyce to idealne do aktualizacji firmware’u w terenie.

Poniższa tabela porównuje bootloader DFU i programowanie przez JTAG/SWD:

Aspekt Bootloader USB DFU JTAG/SWD
Wymagany sprzęt Kabel USB Programator (ST-LINK)
Szybkość Wolniejsza Bardzo szybka
Wygoda Średnia (BOOT0) Wysoka
Zastosowanie Aktualizacja w terenie Tworzenie oprogramowania

Implementacja USB device w kodzie – biblioteka ST

Do pełnej obsługi USB (nie tylko bootloader) użyj STM32CubeMX i bibliotek HAL/LL. Gotowe przykłady są dostępne dla Cortex‑M3/M4 (F103, F107, F207, F407, L152), co znacząco skraca czas wdrożenia.

W CubeMX wykonaj podstawową konfigurację zgodnie z poniższymi punktami:

  • włącz peryferium USBOTGFS lub USB_FS,
  • wybierz klasę (np. CDC, HID),
  • skonfiguruj piny: PA11 (D-), PA12 (D+) dla full-speed; dodaj rezystor pull‑up na D+ (1,5 kΩ do 3,3 V),
  • generuj kod – warstwa HAL zainicjalizuje stos USB.

Przykładowy kod inicjalizacji CDC (w uproszczeniu) – wstaw po inicjalizacji GPIO i USB:

// W main.c po MX_GPIO_Init() i MX_USB_DEVICE_Init()
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC, &USBD_CDC_fops);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);

// Callback do transmisji
static int8_t CDC_Transmit_FS(uint8_t *Buf, uint16_t Len) {
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
USBD_CDC_TransmitPacket(&hUsbDeviceFS);
return USBD_OK;
}

// Wysyłanie danych:
char buf[] = "Hello Robot!\n";
CDC_Transmit_FS((uint8_t*)buf, strlen(buf));

To tworzy wirtualny port COM. W robotyce można w ten sposób wysyłać dane z UART (np. z sensorów) przez USB do komputera.

Odbieranie danych – użyj CDC_Receive_FS() w callbacku USBD_CDC_ReceivePacket(), aby obsłużyć napływające pakiety.

USB w praktyce robotycznej i elektronicznej

W projektach robotów USB łączy mikrokontroler z PC do telemetrii i sterowania. Przykładowe zastosowania:

  • przesył danych z sensorów – akcelerometr I2C → USB HID (np. mapowanie na joystick);
  • debugowanie – wirtualny terminal przez CDC;
  • aktualizacje w terenie – bootloader DFU do flashowania bez otwierania obudowy;
  • integracja z STM32 Nucleo – wbudowany ST‑LINK/V2 z USB–UART (piny PA2/PA3 dla USART2).

Zaawansowane – w serii F4xx (STM32F407) moduł USB OTG umożliwia tryb host – obsługę pendrive’ów lub innych MCU.

Pułapki – najczęstsze kwestie, o które warto zadbać:

  • zasilanie – USB dostarcza 5 V; zastosuj stabilizator do 3,3 V dla zasilania MCU,
  • przepustowość – full‑speed zwykle wystarcza w robotyce; HS wykorzystuj dla większych strumieni danych,
  • sterowniki – pod Windows instaluj właściwe sterowniki (np. libusb / STM32 DFU).

Zasoby i dalsze kroki

Do nauki polecam: STM32CubeMX, bibliotekę HAL USB, e‑book „USB dla niewtajemniczonych” z przykładami dla F1–F4 oraz fora (np. Elektroda.pl) do rozwiązywania problemów. Na start w robotyce świetnym wyborem są płytki Nucleo z USB – umożliwiają szybkie prototypowanie bez lutowania.

Porównanie z innymi interfejsami

Poniższe zestawienie ułatwia dobór interfejsu do konkretnego zastosowania:

Interfejs Prędkość Dwukierunkowy Zastosowanie w robotyce
USB 12/480 Mb/s Tak Dane, programowanie
UART Do 115 kb/s Tak (Tx/Rx) Debugowanie przez konwerter
CAN 1 Mb/s Tak Sieci robotów

UART wymaga konwertera USB–UART (np. CP2102), ale jest prostszy w implementacji; USB przewyższa go prędkością i uniwersalnością.