Stm32 прошивка через usb dfu
Старший разработка STM32 (17) - с использованием решения DFU
Что такое DFU
DFU полностью упоминается как обновление прошивки устройства, которое является официально запущенным ST для обновления IAP через интерфейс USB. Как и интерфейс последовательного порта, они интегрированы в раздел загрузчика внутри чипа, и могут быть запущены, настроив настроив загрузчик. (Конкретная эталонная учетная документация: AN2606). Тем не менее, большинство моделей встроенного чипа DFU являются новыми, если вы используете модели без встроенных программ DFU, нет никаких отношений. Мы также можем быстро генерировать и пересаживать программу функции DFU на свою вспышку через CubeMX.
Полные компоненты схемы DFU включают одномолотный демонстрационный код DFU, программа обновления PC-боковой панели, демонстрационный код PC Side и соответствующая информация. Используя схему DFU, мы можем быстро интегрировать функции обновления до разработанного продукта, а также быстро развивать и поддерживать программу обновления.
Генерировать начальные проекты, используя CubeMX
В связи с официальными процедурами DFU, нам трудно найти готовые программы DFU, но мы можем быстро настроить и генерировать загрузчик DFU через CubeMX. Мы официально запустили.
Новый проект CubeMX
Сначала выберите модель IC, введите интерфейс конфигурации, поскольку это просто код загрузчика, нам нужно только настроить функцию USB и PIN-код, который выполняет триггер загрузчика, а остальные часы настроены нормально.
Установить функцию USB PIN
Установка режима USB для устройства (HS или FS не влияет на функциональность DFU в соответствии с выбором приложения).
Открыть компоненты DFU
Добавьте компоненты USB DFU на Amitwoates
Установите параметры DFU
После включения компонента DFU кнопка «Настройка программы DFU» появится на AddvateWares окна настройки программы CubeMX.
Откройте его, чтобы изменить его, чтобы изменить приложение, загруженное в 0x0800_C000. Этот адрес нагрузки устанавливается в соответствии со своими фактическими параметрами приложения, и в настоящее время мы выбираем три лучших сектора Flash в область загрузчика.
Второе полное полевых параметров поля используются для передачи в программное обеспечение для получения строки структуры Flash String в программном обеспечении обновления соединения DFU, которое очень хорошо понятно, щелкните настройку, описание следующего параметра CubeMX также написано очень понятно Здесь не много, чтобы сказать это здесь. Конечно, эти параметры также изменяются в файлах usbd_conf.h и usbd_dfu_if.c.c.
Наконец, мы добавляем внешнюю кнопку, в качестве триггера однопологов начнет вводить DFU. Когда кнопка нажата, запустите режим DFU, иначе напрямую загрузить заднюю программу приложения, здесь используйте PA0 PIN-код User_btn_gpio_port.
Изменить полный проект
Внедрить код функции DFU
Откройте функциональный код, который дополняет файл usbd_dfu_if.co.c под каталогом SRC
Получить параметры времени записи
USBD_DFU_IF.H определение файла добавлено
Изменить основной файл
Сначала добавьте несколько переменных и определений функций для загрузки программы приложения перед основным файлом
Затем добавьте суждение внешней кнопки в основной функции и нагрузку программы приложения и функцию инициализации USB DFU.
Используйте dfuse.
Установите пакет с официального сайта ST DFUSE и установите его. Затем мы нажимаем ранее написанную кнопку триггера и сбросьте микроконтроллер, позволяют микроконтроллеру первоначально USB DFU функцию, если вы вставляете USB-кабель микроконтроллера, система должна была распознать ее. Если у вас нет правильно, нажмите, чтобы обновить драйвер, вручную укажите путь поиска привода в драйвере \ bin \ водителя в каталоге установки dfuse. Если вы не распознаете USB-устройства напрямую, рекомендуется компилировать тест загрузки после завершения конфигурации CubeMx, посмотрите, если вы пишете не так во время трансплантации.
Затем нам нужно создать адрес, чтобы установить тестовую программу после 0x0800_C000, и написать файл Bin, Hex или S19. Затем мы открываем файловый менеджер DFU для программного обеспечения DFUSE для генерации файлов в формате .dfu для программного обеспечения DFU. Выберите первый элемент, второй используется для преобразования обратного преобразования .dfu. Вероятно, работающая операция была помечена на картинке, и операция относительно проста. Если вы не сделаете подробное введение, вы можете не забывать изменить адрес адреса в смещение. В противном случае другие параметры могут быть не изменены.
Затем мы открываем программу DFUSE и выделите сгенерированный файл Blink.dfu в обновлении, проверьте функцию проверки, загрузите программу. После успеха сбросьте микроконтроллер, светодиод начинает мигать, а трансплантат успешно.
Более
Внимательно посмотрите каталог установки DFUSE, существует документ DFU Data Data, а инженерный код DFU можно использовать для переопределения программы обновления DFU.
И вот тут самое время понять, что еще могут существовать другие загрузчики одновременно с системными - это ваши , которые пишутся вами и находятся в адресах FLASH 0х08000000.
Более того у STM есть готовый вариант в Кубе для создания вашего загрузчика по USB и называется USB : Download Firware Update Class (DFU). Генерируем , прошиваем в контроллер.
И загрузчик появляется в адресах 0x0800000 до 0x800C000 (помечена только Readable)
Далее надо пользоваться утилитами от STM Dfu File Manager и DfuSeDemo :
Dfu File Manager готовит вашу прошивку для записи выше вашего бутлодера, а DfuSeDemo собственно ее шьет во Flash выше с адреса 0x800C000.
И происходит это без подтянутой к 1 ножке boot0 контроллера.
Для общего понимания картины адреса памяти :
Думаем , а куда мы заливем свой код программы ? Мы пользовались Atollic True Studio, там были такие настройки :
Например смотрите выходной файл проекта (*.map)
FLASH это с адреса 0x08000000. А вот системный загрузчик лежит где-то по адресу 0x00000000 по-видимому всегда прекрасно себя чувствует, так как его стереть нельзя.
В нашем случае имеем STM32F205VG к примеру и у него есть такие варианты загрузчиков :
Но как узнать какой версии системный загрузчик?
Оказывается никак или предположительно по некоторым букво-цифрам на корпусе контроллера.
Типичный вариант организации пинов для активации загрузчика
BOOT0
Видим , что в нашем готовом устройстве есть вариация по BOOT0 :
Штатно BOOT0 на земле и это означает , что начало программы стартует с SRAM , т.е. по адресу 0x20000000 .
BOOT1
BOOT1 может быть выведен наружу и идти на пин , который связан с разъемом на микро SD карты. Понятно для закгрузки с микро SD карты прошивки например.
2 проекта для текстирования
В итоге для тестирования связки с загрузкой через STM Dfu File Manager и DfuSeDemo сделаны открытые два примера на Atollic True Studio .
Первый реализует пользовательский загрузчик по USB (DFU) и прошивается с адреса 0x0800000 до 0x0800C000. А второй проект реализует саму основную обновляемую программу, которую прошиваем по адресу с 0x0800C000 и выше.
STM32F205VG_FLASH.ld
Внимание во втором проекте :
Переключение в первом проекте между режимами загрузки и выполнение основной программы происходит программно установкой переменной boot = 1|0.
Можно прошивать каждый проект независимо , код каждого проекта должен попадать в свою область памяти и не вредить другому.
Теперь по-шагово поехали :
Собираем (и прошиваем) первый проект:
Собираем (но не прошиваем) второй проект:
Файл *.hex через утилиту STM Dfu File Manager преобразуем в файл *.dfu .
Запускаем первый проект в режиме (boot =1) с отладчиком и трассировкой SWO
Файл *.dfu через утилиту DfuSeDemo отсылаем контроллеру (то есть прошиваем через USB DFU Class)
Перезапускаем проект 1 с boot =0 и наблюдаем , что программа перешла на адрес 0x800C000 и начала выполняться :
Итак, сочинение сего мандригала было сподвигнуто практически полным отсутствием пошаговой инструкции с использованием обычного инструментария предлагаемого STMicroelectronics.
Великое множество обнаруженных в сети bootloader-ов, иногда весьма занятных, к сожалению «заточены» под какой-либо конкретный кристалл.
Предлагаемый материал содержит процедуру использования пакета CubeMX, «загружалки» DfuSeDemo и утилиты подготовки прошивки Dfu file manager, т. е. Мы абстрагируем наши «хотелки» от железки, да простят меня гуру макроассемблера и даташита.
Готовим окружение…
Нам необходимы собственно сам CubeMX, загружалка DfuSeDemo+Dfu file manager, лежат в одном пекете, STM32 ST-LINK Utility, все изыскиваем на сайте STMicroelectronics совершенно бесплатно.
Наша подопытная жлезка с чипом STM32F103C8T6 от дядюшки Ляо
и программатор ST-Link оттуда же.
Ну и ваша любимая IDE, в данном конкретном изложении мы используем KEIL, настройки компиляции в других IDE не очень отличаются.
Запускаем CubeMX и выбираем свой кристалл…
Отмечаем свои хотелки…
В данной конкретной задаче активируем устройство USB→Device FS и соответсвенно USB Device→ DownLoad Update Firmware class, и незабываем RCC→High Speed Clock→Cristal/Ceramic Resonator тот что на борту платы.
Далее необходимо выбрать переключалку режима bootloader-a, в данном примере просто задействуем имеющуюся перемычку boot1.
Смотрим схемку и в соответствии с ней boot1 прицеплен к ноге PB2, вот ее и задействуем в режиме GPIO_Input.
Готово, активируем закладку Clock Configuration и запускаем автомат выбора конфигурации.
Прыгаем на закладку Cofiguration…
Выбираем кнопку GPIO…
пишем пользовательскую метку, пусть это будет boot1.
Далее настраиваем проект…
Выбираем Project → Setting…
Выбираем и заполняем….
Соответсвенно выбираем для какого IDE нам Cub сгенерит проект, в нашем случае, MDK-ARM V5.
Закладку Code Generator в данном воплощении оставим без изменений…
Ну собственно и все, запускаем генерацию проекта Project→Generate Code
По окончании Cub предложит сразу запустить вашу IDE… как поступать выбирать вам.
Запускаем компиляцию и сборку и загрузку в кристалл… F7, F8…
Переключаем пины на нашей плате в режим работы и подключаем USB кабель…
Открываем в Windows панель управления→ система→ диспечер устройтв→ USB контроллер. И смотрим список устройств, Windows немого пошуршит и установит драйвер STM Device in DFU Mode (если он уже не стоял).
Итак, драйвер встал и определился, запускаем «загружалку» DfuSeDemo…
Смотрим что у нас поймалось DFU Device и дажды кликаем в поле Select Target …
Внимательно смотрим и дивимся, что флеш вплоть до адреса 0x0800C000 закрыт для записи и записываем этот адрес, он нам понадобится…
К слову, пробовал на STM32F407VE, там память открыта для записи с 0x08000000 т. е. С самого начала… почему, в нашем варианте не так, неясно, да и не копал, где то зарыто, но явно не прописано, не есть комильфо, потому что большой кусок пропадает безхозно… может кто и подскажет где копать…
Итак, «стрижка только начата»…
Нам понадобится только два файла исходников…
Открываем их в IDE и правим- дополняем…
Учитываем, что CubeMX НЕ ТОГАЕТ при перегенерации вставки между USER CODE BEGIN и USER CODE END… там и будем вписывать наши дополнения…
на этом с main.c все…
переходим на в usbd_conf.h и в
приводим к виду…
переходим к usbd_dfu_it.c, тут поболее….
Собственно и все…
Подключаем программатор, перекидываем перемычки в режим программирования, F7, F8 и botloader записан…
Теперь подготовим наше приложение для загрузки посредством bootloder…
Любимое приложение будет моргать светодиодиком…
Готовим и отлаживаем приложение, и меняем в компиляторе и теле программы отдельные места на предмет изменения адреса запуска программы и векторов прерываний…
А именно в KEIL → Configure → Flash Tools
Меняем адрес начала программы…
Говорим чтобы генерировал HEX файл
и меняем адрес таблицы векторов…
собираем программу F7…
полученный HEX преобразуем в dfo файл утилитой Dfu file manager…
указываем наш HEX файл кнопкой S19 or HEX… и жмем Generate…
получаем dfu файл.
Собственно и все готово.
Загрузка в контроллер…
Подключаем нашу подопытную плату с уже загруженным botloader-ом к USB, предварительно установив перемычки в режим DFU Mode.
Можно проконтролировать появлением STM Device in DFU Mode в списке устройст…
запускаем «загружалку».
указываем ей наш dfu файл…
Жмем Upgrade и наблюдаем результат загрузки… для уверенности, жмем проверку.
все удачно… можно запускать…
если ошибка вылезла, значит где-то косяк…
Итак, будем считать что все удачно… переключаем перемыку в режим работы приложения
и наслаждаемся миганием диодика…
…
Уффф. Столько букоффф. Устал копипастить картинки :-)
Столкнулся с необходимостью прошивки готового устройства на STM32F405. Мне хотелось бы прежде всего воспользоваться встроенными средствами прошивки STM32 по USB. К сожалению, я не нашел чисто программного способа перевести контроллер в режим DFU. Здесь я приведу код перехода в DFU и инструкции для выполнения необходимых модификаций платы.
Я расскажу про переход в DFU для платы Discovery. После необходимых модификаций, появится возможность подключать и прошивать контроллер через MicroUSB, без использования отладчика SWD.
И так, для начала, попробуем перевести контроллер в режим DFU вручную: BOOT0 закорачиваем с VDD, а BOOT1 закорачиваем с GND. Это можно сделать при помощи двух джамперов. На плате Discovery выглядит так (места для джамперов выделены красным):
На ножки, выделенные красным ставим джамперы, перезагружаем плату и подключаем через microUSB к компьютеру. Теперь, остается найти софт для прошивки контроллера в режиме DFU. Читай дальше.
Для *nix систем, существует утилита dfu-util, которая использует libusb-1.0. Установить софтину обычно можно из репозиториев. Хотя, самостоятельная сборка так же не должна вызвать трудностей.
Установка для дебиана и форков:
Что бы получить .bin файл из .elf, используйте команду (предполагается что установлен тулчейн):
arm-kgp-eabi-objcopy --strip-all -O binary image.elf image.bin
Разумеется, что бы обновлять прошивку контроллера по usb на готовом устройстве, такой способ не очень подходит. Нехорошо заставлять пользователя заниматься подобными вещами. Для решения этой проблемы можно написать свой bootloader или воспользоваться готовыми решениями. Но зачем, если контроллер имеет встроенные средства для этого?
Решение такое:
PB2 (BOOT1) притягиваем к земле и больше не трогаем.
BOOT0 соединяем с любым пином, настроенным на выход и вешаем конденсатор.
Читайте также: