- Обновление прошивки по USB-DFU
- Download Firware Update Class (DFU)
- Но как узнать какой версии системный загрузчик?
- Типичный вариант организации пинов для активации загрузчика
- BOOT0
- BOOT1
- 2 проекта для текстирования
- STM32F205VG_FLASH.ld
- Теперь по-шагово поехали :
- Использование платы STM32 Leaf Maple Mini в Windows Studio Code с PlatformIO
- STM32 bootloader DFU mode с использованием CubeMX. Инструкция пошаговая, step by step
Обновление прошивки по USB-DFU
Download Firware Update Class (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
Внимание во втором проекте :
#define VECT_TAB_OFFSET 0xC000 /*!
Переключение в первом проекте между режимами загрузки и выполнение основной программы происходит программно установкой переменной boot = 1|0.
Можно прошивать каждый проект независимо , код каждого проекта должен попадать в свою область памяти и не вредить другому.
Теперь по-шагово поехали :
Собираем (и прошиваем) первый проект:
Собираем (но не прошиваем) второй проект:
Файл *.hex через утилиту STM Dfu File Manager преобразуем в файл *.dfu .
Запускаем первый проект в режиме (boot =1) с отладчиком и трассировкой SWO
Файл *.dfu через утилиту DfuSeDemo отсылаем контроллеру (то есть прошиваем через USB DFU Class)
Перезапускаем проект 1 с boot =0 и наблюдаем , что программа перешла на адрес 0x800C000 и начала выполняться :
Использование платы STM32 Leaf Maple Mini в Windows Studio Code с PlatformIO
В данной статье рассматривается:
На плате Leaf Maple Mini зашит загрузчик позволяющий загружать нашу прошивку через USB порт, как это делается в Arduino IDE. Загрузка производится в режиме DFU mode, что требует установки драйверов VID_1EAF&PID_0003.
При подключении плата определяется системой как COM порт, но в режиме загрузки прошивки переключается в режим DFU mode.
Прежде чем пытаться что-то прошить в наш контроллер нам необходимо установить драйвер.
Установка драйверов на плату Leaf Maple Mini
Качаем набор компонентов для работы с платами STM32 для Arduino IDE
Подключаем нашу плату по USB
Переводим нашу плату в режим работы DFU mode:
Кратковременно нажимаем кнопку RESET и пока быстро мигает светодиод жмем кнопку but=32 и удерживаем некоторое время.
Или зажимаем кнопку but=32 и кратковременно нажимаем RESET и держим некоторое время.
В диспетчере задач у нас должно появиться устройство Maple 003 которое требует установки драйверов.
Распаковываем скаченный ранее архив, идем в папку
\Arduino_STM32-master\drivers\win\ запускаем от АДМИНИСТРАТОРА — install_drivers.bat, драйвер должен установиться. Жмем RESET на плате, теперь установиться драйвер COM порта.
Если драйвера не установились или плата не определяется системой, пойдем по другому пути, зашьем загрузчик сами.
Прошивка в плату Leaf Maple Mini загрузчика
Я буду зашивать с использованием ST-LINK V2, но мы так же может прошить, используя COM переходники.
Качаем и устанавливаем:
Подключаем ST-LINK V2 к плате Leaf Maple Mini:
ST-LINK V2 | Maple Mini | |
---|---|---|
2 | SWCLK (SWD clock) | D21 |
4 | SWDIO (SWD data input/output) | D22 |
6 | GND (Ground) | GND |
8 | 3.3V | VCC |
Запускаем STM32 ST-LINK Utility
Переводим нашу плату в режим DFU mode см.выше.
Жмем в программе Connect
Жмем на вкладку Binary File и выбираем скачанный ранее файл maple_mini_boot20.bin
Жмем Program Verify
В открывшемся окне жмем Start
Начнется прошивка нашего загрузчика.
Теперь еще раз пробуем установить драйвера описанным выше способом.
Использование платы Leaf Maple Mini в Windows Studio Code
Запускам Windows Studio Code с установленной PlatformIO и добавляем платформы как на картинке
Создаем проект из примеров ST STM32 –> arduino-blink
Переходим в созданный проект
Правим platformio.ini
Подключаем нашу плату по USB, она определиться системой как COM порт.
Жмем 3 см. картинку. Ждем окончания заливки прошивки в плату.
Если у вас выскакивает ошибка:
Значит, вы не поставили драйвера на плату.
Дополнительно о плате Leaf Maple Mini:
Особенности микроконтроллера
- STM32F103CBT6 in LQFP48 package
- ARM®32-bit Cortex®-M3 CPU
- 72 MHz max CPU frequency
- VDD from 2.0 V to 3.6 V
- 128 KB Flash
- 20 KB SRAM
- GPIO (34) with external interrupt capability
- 12-bit ADC (2) with 10 channels
- RTC
- Timers (4)
- I2C (2)
- USART (3)
- SPI (2)
- USB 2.0 full-speed
- CAN
Схема платы Leaf Maple Mini
Еще информация по данной плате Leaf Maple Mini читать
Использование в Arduino IDE читать
Конечно, использовать DFU mode для заливки наших прошивок в плату по USB не есть хорошо, лучше прошивать, используя ST-LINK V2. Так же использование библиотек Arduino для работы с платой производительности нам не прибавит.
Разработку под STM32 лучше конечно производить в STM32CubeIDE — бесплатная среда разработки от STM, полностью поддерживает STM32CubeMX
Я использую Visual Studio 2019 Community с надстройкой VisualGDB – где Visual Studio 2019 Community – бесплатна, а вот VisualGDB стоит денег. Данная связка в последних версиях прекрасно работает с STM32CubeMX
STM32 bootloader DFU mode с использованием CubeMX. Инструкция пошаговая, step by step
Итак, сочинение сего мандригала было сподвигнуто практически полным отсутствием пошаговой инструкции с использованием обычного инструментария предлагаемого 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 и наблюдаем результат загрузки… для уверенности, жмем проверку.
все удачно… можно запускать…
если ошибка вылезла, значит где-то косяк…
Итак, будем считать что все удачно… переключаем перемыку в режим работы приложения
и наслаждаемся миганием диодика…
…
Уффф. Столько букоффф. Устал копипастить картинки 🙂