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

  • Plik .bin należy najpierw „opakować” w kontener DFU (dodać nagłówek i sufiks) – np. narzędziami DfuFileMgr.exe lub dfu-convert, a dopiero potem użyć dfu-suffix.exe, aby dopisać VID/PID.
  • Następnie uruchamiasz STM32 w trybie systemowego bootloadera USB-DFU (BOOT0 = 1), sprawdzasz połączenie (dfu-util -l) i wgrywasz przygotowany plik (dfu-util -a 0 -s 0x08000000:leave -D plik.dfu).
  • Po skończeniu kasujesz BOOT0, resetujesz układ i bootloader startuje z flash.

Kluczowe punkty
.bin.dfu (nagłówek + dane) → dfu-suffix.exe (sufiks VID/PID)
• STM32 VID: 0x0483, PID: 0xDF11 (fabryczny USB-DFU)
• Programowanie przez dfu-util lub STM32CubeProgrammer (GUI/CLI)


Szczegółowa analiza problemu

1. Rola poszczególnych formatów i narzędzi

1.1 Plik .bin – czysty ciąg bajtów bez informacji o adresie, identyfikacji czy wielkości.
1.2 Format .dfu – zawiera:
 • nagłówek (adres docelowy, długość, alt-setting)
 • sekcję danych
 • sufiks (VID, PID, DFU version, CRC-32)
1.3 dfu-suffix.exe – DOPISUJE wyłącznie 16-bajtową stopkę (VID, PID, DFU-ver, CRC). Nie konwertuje .bin do .dfu.
1.4 Konwersję wykonuje:
 • DfuFileMgr.exe (część pakietu STSW-STM32080/DfuSe) – GUI, Windows
 • dfu-convert (skrypt Pythona dfu-util) – CLI, cross-platform
 • STM32CubeProgrammer (GUI/CLI) – potrafi wgrać surowy .bin, omijając etap konwersji.

2. Procedura „krok po kroku” (Windows, dfu-util 0.11)

Katalog roboczy: C:\DFU

KROK 0 – wymagane pakiety
• dfu-util-0.11-win64 (w tym dfu-suffix.exe)
• STSW-STM32080 (DfuSe) lub STM32CubeProgrammer ≥2.15
• Zadig (sterownik WinUSB)

KROK 1 – przygotowanie pliku .dfu

# zakładamy, że bootloader.bin jest skompilowany pod adres 0x08000000
DfuFileMgr.exe
[I want to generate DFU from BIN] → BootAddr: 0x08000000
wynik: bootloader.dfu

lub w konsoli (python):

dfu-convert -O 0x08000000 -o bootloader.dfu bootloader.bin

KROK 2 – dodanie sufiksu DFU

dfu-suffix.exe -v 0483 -p DF11 -a bootloader.dfu

(-a = append). Narzędzie automatycznie przelicza CRC.

KROK 3 – wejście w tryb DFU

BOOT0 → 3V3, BOOT1/GND → 0V
RESET lub Power-On

Windows wyświetli ‘STM32 BOOTLOADER’. Jeśli system nie ma sterownika:
Zadig → List All Devices → STM32 BOOTLOADER → WinUSB → Install.

KROK 4 – weryfikacja połączenia

dfu-util -l
Found DFU: [0483:df11] ...

KROK 5 – wgranie bootloadera

dfu-util -a 0 -s 0x08000000:leave -D bootloader.dfu

leave powoduje wyjście z DFU po zapisie. Pasek postępu 100 %.

KROK 6 – uruchomienie aplikacji
BOOT0 = 0 → RESET. Bootloader startuje z flash pod 0x08000000.

3. Co, jeśli chcesz użyć tylko .bin?

STM32CubeProgrammer (GUI lub CLI) akceptuje surowy .bin, dlatego alternatywny, prostszy scenariusz to:

STM32_Programmer_CLI.exe -c port=USB1 -el
STM32_Programmer_CLI.exe -c port=USB1 -d bootloader.bin 0x08000000 --verify

