Jump to content
    

Не могу разобраться с DFU-бутлоадером в STM32. Плата видна на USB-шине, но dfu-util ее не видит

Привет, народ.

Пытаюсь разобраться как прошивать плату STM32F103C8T6 (Blue Pill) по miniUSB-кабелю.

Свои изыскания я записываю здесь:

Как прошивать Blue Pill STM32 F103 через обычный USB-кабель в Linux

Затык происходит на том, что я прошиваю DFU-бутлоадер в плату, плата становится видна по USB:

[25760.232130] usb 2-2: new full-speed USB device number 7 using xhci_hcd
[25760.385437] usb 2-2: New USB device found, idVendor=1eaf, idProduct=0004, bcdDevice= 2.00
[25760.385444] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[25760.385447] usb 2-2: Product: Maple
[25760.385449] usb 2-2: Manufacturer: LeafLabs
[25760.424009] cdc_acm 2-2:1.0: ttyACM0: USB ACM device
[25760.424307] usbcore: registered new interface driver cdc_acm
[25760.424310] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

Однако утилита dfu-util (версии 0.9) ни одной платы не видит. И версия 0.8 тоже не видит:

> dfu-util --list
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Пробовал давать команду с указанием id-шников устройства:

dfu-util -d 1eaf:0004 --list

так тоже DFU-устройство не обнаруживается. Пробовал и под рутом, и от обычного пользователя, хотя DBUS правило для доступа пользователем прописывается при установке пакета dfu-util (Debian Linux 11).

Что еще нужно донастроить, чтобы увидеть DFU-устройство?

Edited by xintrea

Share this post


Link to post
Share on other sites

А с чего бы DFU-util вдруг "увидел" STM32F103, если этот МК не умеет DFU? Да там даже встроенной подтяжки USB нет!

И dmesg подтверждает, что ничего не появилось, кроме какого-то CDC, который вообще к делу отношения не имеет.

Если хочешь прошить через USART-бутлоадер, используй утилиту stm32flash.

UPD: почитал изыскания по ссылке. Теперь понятно: прошитый загрузчик либо работает со своим протоколом и инициировать его нужно через терминал по CDC, либо же это - вообще никакой не DFU! Т.к. был бы DFU, dmesg показал бы подключение DFU устройства.

Есть исходники того, что ты туда прошил?

Edited by Eddy_Em

Share this post


Link to post
Share on other sites

13 часов назад, xintrea сказал:

Что еще нужно донастроить, чтобы увидеть DFU-устройство?

врядли этот бутлоадер поддерживает dfu. попробуйте для проверки

sudo minicom -D /dev/ttyACM0

если по вашей ссылке подняться на два уровня выше, то там будет README.md, в котором сказано:

Цитата

Bootloader for STM32F103 boards, for use with the Arduino_STM32 repo and the Arduino IDE

т.е. ставите "Arduino IDE" и там смотрите в настройках как рулить таргетом

Share this post


Link to post
Share on other sites

49 minutes ago, Jury093 said:

врядли этот бутлоадер поддерживает dfu

И все-таки поддерживает. Я разобрался в чем дело было.

Чтобы включился DFU-режим, надо поставить джампера boot в недокументированное состояние: boot0=0, boot=1. Этот момент уже просили добавить в документацию/описание, но автор делать этого почему-то не стал:

https://github.com/rogerclarkmelbourne/STM32duino-bootloader/issues/90

После этого плата по USB (после нажатия Reset и перетыкания в USB-генезде) начинает видиться по-другому:

[ 4304.984940] usb 2-2: new full-speed USB device number 35 using xhci_hcd
[ 4305.133726] usb 2-2: New USB device found, idVendor=1eaf, idProduct=0003, bcdDevice= 2.01
[ 4305.133733] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4305.133735] usb 2-2: Product: Maple 003
[ 4305.133738] usb 2-2: Manufacturer: LeafLabs
[ 4305.133739] usb 2-2: SerialNumber: LLM 003

И начинает работать dfu-util:

> dfu-util --list

Found DFU: [1eaf:0003] ver=0201, devnum=35, cfg=1, intf=0, path="2-2", alt=2,
           name="STM32duino bootloader v1.0  Upload to Flash 0x8002000",
           serial="LLM 003"

Found DFU: [1eaf:0003] ver=0201, devnum=35, cfg=1, intf=0, path="2-2", alt=1,
           name="STM32duino bootloader v1.0  Upload to Flash 0x8005000",
           serial="LLM 003"

Found DFU: [1eaf:0003] ver=0201, devnum=35, cfg=1, intf=0, path="2-2", alt=0,
           name="STM32duino bootloader v1.0  ERROR. Upload to RAM not supported.",
           serial="LLM 003"

Однако далее возникает проблема. Длина DFU-загрузчика 0x56fc, значит, если он прописывается во FLASH с 0x8000000, то он будет занимать область вплоть до адреса 0x80056fc.

И при этом сам DFU-загрузчик предоставляет возможность прошивать, начиная с адреса 0x8005000. Вот это как понимать? Получается, что сам себе затрет хвост. Или я чего-то не догоняю?

 

Share this post


Link to post
Share on other sites

6 часов назад, Eddy_Em сказал:

И dmesg подтверждает, что ничего не появилось, кроме какого-то CDC, который вообще к делу отношения не имеет.

