STM32 bootloader USB DFU – wgrywanie .bin przez dfu-suffix.exe, DfuFileMgr, dfu-util

Pytanie

wgrywanie bootloadera za pomocą pliku .bin i dfu-suffix.exe poprzez usb

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Najprościej: pozostaw plik jako .bin, dołącz sufiks DFU tylko dla walidacji (VID/PID), a adres zapisu podaj w dfu-util.
  • Komendy (Windows/Linux/macOS):
    • Dodanie sufiksu DFU do pliku BIN:
      • Windows: dfu-suffix.exe -v 0x0483 -p 0xDF11 -d 0x0000 -a bootloader.bin
      • Sprawdzenie: dfu-suffix.exe -c bootloader.bin
    • Wejście układu w tryb DFU, sprawdzenie połączenia: dfu-util -l
    • Programowanie do początkowego adresu Flash (przykładowo 0x08000000) i restart:
      • dfu-util -a 0 -s 0x08000000:leave -D bootloader.bin
  • Kluczowe punkty:
    • dfu-suffix NIE ustawia adresu zapisu; robi to dfu-util (przez -s).
    • VID/PID 0x0483/0xDF11 dotyczą systemowego bootloadera ST w ROM; dla własnych bootloaderów użyj własnego VID/PID.
    • Nie wszystkie STM32 mają USB DFU w ROM (np. większość STM32F103 – tylko UART/CAN). USB DFU zadziała tam dopiero po wgraniu własnego bootloadera.

Szczegółowa analiza problemu

  • Rola narzędzi:
    • dfu-suffix: dokleja na końcu pliku tzw. DFU suffix (pola: bcdDFU, idVendor, idProduct, bcdDevice, CRC32). To pomaga narzędziom zweryfikować, że plik pasuje do wskazanego urządzenia. Nie zawiera informacji o adresie zapisu.
    • dfu-util: realizuje transfer DFU. Dla surowego .bin wymagany jest adres docelowy (-s 0x08000000[:leave]). Może też wgrywać pliki .dfu (z „prefixem”), ale nie jest to konieczne.
  • Dwa poprawne przepływy pracy:
    1. „Lekki” (zalecany): .bin + dfu-suffix (opcjonalnie) + dfu-util z adresem
      • Zalety: prosty, przenośny, bez konstrukcji .dfu.
      • Kroki: dfu-suffix … -a bootloader.bin → dfu-util -l → dfu-util -a 0 -s 0x08000000:leave -D bootloader.bin.
    2. „Pełny” (gdy potrzebny format pliku DFU): konwersja .bin → .dfu (np. narzędziem DfuFileMgr/DfuSe lub dfu-prefix), następnie dfu-util -D plik.dfu (adres bywa osadzony w pliku .dfu).
  • Adresowanie i linkowanie:
    • Jeżeli bootloader ma rezydować „na początku” Flash, zwykle linkuje się go pod 0x08000000.
    • Jeśli bootloader zajmuje np. 16 kB, a aplikacja ma startować wyżej (np. 0x08004000), to:
      • bootloader pod 0x08000000,
      • aplikacja linkowana pod 0x08004000 i z poprawnie relokowaną tablicą wektorów (SCB->VTOR).
  • Warianty sprzętowe i wejście w DFU:
    • Klasyczne serie (np. wiele STM32F4/L4/H7/G4): BOOT0=1, reset → systemowy bootloader w ROM startuje i zwykle zgłasza się jako 0483:DF11.
    • Uwaga na wyjątki: wiele STM32F103 nie ma USB DFU w ROM (tylko UART/CAN). Aby programować przez USB DFU, trzeba najpierw inną metodą wgrać bootloader USB (np. Maple/dapboot) albo użyć ST-LINK/SWD.
    • W nowszych rodzinach tryb rozruchu może zależeć także od opcji nBOOT0/nBOOT1 w Option Bytes (wejście w system memory bez fizycznego BOOT0).
  • Sterowniki i wykrywanie:
    • Windows: dla dfu-util potrzebny sterownik WinUSB/libusb (Zadig → „STM32 BOOTLOADER” → WinUSB).
    • Linux/macOS: zwykle działa bez dodatkowych sterowników; na Linuksie ewentualnie reguły udev, aby nie używać sudo.
    • Weryfikacja: dfu-util -l powinien pokazać wpis z alt=… (np. „@Internal Flash /0x08000000/…”). To ułatwia potwierdzenie adresu.
  • Ochrony i kasowanie:
    • Jeśli włączone RDP/WRP (Option Bytes), zapis może się nie powieść. Wyłącz/odblokuj w STM32CubeProgrammer przez ST-LINK.
    • Masowe kasowanie przez dfu-util jest możliwe w rozszerzeniu „DFUse” (ST); składnia zależy od wersji (np. sufiks „:mass-erase”). Bezpieczniej wykonać erase w STM32CubeProgrammer.

Aktualne informacje i trendy

  • STM32CubeProgrammer jest aktualnym, wspieranym narzędziem ST do programowania także przez USB DFU (następca starego DfuSe). W praktyce bywa wygodniejszy do operacji erase/Option Bytes niż dfu-util.
  • dfu-util pozostaje lekkim, wieloplatformowym narzędziem skryptowalnym; powszechnie używany w CI/CD do OTA po USB i w serwisie.
  • Własne bootloadery DFU (np. oparte o USBX/Azure RTOS, TinyUSB) są standardem w nowych projektach – warto od razu przewidzieć schemat partycjonowania Flash i bezpieczną aktualizację (A/B lub kopia zapasowa + CRC).

