Нашел в сети проект USB HID загрузчика. https://github.com/bootsector/stm32-hid-bootloader
Заинтересовал тем что имеет небольшой размер, около 3 КБ.
Загрузчик располагается в начале флеш-памяти, а основная программа со смещением 4 КБ. В STM32 нет отдельной области для загрузчика как в AVR и его можно расположить где угодно даже в ОЗУ (например если нужно переписать всю флеш-память).
Для того чтобы основная программа нормально работала со смещением от начала памяти, нужно отредактировать скрипт линкера (файл с расширением *.ld, например он может называться stm32f103c8_flash.ld). В файле нужно найти строки.
/* Memory Spaces Definitions */
MEMORY
{
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}И заменить 0x08000000 на 0x08001000 и заодно размер флеша уменьшить на 4 КБ, т. е. заменить 64K на 60K (необязательно, т. к. в МК 128 КБ флеша). После этого прошивка будет создаваться для для работы начиная с адреса 0x08001000, т. е. со смещением 4 КБ от начала флеша. Кроме этого нужно в коде переназначить адрес таблицы векторов прерываний чтобы он тоже был со смещением 4 КБ. Для этого следует как можно раньше после старта программы выполнить строку
SCB->VTOR = 0x08001000;
Дело в том в начале таблицы векторов прерываний находится адрес стека и он тоже будет переназначен.
Загрузчик прошивается в МК обычным методом, т. е. через UASRT загрузчик или через SWD.
Далее чтобы активировать загрузчик нужно перемычку BOOT1 переключить в позицию 1. Т. е. перемычку что ближе к кнопке нужно переместить ближе к МК.
После по USB нужно подключить плату к компьютеру. Должно быть найдено новое USB устройство и установлены на него драйверы.
Затем нужно запустить консоль, указать в ней путь к программе "HID Bootloader.exe" и к бинарному файлу прошивки.
Теперь нужно вернуть перемычку на место и перезапустить МК. Должен будет замигать светодиод (если был прошит Blink.bin а не другая программа).

