DFU (USB Device Firmware Upgrade)
Чтобы прошить микроконтроллер с USB, программатор не обязателен: стандартный класс USB DFU позволяет передать новую прошивку по тому же кабелю, по которому устройство работает. Так прошивают STM32F4 из встроенного загрузчика, клавиатуры, отладчики и многие платы.
Обновлено Редакция GAW
Содержание
DFU (Device Firmware Upgrade) — класс устройств USB для обновления прошивки по USB. Спецификация USB-IF DFU 1.1 описывает, как устройство сообщает о такой возможности, как переходит в режим загрузки, как принимает образ блоками и как запускает новую прошивку (DFU 1.1, разд. 2). Ей пользуются встроенные загрузчики микроконтроллеров, отладчики и клавиатуры.
Как идёт обновление
Спецификация делит процесс на четыре фазы (разд. 2):
- Перечисление. Устройство в обычном режиме добавляет к своим дескрипторам интерфейс DFU: класс FEh (Application Specific), подкласс 01h, протокол 01h. Так компьютер узнаёт, что прошивку можно обновить.
- Переконфигурация. Хост посылает запрос DFU_DETACH и сброс USB. Устройство заново перечисляется уже в режиме DFU — с протоколом 02h и, как рекомендует спецификация, с другим PID, чтобы ОС не подгрузила прежний драйвер.
- Передача. Хост шлёт образ запросами DFU_DNLOAD блоками до wTransferSize байт; после каждого блока спрашивает DFU_GETSTATUS и ждёт bwPollTimeout, пока устройство пишет флеш-память. Пустой DFU_DNLOAD с wLength = 0 означает конец.
- Проявление. Устройство сообщает, что программирование закончено, хост делает сброс USB, и устройство перечисляется уже с новой прошивкой.
Все запросы — управляющие передачи класса на нулевую конечную точку: DFU_DETACH, DFU_DNLOAD, DFU_UPLOAD, DFU_GETSTATUS, DFU_CLRSTATUS, DFU_GETSTATE и DFU_ABORT с кодами 0–6. При ошибке устройство переходит в состояние dfuERROR и выходит из него только по DFU_CLRSTATUS (прил. A). Возможности устройства описывает функциональный дескриптор: поддержка загрузки и выгрузки, останется ли устройство на шине после проявления, сможет ли само отключиться от шины, время ожидания сброса wDetachTimeOut и наибольший блок wTransferSize. Подробнее о классах USB — в статье «Класс устройства USB».
Файл .dfu
Файл для DFU заканчивается 16-байтовым суффиксом: номер версии устройства, VID и PID, версия спецификации, подпись «UFD» и CRC всего файла (прил. B). По суффиксу утилита проверяет, что прошивка предназначена этому устройству.
DFU у STM32
Встроенный загрузчик STM32F4 принимает прошивку через USB OTG FS на выводах PA11 и PA12 в режиме DFU; для USB ему нужен внешний кварц HSE, кратный 1 МГц, от 4 до 26 МГц (RM0090, разд. 2.4). У STM32F1 DFU в загрузчике есть только у connectivity line STM32F105/107; распространённый STM32F103 прошивается встроенным загрузчиком только через USART1 (RM0008, разд. 3.4). Загрузчик ST представляется как VID 0x0483, PID 0xDF11, а на Windows ему нужен драйвер STM32 Bootloader из комплекта STM32CubeProgrammer (UM2237, разд. 1.2.4 и 2.11). Как войти в загрузчик выводом BOOT0 — в статье «Flash-память и загрузчик STM32».
Частые вопросы
Можно ли прошить STM32F103C8 (Blue Pill) по USB через DFU?
Встроенным загрузчиком — нет. По RM0008 загрузчик STM32F103 этой плотности работает только через USART1, а USB DFU есть лишь у connectivity line STM32F105/107. На Blue Pill DFU появляется, только если сначала записать в начало флеш-памяти сторонний загрузчик с DFU, например по SWD или UART.
Почему компьютер не видит устройство в режиме DFU?
Чаще всего нет драйвера: в режиме DFU устройство меняет PID, и ОС видит новое устройство. Для STM32 UM2237 предписывает поставить драйвер STM32 Bootloader из комплекта STM32CubeProgrammer, а старый DfuSe удалить. Вторая причина — нет кварца: загрузчику STM32F4 для USB нужен внешний HSE кратный 1 МГц, от 4 до 26 МГц (RM0090, разд. 2.4).
Чем DFU отличается от прошивки через виртуальный COM-порт?
DFU — стандартный класс USB со своими запросами, состояниями и форматом файла, и одна утилита работает с любым устройством этого класса. Прошивка через виртуальный COM-порт — частный протокол поверх CDC, и для каждого загрузчика нужна своя программа. Зато DFU требует, чтобы в устройстве был код, реализующий этот класс.
Источники
- USB Implementers Forum. Universal Serial Bus Device Class Specification for Device Firmware Upgrade, Version 1.1 (Aug 5, 2004) — разд. 2: четыре фазы — перечисление, переконфигурация (DFU_DETACH и сброс USB), передача, проявление (manifestation); при переходе в режим DFU рекомендуется менять idProduct, чтобы ОС не загрузила прежний драйвер; разд. 3, табл. 3.1–3.2: запросы DFU_DETACH (0), DFU_DNLOAD (1), DFU_UPLOAD (2), DFU_GETSTATUS (3), DFU_CLRSTATUS (4), DFU_GETSTATE (5), DFU_ABORT (6) — управляющие передачи класса на интерфейс; разд. 4.1–4.2: дескриптор интерфейса bInterfaceClass FEh (Application Specific), bInterfaceSubClass 01h, bInterfaceProtocol 01h в рабочем режиме и 02h в режиме DFU; функциональный дескриптор: bmAttributes (bitCanDnload, bitCanUpload, bitManifestationTolerant, bitWillDetach), wDetachTimeOut, wTransferSize; разд. 6.1: образ передаётся блоками от bMaxPacketSize0 до wTransferSize байт, после каждого блока — DFU_GETSTATUS и пауза bwPollTimeout, конец — DFU_DNLOAD с wLength = 0; табл. 6.1: коды ошибок errTARGET … errUNKNOWN; прил. A: состояния appIDLE (0) … dfuERROR (10); прил. B: суффикс файла — bcdDevice, idProduct, idVendor, bcdDFU, ucDfuSignature «UFD», bLength = 16, dwCRC
- STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 21) — разд. 2.4: встроенный загрузчик в системной памяти работает через USART1 (PA9/PA10), USART3, CAN2 и USB OTG FS (PA11/PA12) в режиме устройства (DFU); для CAN и USB нужен внешний HSE, кратный 1 МГц, от 4 до 26 МГц
- STMicroelectronics. RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21) — разд. 3.4, Embedded boot loader: у low-, medium- и high-density STM32F1 загрузчик работает только через USART1, у XL-density — USART1 или USART2, и только у connectivity line (STM32F105/107) — ещё через CAN2 и USB OTG FS в режиме DFU; для CAN и USB нужен HSE 8, 14,7456 или 25 МГц
- STMicroelectronics. UM2237 STM32CubeProgrammer software description (Rev 29, November 2025) — разд. 1.2.4: для режима USB DFU устанавливается драйвер STM32 Bootloader из пакета программы, прежний драйвер DfuSe удаляют; разд. 2.11: по умолчанию значения ST PID = 0xDF11, VID = 0x0483
Нашли ошибку?
Смотрите также
- Класс устройства USBСтандартные типы устройств и коды классов USB-IF
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- VID и PID USBИдентификаторы производителя и изделия USB
- STM32CubeProgrammer и ST-LINKПрошивка STM32: ST-LINK и загрузчик, команды CLI, option bytes, RDP, ошибки