Обновление прошивки по USB-DFU

Download Firware Update Class (DFU)

И вот тут самое время понять, что еще могут существовать другие загрузчики одновременно с системными - это ваши , которые пишутся вами и находятся в адресах FLASH 0х08000000.

Более того у STM есть готовый вариант в Кубе для создания вашего загрузчика по USB и называется USB : Download Firware Update Class (DFU). Генерируем , прошиваем в контроллер.

фотка 1

И загрузчик появляется в адресах 0x0800000 до 0x800C000 (помечена только Readable)

фотка 2

Далее надо пользоваться утилитами от STM Dfu File Manager и DfuSeDemo :

Dfu File Manager готовит вашу прошивку для записи выше вашего бутлодера, а DfuSeDemo собственно ее шьет во Flash выше с адреса 0x800C000.

И происходит это без подтянутой к 1 ножке boot0 контроллера.

Для общего понимания картины адреса памяти :

фотка 3

Думаем , а куда мы заливем свой код программы ? Мы пользовались Atollic True Studio, там были такие настройки :

фотка 4

Например смотрите выходной файл проекта (*.map)

Memory Configuration
Name             Origin             Length             Attributes
RAM              0x20000000         0x00020000         xrw
FLASH            0x08000000         0x00100000         xr
*default*        0x00000000         0xffffffff

FLASH это с адреса 0x08000000. А вот системный загрузчик лежит где-то по адресу 0x00000000 по-видимому всегда прекрасно себя чувствует, так как его стереть нельзя.

В нашем случае имеем STM32F205VG к примеру и у него есть такие варианты загрузчиков :

фотка 5

Но как узнать какой версии системный загрузчик?

Оказывается никак или предположительно по некоторым букво-цифрам на корпусе контроллера.

Типичный вариант организации пинов для активации загрузчика

BOOT0

Видим , что в нашем готовом устройстве есть вариация по BOOT0 :

фотка 6

Штатно BOOT0 на земле и это означает , что начало программы стартует с SRAM , т.е. по адресу 0x20000000 .

BOOT1

BOOT1 может быть выведен наружу и идти на пин , который связан с разъемом на микро SD карты. Понятно для закгрузки с микро SD карты прошивки например.

2 проекта для текстирования

В итоге для тестирования связки с загрузкой через STM Dfu File Manager и DfuSeDemo сделаны открытые два примера на Atollic True Studio .

Первый реализует пользовательский загрузчик по USB (DFU) и прошивается с адреса 0x0800000 до 0x0800C000. А второй проект реализует саму основную обновляемую программу, которую прошиваем по адресу с 0x0800C000 и выше.

STM32F205VG_FLASH.ld

Первый проект :

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 49K
}

Второй проект :

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
FLASH (rx)      : ORIGIN = 0x800C000, LENGTH = 49152
}

Внимание во втором проекте :

#define VECT_TAB_OFFSET  0xC000 /*!< Vector Table base offset field.

Переключение в первом проекте между режимами загрузки и выполнение основной программы происходит программно установкой переменной boot = 1|0.

Можно прошивать каждый проект независимо , код каждого проекта должен попадать в свою область памяти и не вредить другому.

Теперь по-шагово поехали :

Собираем (и прошиваем) первый проект:

фотка 7

Собираем (но не прошиваем) второй проект:

фотка 8

Файл *.hex через утилиту STM Dfu File Manager преобразуем в файл *.dfu .

фотка 9

Запускаем первый проект в режиме (boot =1) с отладчиком и трассировкой SWO

Файл *.dfu через утилиту DfuSeDemo отсылаем контроллеру (то есть прошиваем через USB DFU Class)

фотка 10

Перезапускаем проект 1 с boot =0 и наблюдаем , что программа перешла на адрес 0x800C000 и начала выполняться :

фотка 11

Файлы для скачивания