STM32F4 и программный выход в DFU

Столкнулся с необходимостью прошивки готового устройства на STM32F405. Мне хотелось бы прежде всего воспользоваться  встроенными средствами прошивки STM32 по USB. К сожалению, я не нашел чисто программного способа перевести контроллер в режим DFU. Здесь я приведу код перехода в DFU и инструкции для  выполнения необходимых модификаций платы.

Я расскажу про переход в DFU для платы Discovery. После необходимых модификаций, появится возможность подключать и прошивать контроллер через MicroUSB, без использования отладчика SWD.
И так, для начала, попробуем перевести контроллер в режим DFU вручную: BOOT0 закорачиваем с VDD, а BOOT1 закорачиваем с GND. Это можно сделать при помощи двух джамперов. На плате Discovery выглядит так (места для джамперов выделены красным):

На ножки, выделенные красным ставим джамперы, перезагружаем плату и подключаем через microUSB к компьютеру. Теперь, остается найти софт для прошивки контроллера в режиме DFU. Читай дальше.

Для Windows систем: скачивайте программу DFUse с сайта st.com тут. Устанавливайте и запускайте утилиту DfuSe Demonstration. Дальше все интуитивно понятно. Выбирайте подключенный контроллер из выпадающего списка и выбирайте файл для прошивки.


Для *nix систем, существует утилита dfu-util, которая использует libusb-1.0. Установить софтину обычно можно из репозиториев. Хотя, самостоятельная сборка так же не должна вызвать трудностей.
Установка для дебиана и форков:
sudo apt-get install dfu-util

Прошивка:
dfu-util -a 0 --dfuse-address 0x08000000 -D image.bin

Что бы получить .bin файл из .elf, используйте команду (предполагается что установлен тулчейн):
arm-kgp-eabi-objcopy --strip-all -O binary image.elf image.bin

Разумеется, что бы обновлять прошивку контроллера по usb на готовом устройстве, такой способ не очень подходит. Нехорошо заставлять пользователя заниматься подобными вещами. Для решения этой проблемы можно написать свой bootloader или воспользоваться готовыми решениями. Но зачем, если контроллер имеет встроенные средства для этого?


Решение такое:
PB2 (BOOT1) притягиваем к земле и больше не трогаем.
BOOT0 соединяем с любым пином, настроенным на выход и вешаем конденсатор.



Затем, пишем код перехода в режим DFU. В моем случае он выглядит так:

#define DFU_PIN pin_id(PORTC,4)
#define BUTTON pin_id(PORTA,0)
if (pin_val(BUTTON))
{
set_pin(DFU_PIN);
Delay(1000);
NVIC_SystemReset();
}
Здесь обрабатывается нажатие на пользовательскую кнопку. Delay(1000) - время на зарядку конденсатора, с запасом.
Через секунду после нажатия на пользовательскую кнопку платы контроллер переходит в режим DFU и готов к прошивке. Этот способ также хорошо работает, если контроллер использует USB в режиме Device.

Комментарии

Популярные сообщения из этого блога

Siege Up! Editor (beta)

Git и Yandex.Disk