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:
- ustaw pin BOOT0 = 1, BOOT1 = 0 (poprzez jumper lub kod),
- zasil układ – mikrokontroler wystartuje z pamięci systemowej (bootloader),
- 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ą:
- uruchom DfuSe Demo,
- kliknij „Upgrade” i wybierz plik .dfu,
- potwierdź ostrzeżenie o braku weryfikacji VID/PID,
- 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ą.