Вот dmesg моего устройства:

[516667.339860] usb 1-1.2: new full-speed USB device number 27 using ehci-pci
[516667.450691] usb 1-1.2: New USB device found, idVendor=16c0, idProduct=05e1, bcdDevice= 1.00
[516667.450700] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[516667.450702] usb 1-1.2: Product: [затерто]
[516667.450704] usb 1-1.2: Manufacturer:  здесь затерто]. (www.[тоже затерто].com)
[516667.450706] usb 1-1.2: SerialNumber: 1
[516667.451366] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[516667.451707] cdc_acm 1-1.2:1.2: ttyACM1: USB ACM device

Тем не менее это устройство умеет DFU вот прямо так, без джамперов и перетыканий. С линуксовой dfu-util "из коробки", с виндовой после небольшой пляски с zadig. И все строго в соотвествии с "Universal Serial Bus Device Class Specification for Device Firmware Upgrade Version 1.1 Aug 5, 2004".

А вот его lsusb -d 16c0:05e1 -vv:

Скрытый текст
Bus 001 Device 031: ID 16c0:05e1 Van Ooijen Technische Informatica Free shared USB VID/PID pair for CDC devices
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x16c0 Van Ooijen Technische Informatica
  idProduct          0x05e1 Free shared USB VID/PID pair for CDC devices
  bcdDevice            1.00
  iManufacturer           1 [затерто]. (www.[тоже затерто].com)
  iProduct                2  здесь затерто]
  iSerial                 3 1
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x009f
    bNumInterfaces          5
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xc0
      Self Powered
    MaxPower              500mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       2 Abstract (modem)
      bFunctionProtocol       0 
      iFunction               0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      0 
      iInterface              0 
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x00
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x02
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             128
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         2
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       2 Abstract (modem)
      bFunctionProtocol       0 
      iFunction               0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      0 
      iInterface              0 
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x00
        bDataInterface          3
      CDC ACM:
        bmCapabilities       0x02
          line coding and serial state
      CDC Union:
        bMasterInterface        2
        bSlaveInterface         3 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             128
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        4
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       254 Application Specific Interface
      bInterfaceSubClass      1 Device Firmware Update
      bInterfaceProtocol      1 
      iInterface              4 DFU interface
      Device Firmware Upgrade Interface Descriptor:
        bLength                             9
        bDescriptorType                    33
        bmAttributes                        9
          Will Detach
          Manifestation Intolerant
          Upload Unsupported
          Download Supported
        wDetachTimeout                      0 milliseconds
        wTransferSize                      53 bytes
        bcdDFUVersion                   1.01
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x0000
  (Bus Powered)

 

Да, там не F103, а L083, F072, F042, F107, F407, но в первых трех USB такой же, как у F103 не считая встроенной подтяжки.

DFU в Run-time mode не показывается в линухе. И в винде не должно (согласно спецификации DFU), но у винды свое представление о прекрасном.

Вы который раз уже "машете шашкой" в темах, в которых, мягко говоря, плаваете. Постарайтесь сдерживать себя.

Share this post


Link to post
Share on other sites

3 hours ago, Jury093 said:

попробуйте для проверки

sudo minicom -D /dev/ttyACM0

 

И кстати, при джамперах boot0=0 boot1=0 COM-порт отвечает. Вот что он показывает:
 

Congratulations, you have installed the STM32duino bootloader
See https://github.com/rogerclarkmelbourne/STM32duino-bootloader

For more information about Arduino on STM32
See https://www.stm32duino.com

Осталось только понять, почему загрузчик при заливке программы перетирает свой хвост.

 

* * *

 

UPD: Похоже, начал понимать что происходит. Образ предкомпиленного DFU-bootloaderа на самом деле не чистый DFU-bootloader, а DFU-bootloader + программа эмуляции COM-порта на USB.

 

Сам DFU-butloader имеет длинну примерно 0x1c00. А программа эмуляции COM-порта начинается со смещения 0x2000. и тянется до 0x56fc.

То есть, DFU-bootloader не имеет двух режимов. То, на что я наткнулся вначале и думал что является вторым режимом (при обоих boot джамперов в нуле) - это на самом деле просто работа программы эмуляции COM-порта.

 

Получается, что для заливки программы можно пользоваться даже устройством Upload to Flash 0x8002000, не обязательно даже Upload to Flash 0x8005000, все равно никакой хвост загрузчика затираться не будет.

 

"Чистый" DFU-загрузчик лежит не в каталоге /binaries, а в каталоге /bootloader_only_binaries. То есть, для платы STM32F103C8T6 ссылка на DFU-бутлоадер в данном проекте будет такой:

 

https://github.com/rogerclarkmelbourne/STM32duino-bootloader/blob/master/bootloader_only_binaries/generic_boot20_pc13.bin

 

* * *

 

Теперь осталось разобраться, как компилировать программы с начальным адресом 0x8002000 вместо классических 0x8000000, и можно будет проверять заливку по DFU.

 

Edited by xintrea

Share this post


Link to post
Share on other sites

для кейла можно юзать типа такого, создавать скаттер файл и подключать его в проект, внутри писать какой необходим адрес для последующей компиляции.

 

 

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1   0x00004500   0x40000  {    ; load region size_region
  ER_IROM1 0x00004500   0x40000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...