Wspierające wyjaśnienia i detale

  • Co dokładnie dokleja dfu-suffix:
    • idVendor (VID), idProduct (PID) – identyfikują rodzinę/produkt,
    • bcdDevice – numer rewizji urządzenia,
    • bcdDFU – wersja specyfikacji DFU,
    • CRC32 – integralność pliku.
  • Dlaczego dfu-suffix nie ustawia adresu:
    • Adres jest potrzebny urządzeniu do zapisu we Flash i przekazywany jest poleceniem dfu-util (-s …). Sufiks służy jedynie do weryfikacji pliku po stronie hosta, nie do sterowania programowaniem.
  • Różnica „DFU” vs „DFUse”:
    • DFU to klasa USB (specyfikacja 1.1).
    • DFUse to rozszerzenia ST (m.in. mapy pamięci, masowe kasowanie), które dfu-util częściowo obsługuje; nazewnictwo altsettings zwykle zaczyna się od „@Internal Flash …”.

Aspekty etyczne i prawne

  • VID/PID: nie wolno dystrybuować własnych urządzeń z cudzym VID/PID (0483/DF11), chyba że komunikujesz się wyłącznie z systemowym bootloaderem ST w ROM. Dla własnego bootloadera użyj własnego VID/PID (program w trakcie normalnej pracy).
  • Zgodność z licencjami: dfu-util i biblioteki libusb są open source – przestrzegaj ich licencji w produktach komercyjnych.
  • Bezpieczeństwo aktualizacji: rozważ podpisy kryptograficzne/CRC oraz mechanizmy rollback, aby uniknąć „uceglenia” urządzenia.

Praktyczne wskazówki

  • Minimalny, powtarzalny skrypt (Windows .bat):
    • dfu-suffix.exe -v 0x0483 -p 0xDF11 -d 0x0000 -a bootloader.bin
    • dfu-util -l || exit /b 1
    • dfu-util -a 0 -s 0x08000000:leave -D bootloader.bin
  • Minimalny skrypt Bash:
    • dfu-suffix -v 0x0483 -p 0xDF11 -d 0x0000 -a bootloader.bin
    • dfu-util -l
    • dfu-util -a 0 -s 0x08000000:leave -D bootloader.bin
  • Diagnostyka:
    • „No DFU capable USB device available” → sprawdź BOOT0/Option Bytes, kabel/kanał USB, sterowniki (Windows/Zadig), udev (Linux).
    • „File has no DFU suffix” → to ostrzeżenie; można je zignorować lub dodać sufiks dfu-suffix.
    • Błędy zapisu/weryfikacji → sprawdź, czy adres i linkowanie odpowiadają faktycznemu położeniu bootloadera; wyłącz RDP/WRP.
  • Weryfikacja po wgraniu:
    • Odczyt i porównanie: dfu-util -a 0 -s 0x08000000 -U readback.bin, a następnie porównanie binarne (fc /b lub diff -s).

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • STM32F103 („Blue Pill”) zwykle nie ma USB DFU w ROM – nie oczekuj 0483:DF11 bez uprzednio wgranego bootloadera USB. Użyj ST-LINK/SWD lub bootloadera UART do pierwszego wgrania.
  • Masowe kasowanie przez dfu-util (DFUse) bywa zależne od wersji narzędzia/ROM; gdy problematyczne – wykonaj erase w STM32CubeProgrammer przez ST-LINK.
  • Niektóre serie (np. G0, niektóre L0) mogą nie mieć USB FS w ogóle – DFU przez USB nie zadziała sprzętowo.

Sugestie dalszych badań

  • Dokument ST „AN2606” – lista interfejsów bootloadera dla poszczególnych układów i warunków startu.
  • „STM32CubeProgrammer User Manual” – detale erase/Option Bytes/RDP.
  • Specyfikacja „USB Device Firmware Upgrade (DFU) 1.1” – pełny opis formatu, sufiksu i przepływu.
  • Przykładowe implementacje własnych bootloaderów DFU: TinyUSB/Azure RTOS USBX – do przeanalizowania pod kątem aktualizacji w polu.

Krótkie podsumowanie

  • Do wgrania bootloadera przez USB DFU wystarczy .bin + dfu-util; dfu-suffix jest opcjonalny (walidacja VID/PID/CRC) i nie ustawia adresu.
  • Wejdź w tryb DFU (BOOT0/Option Bytes), sprawdź dfu-util -l, następnie dfu-util -a 0 -s 0x08000000:leave -D bootloader.bin.
  • Pamiętaj o różnicach między rodzinami STM32 (nie wszystkie mają USB DFU w ROM) oraz o sterownikach (Windows/WinUSB).
  • Zadbaj o poprawne adresowanie/linkowanie oraz bezpieczeństwo procesu aktualizacji (RDP/WRP, weryfikacja, ewentualny rollback).

Jeśli podasz konkretny model STM32 i log z dfu-util -l, dobiorę dokładny adres/altsetting i doprecyzuję procedurę.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (2min)...