Konwersja do .dfu nie jest wtedy potrzebna.

4. Teoretyczne podstawy – mapowanie pamięci

Flash w większości STM32 F / L zaczyna się od 0x08000000 i jest podzielony na strony (1–2 kB). Fabryczny ROM-bootloader USB mieszka w adresach 0x1FFF xxxx. Użytkownik nadpisuje wyłącznie Flash.
Warunek poprawnego startu: w wektorze reset (pierwsze 8 B flash) musi znajdować się:
\[ \text{SP}{\text{init}} = \text{addr}{\text{RAM}}(top) ,\quad \text{ResetHandler} = \text{main()} \]


Aktualne informacje i trendy

• STMicroelectronics od 2023 r. promuje STM32CubeProgrammer jako jedyne oficjalne narzędzie – pakiet DfuSe przestał być aktualizowany.
• dfu-util 0.11 dodaje obsługę USB 3.2 oraz poprawia transfery >1 MiB.
• ROS-DFU, TinyUSB i MCUboot integrują DFU z protokołami „over-air” (BLE, Wi-Fi, USB-C).
• Coraz więcej projektów wykorzystuje bezpieczne bootloadery (SB-signed) – sam plik .dfu bywa podpisywany SHA-256 + ECDSA.


Wspierające wyjaśnienia i detale

dfu-suffix.exe -c plik.dfu – weryfikuje CRC i wyświetla VID/PID.
• Alternative interfaces (-a) widoczne w dfu-util -l mogą wskazywać OTP/OB/Feature; do Flash używamy alt 0.
• Jeśli Flash jest chroniony (ROP Level 1), dfu-util -s :unprotect lub CubeProgrammer → OptionBytes → RDP=AA.


Aspekty etyczne i prawne

• VID 0x0483 jest własnością ST – używaj go wyłącznie do komunikacji z fabrycznym bootloaderem; do własnych urządzeń wymagany jest osobisty VID (USB-IF) lub sublicencja.
• Zwróć uwagę na licencje GPL (dfu-util) i ST-EULA (CubeProgrammer).
• Bezpieczeństwo: niepublikowany bootloader → ryzyko reverse-engineeringu; rozważ szyfrowanie i bezpieczny update (SBW).


Praktyczne wskazówki

• Dodaj regułę Makefile:

%.dfu: %.bin
    dfu-convert -O 0x08000000 -o $@ $<
    dfu-suffix -v 0483 -p DF11 -a $@

• Dla produkcji stosuj --softreset zamiast leave, aby wymusić restart.
• Test integralności po flashu: dfu-util -a 0 -U verify.bin + porównanie CRC32.


Ewentualne zastrzeżenia lub uwagi dodatkowe

dfu-suffix.exe nie działa na plikach >4 GiB (32-bit CRC).
• Na STM32F7/H7 domyślny bootloader USB jest wolniejszy (Full-Speed) – rozważ HS-USB z własnym BL.
• DfuSe (GUI) nie jest wspierane na Windows 11 – czasem wymaga trybu zgodności.


Sugestie dalszych badań

• Integracja z MCUboot + TinyUSB (USB-DFU-class) – umożliwia podpisywanie obrazów.
• Aktualizacja w polu (FOTA + DFU over BLE) – Nordic/Zephyr.
• Analiza AN2606 (Bootloader AN) dla konkretnego wariantu STM32 – dokładne mapy alt-setting.


Krótkie podsumowanie

Aby wgrać bootloader .bin przez USB DFU: konwertujesz plik do formatu .dfu, dopisujesz sufiks VID/PID (dfu-suffix.exe), uruchamiasz STM32 w trybie bootloadera (BOOT0 = 1), sprawdzasz połączenie (dfu-util -l) i flashujesz (dfu-util -a0 -s0x08000000:leave -D plik.dfu). Alternatywnie użyj STM32CubeProgrammer, który przyjmie surowy .bin. Kluczowe są poprawny adres flash, sterowniki WinUSB oraz weryfikacja CRC sufiksu DFU.

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.