Вычитываем прошивку STM32
Почти в каждом микроконтроллере с интегрированной флэш памятью есть защита от вычитывания прошивки. Это делается чтобы защитить интеллектуальную собственность, криптографические ключи и алгоритмы от злоумышленников. Микроконтроллеры серии STM32, получившие широкое распространение в последнее время, особенно часто подвергаются атакам, однако нет практического опыта или информации касательно защищенности STM32 от подобных атак доступной публично. В этой статье рассмотрим системы защиты прошивки на примере STM32f0 серии.
Концепт защиты
Flash Readout Protection (RDP) ключевой компонент в защите, включенный во все линейки микроконтроллеров. Он защищает системную прошивку, сохраненную во внутренней флэш памяти от вычитывания. В зависимости от линейки, могут быть включены дополнительные механизмы, такие как Memory Protection Unit (MPU) и привилегированные / непривилегированные режимы исполнения. Вместе, эти системы призваны повысить защищенность.
RDP имеет 3 уровня защиты, RDP level 0, 1, 2. Защищенность увеличивается с ростом числа.
RDP level 0 : установлен по умолчанию и не предполагает защиты. Используя интерфейс отладки, можно получить полный доступ к устройству.
PRD level 1: Интерфейс отладки остается активным, но доступ к флэшу ограничен. Как только подключается интерфейс отладки, флэш память блокируется. Она не может быть считана ни напрямую, ни через DMA, ни путем исполнения инструкций из нее. Уровень защиты может быть как повышен до 2, так и понижен до 0, с потерей содержимого всей флэш памяти.
PRD level 2: максимально ограничивает и предоставляет максимальный уровень защиты. Интерфейс отладки отключен. Уровень не может быть понижен. Однако, несмотря на самый высокий уровень защиты, уровень 1 широко используется. Многие компании предпочитают не блокировать устройства полностью, предполагая возможности для устранения багов и неисправностей, т. к. на уровне 2 отладка невозможна. К тому же, в серии STM32f1 нет поддержки RDP level 2.
Устройство защиты RDP
RDP level это часть конфигурации систем микроконтроллера, хранящаяся в выделенной option bytes секции как 16 бит non-volatile памяти в виде двух регистров, RDP и nRDP. nRDP побитно комплементарен к RDP. Избыточность необходима для защиты от смены уровня путем подмены одного бита.
Логика работы RDP
Согласно datasheet, на RDP level 1 существует два режим исполнения. Режим пользователя и режим отладки. Как только мк переходит в режим отладки, доступ к флэш блокируется. Чтение из флэша по заявлениям производителя должен вызвать ошибку шины, затем Hard Fault interrupt.
Атака Cold-Boot Stepping
В режиме RDP level 1 при подключении отладчика ограничивается доступ только к FLASH памяти, тогда как SRAM остается доступна. Мы можем попробовать вычитать данные в момент, когда она загружены в оперативную память. С такой уязвимостью борются разработчики криптографических библиотек. Ключи шифрования хранятся в SRAM только во время использования, что составляет несколько миллисекунд, что делают такую атаку практически не выполнимой, даже без того факта, что мы не знаем об организации памяти.
Для преодоления этого ограничения авторы статьи разработали Cold-Boot Stepping (CBS), метод с помощью которого можно делать точные снимки оперативной памяти. Идея метода в том, чтобы точно отсчитывать время от события, к примеру RESET, и циклично с шагом несколько тактов делать snapshot содержимого SRAM. Атака состоит из следующих шагов:

1. Установление системы в изначальное состояние
1. Отключение питания. Необходимо чтобы мк смог снова читать из flash памяти.
2. Установка RESET до подачи питания. Позволяет запустить систему без начала исполнения кода
3. Подача питания под установленным RESET
2. Запуск системы на N кол-во шагов.
1. Запускает исполнение кода путем снятия RESET
2. Ожидание пока исполнение прошивки дойдет до установленного места
3. Установка Reset. Останавливает выполнение, но данные в SRAM остаются нетронутыми.
3. Вычитывание содержимого SRAM в файл
1. Подключение отладчика к мк
2. Снятие сигнала reset. МК не начинает исполнение кода, т. к. находится в состоянии halt установленного отладчиком.
3. Вычитывание SRAM
Повторяя этот алгоритм нужное нам количество раз можно получить информацию о контексте исполнения программы. Для реализации данной атаке необходимо точно контролировать время, что возможно только при использовании дополнительного мк.
Экстракция прошивки через CBS
Развивая описанный метод, можно создать метод полной экстракции прошивки. Во многих продуктах производители используют загрузчик, алгоритм верификации прошивки которого базируется на подсчете чек суммы, например CRC32, реализованной в некоторых линейках мк. Применяя CBS (Cold-Boot stepping) на этапе работы загрузчика, можно полностью восстановить прошивку путем анализа регистров аппаратной чек суммы или программной ее реализации, ведь на определенном шаге в ней хранится байты интересующей нас части прошивки.

На фотографии представлена автономная установка для извлечения прошивки. Ноутбук динамически подстраивает шаг, основываясь на успешности работы на предыдущем шаге. Для мк с малым объемом памяти, например STM32F051R8T6 на 64кб, экстракция займет несколько дней.
Получается, что несмотря на то, что RDP level 1 предоставляет защиту от чтения SRAM, она может быть взломана.
Использование RDP level 2 позволить обезопасить устройство от подобных атак, одна зачастую производители используют RDP level 1. Например, в популярном программном обеспечении для отладки, OpenOCD, предоставляет только команду “Lock” для защиты flash памяти устройство. При этом команда поддерживает только RDP level 1.
Понижения уровня защиты
Рассмотрим теперь методы понижения уровня RDP. Производитель заявляет, необратимость установки уровня RDP level 2. В идеале нам нужно понизить уровень 2 до 0, однако избыточность регистров RDP требует замены 8 битов. Чтобы понизить 2->1, требует изменить всего 1 бит.

Методом UV-C оптической экспозиции можно добиться изменения бит с состояния “0” на “1”. Когда излучение в 254нм попадет на затвор, происходит внедрение электронов и состояние логической ячейки переходит с 0 (заряженное) на 1 (незаряженное). Предварительно требуется очистить кристалл с помощью химического травления.

Однако требуется локализовать область кристалла, где находятся RDP байты. Производитель не документирует внутреннюю структуру кристалла. Напишем программу, которая будет читать области памяти и определять факт изменения бита. В это время будет постепенно подвергать излучению различные части мк. После того, как положение байт RDP найдено, можно изготовить маску для точечного воздействия на мк. В лучшей попытке авторам статьи удалось понизить уровень защиты RDP без дополнительных ошибочно измененных бит.
Защита от понижения уровня защиты
Не существует защиты от понижения уровня RDP, однако можно написать программу так, что на этапе инициализации она как можно раньше проверяет значение битов RDP и FLASH_OBR, в котором хранится текущий уровень защиты, и прекращает исполнения, делая метод экстракции CBS бесполезным.
Взлом интерфейса отладки
Микроконтроллеры производителя ST предполагают отладку по интерфейсу SWD [2]. Когда отладчик подключается к мк с RDP level 1 защита флэш памяти ограничивает доступ. Плохо задокументированный механизм отладки вызывает много вопросов и подстегивает к его изучению.
Авторы статьи создали свою реализацию интерфейса SWD для изучения работы защиты. Оказывается, что защита активируется только если отладчик взаимодействует с шиной AHB-Lite [1]. Получая доступ только к регистрам SWD, защита не активируется, но как только запрашивается доступ к периферии, SRAM или Flash мк переходит в режим отладки и flash память блокируется.
Для определения логики работы защиты авторы уменьшили количество SWD запросов до необходимого минимума для успешной инициализации. В процессе инициализации защита не срабатывает.
Согласно документации на Cortex-M0 [3] инструкции процессора имеют приоритет по отношению к интерфейсу отладки. Получается отладчику нужно дожидаться свободного цикла на шине чтобы исполнить свой запрос. Если отладчик получит доступ к шине раньше защиты flash памяти, то сможет считать данные из не заблокированной памяти.
Авторы статьи изучили работу защиты с прошивкой, эмулирующей нагрузку на шину, состоящий из интенсивного чтения и операций NOP. Если в прошивке нет таких операций, то чтения памяти отладчиком занимает 2 цикла: разрешения адреса и непосредственно чтение. Если добавить одну операцию NOP, то один из трех запросов на чтение не выполнится. Зависимость вероятности успешного чтения от кол-ва операций NOP может быть выражена в виде формулы
Использование операций STR в качестве нагрузки позволят показать, что flash память сама контролирует доступ. Прошивка также очень быстро мигает светодиодом, а момент, когда он перестает мигать, говорит о том, что память заблокировалась и исполнение кода прекратилось.
Одним из объяснений данной уязвимости может быть некорректная имплементация согласования источника тактирования и остальной логики.
Авторы представили действующую реализацию экстракции кода с помощью двух STM32F0 Discovery. Данные отправляются на ПК через интерфейс UART, а SWD реализован на одной из STM.

Атака состоит из следующих шагов:
- Перезагрузка системы с помощью отключения и подачи питания, чтобы сбросить защиту флэш памяти.
- Инициализация интерфейса отладки.
- Установка длины слова отладки в 32 бита
- Установка адреса чтения из флэша
- Попытка чтения из памяти
- Вычитывание считанных данных через SWD
- Повторить пока не прочтем всю память инкрементируя адрес
Средняя скорость вычитывания получается около 45 байт в секунду, что позволяет прочесть самый емкий «камень» в 256кб за 2 часа. Однако эксперименты проводились только на серии STM32F0 и предполагается, что из-за схожего внутреннего состояния, все мк линейки подвержены подобным атакам. Другие серии могут быть не затронуты.
Данную атаку можно избежать, используя второй уровень RDP, но как показано ранее уровень защиты может быть изменен. В то время как метод CBS требует работоспособность программного кода, уязвимость в отладчике может работать и в случае поврежденной при понижении уровня RDP прошивки.
Выводы
Серия мк STM32F0 содержит ряд уязвимостей позволяющих в лаборатории с базовым оборудованием создать установку для вычитывания прошивки. Методы могут комбинироваться для достижения наилучшего результата или позволить работать в RDP level 2.
Все необходимы материалы, исходный код и примеры представлены авторами статьи публично под лицензией MIT https://science.obermaier-johannes.de/.
[1] ARM LIMITED. AMBA 3 AHB-Lite Protocol Specification v1.0, 2006.
[2] ARM LIMITED. CoreSight Components Technical Reference Manual, 2009.
[3] ARM LIMITED. Cortex-M0 Technical Reference Manual, 2009.
Stm32f746zgt6 как прошить через usb

Итак, сегодня распишу немного по тому, как программировать ваши микроконтроллеры, из которых вы сделали всевозможные устройства. Не будем же мы только отладочную плату мучать .
Контроллеры STM32 можно прошить двумя путями.
1) Через встроеный бутлоадер (бутлоадер, это такая маленькая программка внутри каждого микропроцессора STM32, которая прикидывается программатором — это если по простому). Прошивка в таком варианте происходит через UART (для связи с компьютером используется переходник USB>COM)
2)Внешним программатором. Из внешних программаторов на данный момент есть большой выбор. Это может быть и ваша отладочная плата STM32 Discovery, и китайский аналог ST-LINK V2 mini, и оригинальный ST-Link.
Первым вариантом я не пользовался, но сложного в нём вроде ничего нет. Нужно скачать утилиту STM32 ST-LINK Utility и на вашем прошиваемом микроконтроллере выставить определённый сигнал на ножке\ножках BOOT0\BOOt1. Допустим возьмём для примера самый дешёвый и простой микроконтроллер STM32F030F4P6 в корпусе TSSOP20. У него есть ножка BOOT0, которую если мы замыкаем на массу — то у нас контроллер будет прошиваться через SWD (то есть от внешнего программатора), а если на эту ножку подать напряжения питания, то контроллер будет стартовать с встроенного бутлоадера, и ждать пока мы его прошьём через UART, то есть с помощью программы ST-LINK Utility.
Вторым вариантом намного проще работать, так как помимо того что вы можете прошивать свои микроконтроллеры так ещё и в режиме реального времени отлаживать свои программы (дебажить))
Для прошивки в таких случаях используется всего 4 ножки (по минимуму)
1)Vcc — питание 3 Вольт
2)VSS(Gnd) — масса
3)SWCLK
4)SWDIO
Такой вариант подключения для прошивки используется в том случае, если вы не сконфигурировали ножки SWCLK и SWDIO в качестве портов ввода-вывода. Если же вы эти ножки используете в качестве портов ввода-вывода, то прийдётся ещё подключать «физичесу» линию сброса. — RST . В таком варианте у нас получается 5 проводов для подключения
1)Vcc — питание 3 Вольт
2)VSS(Gnd) — масса
3)SWCLK
4)SWDIO
5)NRST
Вот так выглядит распиновка на плате STM32F4Discovery разъёма для программирования внешних микроконтроллеров. Пин VDD_Target является пином, для снятия показаний напряжения с прошиваемого устройства. Этот если по простому — для согласования уровня напряжений между программатором и прошиваемым устройством.

Вот так выглядит разъём программатора ST-LINK V2 mini. В нём есть дополнительные средства для работы с STM8 и т.д, поэтому для работы с STM32 нам нужны пины
1)Vcc — питание 3 Вольт
2)SWDIO
3)VSS(Gnd) — масса
4)SWCLK
10)NRST

Вот так выглядит схема подключения для прошивки нашего простейшего микроконтроллера STM32F030F4P6

Как видите, никаких заморочек нет. На этом думаю всё, если будут вопросы, то пишите в коментах, я добавлю эти нюансы в статью.
Заливка прошивки в STM32 через USB

В своем проекте я использую микроконтроллер STM32F103C8 и фреймворк stm32duino. Этот клон Ардуино предлагает специальный бутлоадер, который позволяет заливать прошивку через USB, без использования внешних компонентов типа ST-Link или USB-UART переходника.
Сегодня мне понадобилось поработать с голым контроллером из-под CooCox и без stm32duino. Но вот в чем проблема. Даже простая моргалка лампочкой влитая через этот бутлоадер не работает.
Давайте разбираться. Возможно, мои выкладки покажутся кому-то банальностью. Но я только начинаю изучать контроллеры STM32 и на поиск проблемы убил как минимум полдня. Вдруг эта статья сократит кому-то время разработки.
Я ничего не имею против ST-Link и других отладчиков. Но в моем готовом устройстве его не будет, но точно будет USB. Почему бы сразу не заложить возможность обновлять прошивку через USB? Лично я нахожу этот способ удобным. тем более что все равно у меня уже подключен шнурок по которому идет питание и USB Serial.
Давайте посмотрим как работает бутлоадер. Для начала на примере контроллеров AVR. Почему я о нем вспомнил? Я переходил с Arduino и подсознательно ожидал такого же поведения. Но в STM32 оказалось все по другому. Потому хочу рассказать о разнице этих двух микроконтроллеров.
Итак. В микроконтроллерах AVR ATMega под бутлоадер можно зарезервировать некоторое количество памяти ближе к концу флеша. С помощью fuse битов можно регулировать с какого адреса будет стартовать программа. Если бутлоадера нет — программа стартует с адреса 0x0000. Если бутлоадер есть — он запускается с некоторого другого адреса (скажем, в ATMega32 с 0x3C00, если размер бутлоадера выбран 2к).

Когда бутлоадер сделал свои дела он передает управление основной программе с адреса 0x0000. Т.е. программа всегда стартует с адреса 0x0000. Компилятор и линковщик работают с учетом того, что код будет находится в начале адресного пространства.
В микроконтроллерах STM32 все не так. Все программы стартуют с адреса 0x0800000. Бутлоадер не является чем-то таким особенным. Это такая же программа, которая стартует с того же самого начального адреса. В процессе работы бутлоадер может принять прошивку (через USB или UART, считать с флешки, принять со спутника, достать из подпространства, whatever. ) и записать ее по адресам выше чем находится сам загрузчик. Ну и, конечно же, в конце своей работы передать управление основной программе.

Так вот при компиляции прошивки нужно знать куда же бутлоадер запишет прошивку и соответствующим образом скорректировать адреса.
На этом с теорией все. Переходим к практике. Ниже пошаговая инструкция как прикрутить USB загрузчик к микроконтроллерам серии STM32F1xx, а может быть и к некоторым другим тоже.
Есть, правда, некоторые ограничения по схемотехнике. Тут я, к сожалению, не силен. ЯТП нужен подтягивающий резистор 1.5к для порта PA12 (он же USB D+). Это позволяет загрузчику в нужные моменты времени подключаться и отключаться от USB.
-
Качаем github.com/rogerclarkmelbourne/STM32duino-bootloader. В директории STM32F1\binaries уже есть пакет скомпилированых бутлоадеров под разные платы. Индекс в конце названия файла указывает куда подключен светодиод. В случае моей платы где светодиод подключен к пину C13, я использовал файл generic_boot20_pc13.bin.
-
Указать линкеру стартовый адрес. В CooCox это делается в настройках проекта, вкладка Link, раздел Memory Areas, Адрес IROM1 Start Address. Бутлоадер занимает первые 8 килобайт, значит стартовый адрес прошивки будет 0x0800000 + 0x2000 = 0x08002000. Поле Size, наверное, тоже стоит уменьшить на 8к.
Вместо COM20 нужно подставить свой порт куда прицепился микроконтроллер.
Заливатор штука очень нежная, относительных путей не любит. так что путь к прошивке нужно указывать полностью.
1EAF:0003 — это VID и PID
Чтобы не нажимать каждый раз ресет, платы основанные на libmaple/stm32duino используют трюк. Они слушают usb serial порт. Если там возникает сигнал DTR и передается ключевая последовательность байт, то микроконтроллер перегружается в бутлоадер. Смотреть в функцию rxHook().
Из-за этого может возникнуть неудобство. Если микроконтроллер заглючил и повис, то он уже не слушает порт. Следовательно он не может услышать ключевую последовательность и перегрузиться в бутлоадер. Тогда только ресет в помощь.
На этом все. Надеюсь моя статья прольет свет на то, как работает загрузчик в STM32 и как можно загружать прошивку через USB порт. К сожалению порог вхождения по прежнему высок, но вдруг кому-то моя статья поможет его преодолеть.
Если статья Вам понравилась, Вы можете поддержать меня купив чашечку кофе.
Обновление прошивки по USB-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 и начала выполняться :
Похожие публикации:
- Forza horizon 4 как заработать много денег xbox
- Viber как пополнить счет из россии
- Где самые дешевые айфоны в мире
- Как в iphone
Как прошить чип STM32
В своей недавней статье я подробно разобрал каким образом можно прошивать программным кодом чипы семейства AVR. Сегодня же я рассмотрю способы, которыми можно прошить чипы семейства STM32. Но, я не буду приводить примеры того, как можно «залить» прошивку в микроконтроллер при помощи шнура от утюга или же варианты сопряжения CentOS установленного на Chromebook и программатора от STMicroelectronics. Пойдем по пути наименьшего сопротивления и используем современный ПК с установленной на него Windows 10 64-х битной редакции. В качестве подопытной, которую будем прошивать, возьмем фирменную плату NUCLEO-F103RB. Плата относится к серии Nucleo-64, хотя сами микроконтроллеры 32-х битные. Вероятно, что цифра 64 используется по количеству выводов чипа микроконтроллера, так как для плат серии Nucleo-64 обычно используются LQFP64 корпуса микросхем.

Тот самый случай, когда за деревьями не видно леса
В платы Nucleo производитель заботливо уместил средство подключения, программирования и отладки, ST-Link. Плата просто подключается USB-кабелем к компьютеру, и если установлены драйвера, то ее можно прошивать новой прошивкой, связаться по последовательному порту и протоколу, а также начать процедуру отладки. И все по одному кабелю. Однако, ST-Link, вместе с USB-портом, выполнены на куске платы, который можно с легкостью удалить, попросту его отломав. Именно так и поступим, дабы приблизить ситуацию к наиболее распространенной, когда у нас нет встроенного программатора. Ведь нам с вами так или иначе приходится сталкиваться с чипами STM32 без каких- либо дополнительных интегрированных инструментов вообще. Но прежде, чем переходить к практике по прошивке необходимо разобраться в теории, точнее в теории управлением чипами семейства STM32.
Итак, согласно спецификации, чип STM32F103RB обладает целыми тремя коммуникационными протоколами, посредством которых можно взаимодействовать с внутренней памятью с целью внедрения в нее прошивки:
- Интерфейсом USART.
- Интерфейсом JTAG.
- Интерфейсом ST-LINK.
Начнем по порядку.
Universal Synchronous and Asynchronous Receiver-Transmitter (USART)
Данный коммуникационный протокол позволяет подключаться к чипу даже обычным терминалом. В минимальной конфигурации для подключения к устройству нужен всего один провод. В этом случае данные будут отправляться только в одном направлении. Либо на устройство, либо с устройства. Но все же рекомендуется применять как минимум трехпроводную схему подключения: GND, TX, RX. Для подключения с целью прошивки необходимо использовать только USART1.
На чипе STM32F103RB USART1 располагается на следующих выводах:
- CK (Clock) – PA8
- TX – PA9
- RX – PA10
- CTS (Clear To Send) – PA11
- RTS (Request To Send) – PA12
При подключении к USART следует помнить, что чипы семейства STM32 работают на напряжении 3.3 В и не стоит подключаться к ним переходниками с напряжением в 5 вольт.
Joint Test Action Group (JTAG)
JTAG — весьма популярный интерфейс, ставший промышленным стандартом. Интерфейс применяется для подключения к сложным интегральным схемам с целью тестирования и отладки. В том числе, при помощи данного интерфейса можно осуществлять заливку прошивок в чипы STM32.
На чипе STM32F103RB JTAG-интерфейс выведен на следующие позиции:
- JTMS (JTAG Test Mode Select) – PA13
- JTCK (JTAG Test Clock) – PA14
- JTDI (JTAG Test Data Input) – PA15
- JTDO (JTAG Test Data Output) – PB3
- JNTRST (JTAG Test nReset) – PB4
Для функционирования коммуникации с чипом достаточно подключить только четыре первых позиции, но для большей гибкости, особенно в сложных случаях рекомендуется так же использование JNTRST.
Single Wire Interface Module (SWIM), Serial Wire Debugging (SWD) и ST-LINK
Фирма ST весьма крупная, на начало 2020 в ней работало более 40 тысяч человек. Это очень много и управлять такой махиной без бюрократического подхода просто невозможно. Поэтому в недрах ST периодически рождаются и формируются различные экосистемы. Экосистема STM32 не стала исключением. Она росла, развивалась до того момента, пока разобраться в нагромождении аббревиатур, названий, интерфейсов, их групп и прочего стало очень не просто. Но возможно. Аббревиатурой SWIM, как правило именуют сразу три сущности: кабель, технологию подключения по одному проводу и аппаратный модуль, обеспечивающий подобное подключение. SWD — означает технологию отладки при использовании последовательного подключения. При чтении литературы и форумов по STM32 можно так же натолкнуться на сокращения типа SWO вкупе с SWV.
SWO это Single wire output, т.е. технология позволяющая по одному проводу выдавать из чипа какую-то информацию. Как правило она используется для отладки, когда разработчики не желают использовать обычные UART для ее вывода, что весьма полезно, так как в любой момент можно подключиться к работающему устройству и начать получать отладочную информацию. Получать и просматривать информацию можно посредством Serial Wire Viewer (SWV). По сути, обычным терминалом с дополнительными функциями. Выдача информации осуществляется только при использовании режима SWD и доступна на микропроцессорах начиная с Cortex-M3.
И подбираясь к самому интересному, хочется отметить, что под наименованием ST-LINK кроется не только комплекс технологий, объединяющих SWIM, SWD, SWO и тому подобное, но еще и программное обеспечение, которое реализует весь набор практик и интерфейсов.
Для подключения ST-LINK на STM32F103RB задействованы следующие выводы:
- SWDIO (Serial Wire Data Input/Output) – PA13
- SWCLK (Serial Wire Clock) – PA14
- TRACESWO (Trace of Serial Wire Output, та самая SWO) – PB3
Для работы через SWIM/SWD нужно-то всего два проводка, не забываем про обязательное соединение земли по всем подключенным устройствам. TRACESWO можно не подключать, особенно если данной функцией вы не пользуетесь, да и для отладки она, а не для загрузки прошивки.
Аппаратное обеспечение
Для работы с STM32 разработано и выпущено в свет великое множество различных аппаратных модулей, вот лишь самые популярные из них:
- ST-Link;
- J-Link;
- Black Magic Probe.
К сожалению, у меня нет на руках ни J-Link, ни тем более Black Magic Probe, поэтому в качестве аппаратных устройств рассмотрим только USART и ST-Link.
ST-Link великий и ужасный
Когда кто-то упоминает устройство ST-Link, то скорее всего имеет ввиду китайский аналог под кодовым названием ST-Link V2 Mini. Небольшой USB-свисточек в цветастом корпусе с десятипиновым разъемом IDC. Именно такой и будем рассматривать далее. Стоят подобные устройства более, чем доступно, работают отменно, подключаются и к семейству STM8, и к семейству STM32. Но прежде пробежимся по версиям ST-Link, ведь ST-Link V2 означает вторую версию устройства.
На начало 2020 актуальны следующие аппаратные версии ST-Link:
- ST-Link – первая версия устройства, сейчас уже не актуальна. Поддерживается подключение по USB.
- ST-Link/V2 – вторая версия устройства. Работает с STM8 и STM32. Поддерживается улучшенное подключение по USB.
- ST-Link/V2.1 – обновленная вторая версия устройства. Работает с STM32 (поддержки SWIM для STM8 нет). Изначально предполагалось использовать ее как встраиваемую часть системы. Поддерживает подключение по USB с технологией виртуального COM-порта, а заодно и как сменный накопитель. В таких системах нет необходимости отдельно подключать USART, достаточно только устройства ST-Link/V2.1. Именно ST-Link/V2.1 интегрирован в отладочную плату NUCLEO-F103RB, поэтому при подключении ее к ПК, подключается и COM-порт и протокол SWIM. А прошивки можно загружать, просто записывая их на чип как на флешку. Удобно, но такие программаторы в виде отдельных устройств в продаже отсутствуют.
- ST-Link/V3 – третья версия устройства. Бывает в виде версии E (встраивается как часть системы) и S (Set или Standalone, включая SET, MINI и MODS). Работает только с STM32.
Производят ST-Link V2 Mini в массовом порядке все, кому не лень. А не лень в первую очередь нашим китайским друзьям. Вот и поставляют они универсальные отладчики-программаторы в невероятных количествах на мировой рынок. И это хорошо, ведь благодаря массовому выпуску и конкуренции есть возможность приобрести программатор за очень небольшие средства. Да, он не самой последней версии, но работать с ним можно. Нужно только разобраться как.

Типичные представители китайских ST-Link V2 Mini
На свои устройства, заботливые производители из далекой и большой страны, предусмотрительно наносят распиновку выходов. И делают они это совершенно верно, так как никакой инструкции к устройству не прилагается. Однако, если покопаться в сети, то можно обнаружить, что существует несколько вариантов реализации вывода на китайских ST-Link V2 Mini, поэтому стоит обратить внимание на выводы, при подключении нового устройства.
При первом знакомстве с ST-Link V2 Mini у меня возникло затруднение в плане определение выводов на программаторе. Да, они подписаны и пронумерованы на корпусе, но на самом разъеме кроме ключа нет ничего. Поэтому пришлось повозиться с определением, где первый «шпынек», а где второй и все последующие.

Распиновка у моего ST-Link v2 Mini
Если подключить ST-Link V2 Mini к ПК под управлением Windows 10, то система автоматически найдет драйвер и произведет его установку. Если же драйвер не установился, либо используется версия операционной системы отличная от Win10, то можно поступить двумя путями: а) скачать драйвер с сайта производителя, б) скачать программную оболочку (о них ниже) от STMicroelectronics в поставке которой уже есть драйвер. Хочется сразу предупредить, что скачка любого программного обеспечения от ST возможна только зарегистрированным пользователям. Так компания накапливается данные о своих существующих или потенциальных клиентах.
Чем грозит отсутствие RST на STM32?
У китайских V2 Mini есть еще одна особенность. Поскольку программаторы предназначены как для работы с STM8, так и с STM32, то они содержат сразу выводы и для тех, и для других. Причем выводы на левой части разъема, около ключа, предназначены для подключения STM8 (там задействованы RST и SWIM), а на правой для STM32 (там SWCLK и SWDIO). Поэтому при работе с STM32, даже если подключить на плату вывод с RST, функция аппаратного сброса работать не будет, так как она используется только для семейства чипов STM8, для STM32 применяется другой вывод микрочипа, который не выведен на колодку разъема. Ту же учесть постиг вывод SWO. Увы, за дешевизну и многофункциональность приходится платить. Хотя, некоторые умельцы отключают вывод RST и SWIM и подключают туда верные выводы с нужных ножек микрочипа в программаторе.
В принципе, который так же подтверждается практикой, вполне можно не подключать выход сброса на микроконтроллере к программатору. Чипы STM32 весьма стабильны и если в вашей программе нет переназначений выводов, которые используются для SWD, то переход в режим программирования возможен без аппаратного сброса. Однако, если вы что-то напутали и назначили выводам (в случае STM32F103RB это PA13 и PA14) какие-то функции, то просто так запустить программатор не выйдет.
В чем проблема? Дело в том, что по умолчанию, STM32 сразу же запускает на выполнение программный код пользователя. А поскольку чип работает очень быстро, то программным способом не удается поймать момент между запуском чипа и инициализацией выводов SWD. В этом случае необходимо «нажимать» на сброс собственноручно. Ножку Reset микроконтроллера необходимо соединять с землей, запускать подключение SWD, отпускать Reset. Если наловчиться, то таким образом можно добиться срабатывания 8 или даже 9 раз из 10.
В режиме ручного сброса есть нюанс. А именно нештатный загрузчик (bootloader). Его наличие может несколько облегчить работу по подключению неподключаемого чипа, так как обычно загрузчик ждет некоторое время сигнала через UART о начале загрузки прошивки. Однако, насколько мне известно, свой загрузчик устанавливает только Arduino с ядром Maple. Но данный фреймворк уже не актуален в виду окончания его развития и поддержки.
USART/UART
Для подключения по последовательному протоколу к чипу потребуется обыкновенный конвертер USB2COM (USB2TTL, USB2UART или под любым другим наименованием). Я уже рассматривал несколько вариантов, включая кабели с чипами, для подключения по UART к AVR. Смысл подключения к STM32 ровно такой же. Только в качестве преобразователя интерфейсов под STM32 я приобрел платы от Waveshare на чипе PL2303. Платы простейшие, оборудованные всего четырьмя выводами.
При подключении к ПК, автоматически устанавливаются драйвера и устройство определяется в системе как COM-порт. При подключении адаптера к микроконтроллеру стоит обратить внимание на установленную перемычку. Плата от Waveshare способна работать с двумя напряжениями: 3.3 и 5 вольт. С чипами STM32 необходимо работать только в режиме 3.3 вольта.

Типичные китайские USB2COM свистки
Подключение адаптера к плате примитивное. Соединяем GND, соединяем выводы адаптера и микроконтроллера Rx и Tx перекрестно (Rx одного идет на Tx другого и наоборот). Все, теперь можно работать.
Стоит ли подключать Vcc?
На ST-Link, как и на USB2TTL есть выводы Vcc/Vdd/V+. На них подается постоянное напряжение в 3.3 вольта, родное для большинства чипов STM32. Стоит ли соединять эти выводы между платой микропроцессора и адаптером? В каких-то случаях да, в каких-то случаях нет.
Если вы планируете прошивать (или проводить отладку) платы без подключения внешнего питания, то подключение Vcc от внешнего адаптера (ST-Link или USB2COM) позволит работать с платой в штатном режиме ее микропроцессора. Он будет думать, что все работает так как надо, а вот возможные силовые элементы, например, реле, отвечать на управляющие запросы уже не смогут. Подключать Vcc сразу от ST-Link и от USB2TTL можно только в том случае, если оба устройства подключены к одному ПК.
Если же программируемое устройство работает со своим питанием, то нужды в подключении дополнительного Vcc от ST-Link или же от USB2UART излишне, а в некоторых случаях может приводить и к выходу из строя адаптеров.
Из этого правила есть исключение. Если используется не китайский аналог аппаратного программатора ST-Link, а «родное» устройство, а на плате или у микроконтроллера используется нестандартное питание, то подключение сенсора напряжения с программатора ST-Link желательно. В этом случае будет происходить согласование уровней интерфейса, а плату микроконтроллера придется запитывать от внешнего устройства.
Соединять GND (землю) между всему устройствами — обязательно.
BOOT0/BOOT1
ST позаботились об отказоустойчивости своих чипов. Даже в случае, если нет возможности подключиться к чипу по SWD, у пользователя все еще остается возможность добраться до микроконтроллера и закачать в него обновленную прошивку или стереть всю память. Процедура осуществляется через встроенный загрузчик (bootloader), который вызывается только при особой конфигурации выводов.
Что интересно, загрузить прошивку через загрузчик можно не только через USART (как все обычно привыкли), но и через CAN-шину, USB-DFU (Direct Firmware Upgrade), I2C и SPI протоколы. Другими словами, хоть через что-то, а загрузиться можно. Но таким многообразием способов загрузки оснащены только старшие модели микроконтроллеров семейства STM32, в младших доступен только USART.
Согласно спецификации, получить доступ к загрузчику можно аж 12 различными способами. Но, далеко не все из них доступны на каждом из чипов семейства STM32, да и обычно используется только способ под номером 1. При загрузке микроконтроллера, необходимо на вывод Boot0 микроконтроллера подать высокий уровень (3.3 В), а на вывод Boot1 низкий (0 В, соединить с землей). При выполнении этих двух условий микроконтроллер запустит прошитый на заводе в чип загрузчик.
У чипа STM32F103RB Boot0 выведен на отдельный вывод, а Boot1 совмещен с выводом PB2. Поэтому, по сути, если ничего не подключать к PB2, то можно оперировать только Boot0 (хотя позже мы увидим, что это не совсем так). Подаем на него высокий сигнал при загрузке чипа (по питанию или по сбросу), и попадаем в загрузчик.
На плате Nucleo-F103RB Boot0 выведен на пин с номером 7 morpho-коннектора. Закоротить на 3.3 вольта его можно при помощи перемычки (на плате есть две запасные перемычки на выводах с нижней стороны) установленной на пины 5-7 (пин 5 это Vdd).
Программное обеспечение
Для загрузки прошивки в чипы STM32 и платы на их основе существует необъятное множество программных продуктов, даже сама ST рекомендует набор из пяти бесплатных утилит для загрузки:
- STM32CubeProg
- STLink-Utility
- STVP (STM32)
- Flasher-STM32 – для загрузки через UART
- DfuSe – для загрузки через USB
Пробежимся по ним.
STM32CubeProg
Фирменный программатор от ST, скачивается с официального сайта (не забываем про обязательную регистрацию). STM32CubeProg позиционируется как универсальное средство, содержащее в себе всё необходимое, да еще и под несколько платформ (Windows, Linux, MacOS) сразу. STM32CubeProg можно использовать как в виде графической оболочки, так и в виде консольной версии для любителей клавиатуры и черного экрана терминала. Такая неприхотливость и неразборчивость объяснятся просто — оболочка написана на Java, поэтому может портироваться куда угодно (необходимо только изменять небольшое платформозависимое ядро). ST даже не стали разбивать поставку по операционным системам, просто включили все дистрибутивы в один архив, а пользователь сам разберется, что ему нужно. Удобство неимоверное.
При первом подключении ST-Link V2 программатор может определить, что версия прошивки на ST-Link V2 устарела и предложит ее обновить. При желании можно обновить, на китайских устройствах проблем без или после обновления версии прошивки не обнаружено.

Огрызок Nucleo-64 с подключенным St-Link V2 MIni
При подключении ST-Link к плате Nucleo с отломанным ST-Link V2.1 подключаем выходы с китайского ST-Link V2 к коннекторам ST morpho CN7 (гребенка с левой стороны) следующим образом:
- 3.3 V -> Pin5
- GND -> Pin19
- SWCLK -> Pin15 (PA14)
- SWDIO -> Pin13 (PA13)
После физического подключения на плате Nucleo включается светодиод питания (красный) и начинает выполняться прошивка (если туда зашит блинкер, то будет мигать зеленый светодиод). На ST-Link V2 загорается синий светодиод. После нажатия на кнопку Connect в STM32CubeProgrammer микроконтроллер переводится в режим остановки, считывается некоторый объем памяти и устройство готово к программированию или любым другим операциям. ST-Link V2 в этот момент сигнализирует о режиме остановки попеременным миганием синего и красного светодиодов.

Программатор подключившийся к плате посредством интерфейса ST-Link
Cube Programmer, помимо просто прошивки позволяет выполнять следующие операции:
- Читать и сохранять Flash-память микроконтроллера, если она не защищена от чтения.
- Очищать как Flash-память, так и внешнюю память микроконтроллера. Причем очищать можно как поблочно, так и все целиком. Под внешней памятью тут подразумевается память, подключенная посредством SPI, FMC, FSMC, QSPI, OCTOSPI и другими интерфейсами, но работать с ней можно только при помощи внешнего загрузчика (в комплекте уже идет набор из внешних загрузчиков под наиболее популярные платы).
- Устанавливать или снимать флаги запрета чтения Flash иначе чем из программного кода, выполняемого микроконтроллером, снимать или устанавливать флаги запрета записи в конкретные сектора на Flash, и некоторые другие функции.
CubeProg помимо ST-Link может подключаться по UART, USB и OTA (обновление по воздуху). Для начала рассмотрим наиболее интересующий нас вариант подключения посредством ST-Link. При подключении ST-Link V2 к компьютеру и выборе варианта загрузки через ST-Link в окне ST-LINK Configuration отображаются некоторые настройки, которые могут повлиять на способность подключения. Дам пояснения всем им:
- Serial number — серийный номер микроконтроллера установленного в ST-Link. У всех чипов STM32 есть свой собственный, уникальный серийный номер, а в ST-Link V2 установлен именно чип семейства STM32.
- Port — подключение посредством SWD или JTAG. Поскольку мы используем ST-Link V2 от безымянного китайского производителя, то в нашем случае функциональным будет только SWD.
- Frequency (kHz) — частота на которой работает интерфейс SWD или JTAG. Чем больше значение, тем быстрее все будет прошиваться и считываться, но при длинном кабеле могут возникать ошибки. Если все работает, то оставляем в значении по умолчанию.
- Mode — режим подключения ST-Link к чипу, может принимать три значения. Normal — стандартный вариант подключения: производится сброс, затем перевод устройства в режим остановки. Вариант сброса выбирается в следующем пункте. Connect Under Reset — подключение и остановка выполнения программы в микроконтроллере при сбросе. Тот самый случай, когда выводы ответственные за SWD/JTAG на микроконтроллеры переназначены на другие функции. При этом варианте программатор старается отловить момент, когда происходит сброс (пользователь отпускает кнопку Reset). Hot Plug — подключение без сброса и остановки, применяется для «горячего» изменения регистров или памяти.
- Reset Mode — выбор варианта сброса, может принимать несколько значений. Software reset — вариант по умолчанию, происходит полный сбор микроконтроллера программным способом за исключением подсистемы отладки. Hardware reset — сброс через вывод Reset микроконтроллера. Физический программатор при этом должен быть подключен к выводу Reset своим управляющим выводом Reset. На китайском варианте ST-Link V2 Mini данная функция неработоспособна. Core reset — сброс ядра микроконтроллера.
- Access port — на большинстве устройств STM32 всего один порт доступа по SWD/JTAG, поэтому оставляем значение по умолчанию.
- Shared — позволяет эксклюзивно (Disabled) захватывать подключение к микроконтроллеру, если же функция включена (Enabled) то можно запустить несколько STM32CubeProg или других программных оболочек к одному физическому устройству ST-Link.
Итак, если есть какие-то сложности при подключении программатора к микроконтроллеру, то начинаем играться с настройками. В большинстве случаев помогает переключение в режим Connect Under Reset. А если же проблем нет, то переходим непосредственно к программированию.

Процесс обновления прошивки ST-Link в STM32CubeProg
В качестве программы-примера для прошивки я буду использовать обычный Blink («мигатель») написанной на языке MBED (активно продвигается ST для своих плат). Код программы примитивен, но вполне рабочий (и компилируется всего в 50 Кб):
#include «mbed.h»
DigitalOut myled ( LED1 ); int main () while ( 1 ) myled = 1 ;
wait ( 1 );
myled = 0 ;
wait ( 1 );
>
>
Итак, программа откомпилирована под мой чип (STM32F103RB), Flash-память контроллера предварительно стерта (дабы убедиться, что новая программа работает, а не старая). Мой компилятор подготовил для меня сразу два файла:
- Файл с расширением elf — промежуточный формат, содержит откомпилированную микропрограмму, но она требует линковки в соответствии с конкретным чипом.
- Файл с расширением bin — конечный формат для загрузки в конкретный микрочип.
На главной странице CubeProg нажимаем плюсик и выбираем файл с расширением bin для загрузки. Если с файлом все в порядке, то его содержимое (в одном из форматов разрядности) открывается в окне просмотра. Теперь можно подключится к чипу, если чип уже не подключен, и нажимаем Download (тут странно, ведь в нашей культуре загрузка прошивки в чип была бы выгрузкой, Upload). Отключаем программный программатор (Disconnect) и перезагружаем плату. После перезагрузки встроенный светодиод начинает мигать.

Альтернативный способ загрузки прошивки в Cube Prog
Загрузить прошивку в микроконтроллер можно и на вкладке Erasing & Programming. В этом случае есть возможность настроить параметры загрузки. В данном примере я включил галочки проверки загруженного после прошивки, а так же запуск программы на исполнение после завершения загрузки. При этом ST-Link не выходит из режима подключения к плате, а все так же остается подключенным.
Подключаемся через заводской загрузчик и с использованием STM32 Cube Programmer
Как правило, при подключении через ST-Link проблем не возникает. А вот с UART придется совершить больше действий. Для начала следует убедиться, что в системе есть драйвера под USB2COM адаптер. Под чип PL2303 в Win10 обыкновенно все уже имеется сразу, либо скачивается с серверов обновления Microsoft. Но все равно, следует открыть диспетчер оборудования (Device Manager) и убедиться, что устройство работоспособно и ему назначен соответствующий номер порта. В моем случае устройство подключилось на COM4.
Вторым шагом необходимо провести соответствующую коммутация проводников. Подключить Tx на USB2TTL к выводу PA9, Rx к выводу PA10 (при чтении спецификации не лишним будет обратить внимание на то, что USART1 может быть альтернативно переназначен на другую пару выводов, в случае с F103RB это PB6 и PB7). Затем необходимо подключить вывод PB2 (сюда заведен вывод BOOT1 микрочипа) к любому выводу земли. Подключаем вывод BOOT0 к любому выводу 3.3 V, а также не забываем про соединение GND USB-адаптера и платы. Если плата не питается от чего-то еще, то подключаем так же питание 3.3 V с USB-адаптера на, например, Vdd пин Nucleo (кстати, на Nucleo присутствует перемычка, определяющая откуда на микропроцессор будет подавать питание, с Vdd или от USB встроенного ST-Link, при отломанном ST-Link питание в любом случае будет браться с Vdd).

К Nucleo-64 подключены свистки UART и ST-Link
Таким образом мы подключили USB2UART адаптер к USART1 (именно к USART1 подключается загрузчик) платы Nucleo, подали на нее с того же самого адаптера питание и активировали Схему 1 вызова заводского загрузчика (BOOT0 +3,3V; BOOT1 GND). После нажатия на сброс, если все было подключено верно, вместо выполнения кода мигателя (он остался от предыдущих экспериментов с ST-Link) будет исполнен заводской загрузчик. Небольшое замечание: несмотря на то, что по умолчанию BOOT1 (PB2 в случае Nucleo-F103RB) инициализируется на землю, его все равно рекомендуется жестко соединить с GND, в противном случае возможно срабатывание загрузчика «через раз» (при этом пользовательская прошивка так же не будет вызываться, так как BOOT0 не будет передавать ей управление).

STM32 Cube Prog подключенный к плате через заводской загрузчик
Для подключения через USART в CubeProg необходимо выбрать тип подключения UART и выбрать соответствующий COM-порт. В отношении остальных параметров вопрос остается открытым. Дело в том, что заводской загрузчик от ST обладает возможностью автоподстройки под параметры подключения по UART, с другой стороны, на конкретных параметрах и из-за особенностей аппаратного обеспечения может не произойти подключение к загрузчику программатора. Поэтому, если подключение не происходит необходимо в первую очередь поиграться со скоростью подключения, затем с четностью. Если же ничего не помогает, то необходимо еще раз перепроверить все подключения.
После установления связи программатора с платой посредством UART можно пользоваться CubeProgrammer точно так же, как и при подключении через ST-Link. Более того, можно не отключать от платы и сам адаптер ST-Link, на работоспособность его присутствие не влияет. А вот следует ли отключать 3.3 V от BOOT0? Высокий уровень на BOOT0 требуется для инициализации заводского загрузчика. После подключения программатора к чипу, можно отключить BOOT0 от напряжения, тогда при следующей перезагрузке платы управление будет передано пользовательской прошивке, загруженной в чип.
ST-Link Utility
ST-Link Utility, пожалуй, основная и наиболее популярная утилита для загрузки прошивок в STM32 посредством ST-LINK, которой все пользуются. Загружается программный продукт с сайта ST за регистрацию. По набору возможностей и функций ST-Link Utility практически полностью повторяет STM32CubeProg за исключением двух моментов. Utility работает под Windows, Utility может подключаться к платам только посредством SWD или JTAG. Все остальное, начиная от настройки Option Bytes и заканчивая внешними загрузчиками с командной строкой повторяет CubeProg. Да, интерфейс немного отличается, он проще, зато нет никакой Java и в помине.

Место где кроются настройки в ST-Link Utility
Настройки подключения (те самые Connect under reset) скрываются в меню Target, там же кроются пункты про прошивке.

Все готово к заливке прошивки в ST-Link Utility
Итак, пробуем прошить нашу плату через ST-Link V2 и с применением ST-Link Utility. Подключаемся к устройству, очищаем Flash-память, выбираем наш файл firmware.bin и жмем Start. Секунда ожидания и зеленый индикатор на плате замигал. Прошивка проведена удачно.
Несмотря на то, что ST-Link Utility полностью повторяет часть функций CubeProg, многие разработчики используют именно ее, так как считают, что этот продукт более надежен и прост в использовании.
STVP (STM32)
Утилита STVP (ST Visual Programmer) можно скачать с официального сайта ST. Она работает под управлением Windows и поддерживает не только STM32, но и чипы семейства STM8 (если они кому до сих пор интересны). STVP является часть ST MCU Toolset, который помимо самого программатора включает еще среду разработки STVD и ассемблерный линкер.

Вид STVP с подключение к чипу
STVP заточен на ассемблер, на настоящих хардкорщиков, тех кто способен писать программы для микроконтроллеров обращаясь напрямую к регистрам и памяти микроконтроллера. Поэтому он может работать только с файлами hex и s19. Подобного компилятора у меня под рукой не нашлось, поэтому процедуру прошивки пришлось пропустить, тем не менее программатор подключился через китайский ST-Link V2 к моей плате, считал ее память и отобразил все на экране. При наличии желания – связка работоспособная, тем более, что STVP работает не только с ST-Link, но и с RLink, STICE и прочими аппаратными системами ориентированными в основном на семейство STM8.
Flasher-STM32
Flasher-STM32 в девичестве назывался STM32 Flash loader demonstrator и использовался для загрузки демонстрационного мигателя с первыми платами. Загружает прошивки только через UART (он же COM-порт) и присутствует исключительно под Windows. Заполучить прошивальщик можно все там же, с сайта ST.

Основные экраны STM32 Flash Loader
Пользоваться загрузчиком очень просто, так как интерфейс скуден и все сложное убрано далеко от глаз. В принципе, все, что в нем есть, это очистка бита защиты flash-памяти чипа от чтения (в микроконтроллерах STM32 есть такая штатная функция, как защита от чтения), управление защитой записи и чтения секторов встроенной flash -памяти, возможность загрузки и выгрузки прошивки и содержимого flash-памяти чипа, редактирование Option Bytes (настроек микроконтроллера).
DfuSe
Наименование DfuSe происходит от Device Firmware Upgrade STMicroelectronics Extension. Методика DFU была придумана для еще более простого обновления прошивок на разработческих платах с портом USB. Программа работает только через подключение по USB. Доступны библиотеки для написания собственных приложений по загрузке прошивок в микроконтроллеры.

Основной и единственный экран DfuSe
DfuSe принимает на борт прошивки только в формате DFU. Формат содержит не только саму прошивку как таковую, но еще и манифест или матаданные о том, как эту прошивку применять (или иначе — информацию о плате). И если подключенная плата не является поддерживаемой, то никакой прошивки не произойдет. Тем самым существенно упрощается вся процедура прошивки и уменьшается риск порчи платы при прошивке, но нужна поддержка режима DFU на самой плате, что несколько сокращает популярность программатора.

Интерфейс DfuSe Manager для работы с DFU-файлами
Создаются файлы DFU при помощи комплектной утилиты DFU File Manager. Она может не только запаковать прошивку в файл, но и произвести обратный процесс.
К слову сказать, но мне так и не удалось подключить Nucleo-F103RB к DfuSe, так как USB на плате подключается к ST-Link V2.1, а не напрямую к микроконтроллеру. Для работы же DFU требуется прямое подключение микроконтроллера к USB (с согласованием уровней, разумеется). В таком случае, при наличии соответствующих драйверов (и с задействованием схемы с запуском загрузчика) в операционной системе можно загружать прошивку по обычному USB.
Можно ли использовать плату ST-Link V2.1 от плат Nucleo?
В процессе изысканий способов заливки прошивок разными способами в плату на основе чипа STM32 от платы донора Nucleo-64 была успешно отломана часть с программатором ST-Link версии 2.1 с портом USB. И сразу же возникает вопрос, а нельзя ли эту плату в дальнейшем использовать как удобный программатор? Ведь иметь одно устройство, сочетающее в себе сразу три (ST-Link, Virtual COM и USB Mass Storage) ой как удобно.

Nucleo-64 с подключенным SWD ST-Link V2.1
Давайте попробуем, в качестве бонуса, подключить программатор ST-Link от платы Nucleo обратно к плате Nucleo посредством проводков, словно мы используем произвольный чип STM32 с программатором ST-Link V2.1.
На «огрызке» имеется несколько разъемов и перемычек для подключения чего-либо, вот они:
- CN2 – выбор режима работы ST-Link через коннектор SWD или же через дорожки на печатной плате.
- CN3 – выход на UART (пины Tx, Rx).
- CN4 – коннектор SWD.
- CN12 и CN11 – на некоторых платах используется как выход для пинов вместо внешнего осцилятора. При поставке закрыты на землю с обратной стороны.
- JP1 – применяется для ограничения потребления платой через порт USB. Если перемычка снята, то максимальное потребление платой и всей ее обвязкой должно быть не более 300 мА. Если перемычка установлена, то максимальное потребление не должно превышать 100 мА, при этом питание платы Nucleo должно осуществляться через E5V или VIN пины. Однако, если плата подключена по USB не к порту компьютера, а к USB-блоку питания или USB-хабу со своим питанием, то Nucleo-64 можно запитывать и через USB при большом потреблении, но тогда нужно установить перемычку. Ограничения внесены на тот случай, если плата перестает стабильно работать/определяться при перегрузке по питанию порта USB, по большей части относится к портам USB1/USB2.
Итак, для целей использования ST-Link от Nucleo как отдельного программатора ST-Link V2.1 следует:
- Снять перемычки с CN2, таким образом мы активируем коннектор SWD.
- Подключить выводы с коннектора CN4, первый пин верхний и обозначен точкой, подключаем сразу к «огрызку» Nucleo-64:
- VDD_Target – сенсор питания платы, через него нельзя запитать что-либо, он действует наоборот. При подключении к платам со стандартным питанием его можно не подключать.
- SWCLK – подключаем к PA14
- GND
- SWDIO – подключаем к PA13.
- NRST – сброс
- SWO – порт по отладочной информации.
- Также подключаем пины Tx (сверху) и Rx (снизу) к PA10 и PA9 соответственно.
- Берем питание еще откуда-либо, например, с левого пина JP1, там 3.3 вольта.
Соответственно, если все подключено верно, то появляется сразу три возможности:
- При подключении ST-Link V2.1 к ПК по USB подключается папка с несколькими файлами, включая инструкцию. Эта папка – внутренняя Flash-память ST-Link (он так же построен на чипе STM32, поэтому в нем все есть). Если в эту папку скопировать файлик с прошивкой, то он автоматически запишется в подключенную плату. Однако, следует учитывать, что объем «флешки» программатора всего 156 Кб, и очень объемную прошивку залить таким образом может не получиться.
- Подключаться по SWD (ST-Link) программаторами и осуществлять все предусмотренные операции. При этом корректно отрабатывает Reset.
- Подключаться к USART1 (или любому другому доступному к которому были подключены выводы) терминальной программой. При этом в операционной системе COM-порт определяется как STLink Virtual COM Port. А при наличии правильной конфигурации BOOT01/BOOT1 можно так же обращаться и к заводскому загрузчику.
Вместо заключения
Разработчики STM32 проделали огромную работу, как в плане разработки своих чипов, так и программного обеспечения. Несомненно, что чипы STM32 современны и весьма удобны в работе. Вокруг них собрана невероятная инфраструктура, написаны сотни и тысячи спецификаций, разработаны десятки программных и аппаратных комплексов для работы с микроконтроллерами STM32. Но все это многообразие может вызвать реакцию отторжения у новичка, который может быть просто ошеломлен объемом информации, которую следует переварить, дабы хоть как-то начать ориентироваться в мире STM32. И надеюсь, что мое кратенькое погружение в запутанный мир современной микроэлектроники позволит хоть немного облегчить труд познания.
Казалось бы, что тема прошивки чипов STM32 исчерпана, но приведенные методики хоть и являются массовыми, но сами по себе всего лишь верхушка айсберга, вершина огромного пласта информации. И соответственно присутствует огромное, непаханое поле для творчества.
Опубликовано 31.01.2020 автором kvv213 в следующих категориях:
Soft железо статья
Прошивка STM32 с помощью STM32 Flash Loader Demonstrator


Ко мне периодически обращаются с вопросом — как прошить STM32?
В STM32 есть встроенный Bootloader, затереть его в отличие от Arduino нельзя, никаких фьюз-битов тоже настраивать не нужно. То есть в любом новом проце с завода есть все, чтобы его прошить через обычный COM порт или USB-UART переходник.
Почему такая простая операция вызывает проблемы, я не знаю, но решил, что проще один раз показать
Я взял для примера плату из этого поста, но принцип абсолютно одинаковый для любых плат:
- пин BOOT0 подтянуть к питанию (3.3V)
- подключить USART1 микроконтрллера черех переходник USB-UART к ПК.
- запустить Flash Loader Demonstrator и залить прошивку
- отключить переходник USB-UART (не обязательно)
- подтянуть BOOT0 к земле (нормальное положение)
- если питание не отключали, то нажать Reset на плате, если отключали — пора подключить питание
Вот и все операции.
Показываю наглядно:
Надеюсь, теперь у всех все получится
Запись опубликована автором RaJa в рубрике Девайсы, Уроки с метками STM32, Урок. Добавьте в закладки постоянную ссылку.
Прошивка STM32 с помощью STM32 Flash Loader Demonstrator : 31 комментарий
Евгений говорит 01.01.2014 в 18:40 :
Спасибо. Все получилось, проблема оказалась то ли в винде, то ли в подключении через usb-хаб. На другом компе все заработало с первого раза.
Vasiliy_Br говорит 02.01.2014 в 17:12 :
Можно настроить прошивку прямо из эмблокса. Прикрепляю сюда свои настройки и ссылку на ютуб с описанием и демонстрацией работы. Вот это у меня по tools/ configure tools… кнопка Add : uart bootloader C:\Program Files\STMicroelectronics\Software\Flash Loader Demonstrator\STMFlashLoader.exe -c —pn 2 —br 115200 —db 8 —pr EVEN —sb 1 —ec OFF —to 10000 —co ON -Dtr —Hi -Rts —Lo -i STM32_Low-density_16K -e —all -d —fn «$
-c —pn 2 —to 10000 -i STM32_Med-density_64K -e —all -d —fn «$
http://youtu.be/d2FEyruDSQU
Основная проблема с этими COM портами, за которую я их и не люблю — плодятся как кролики, у меня их номера перевалили за 3й десяток и при наличии Bluetooth их одновременно видно до десятка. Каждый раз менять настройки для разных плат и разных USB-UART (у меня их штуки 4 разных) — тоже неудобно. Я поэтому для CodeBlocks и AVR в свое время написал AVRDudeR — GUI с настройками для каждого проекта типа МК, программатора и номера порта, если он требуется. Тут по всей видимости нужно то же самое и сделать выбор COM порта при запуске утилиты без параметров, например.
Но если под рукой нет никакого отладчика, а прошить надо — вариант.
YVSemenov говорит 11.06.2014 в 17:41 :
Добрый вечер!
Прошиваю плату STM32F103C8 через Loader Demonstrator с помощью «USB 2.0 to TTL UART 6PIN Module Serial Converter CP2102 STC PRGMR» согласно видео данной статьи, проект беру из статьи «http://habrahabr.ru/post/191624/». Всё удачно прошивается, перемычку переставил, пытался далее подключить диоды через резисторы к PB5 и PB6 соответственно, и к земле другим концом, безрезультатно. Пробовал замерить напряжения между портами и землей, около 1 В. Плату саму запитывал через «USB 2.0 to TTL» переходник, так и внешним источником. Подскажите в чём я могу ошибаться?
Вариантов довольно много. Основная ошибка — собирают проект не под тот МК или не объявляют какие-то дефайны и в итоге нужные ноги просто не инициализированы. Проверьте, что Target под MD (medium density) собран.
Виталий говорит 14.06.2014 в 00:09 :
Добрый день. Есть в наличии такая же точно плата и есть stm32f4-discovery, как её подключить, чтобы прошить через swd?
Эту плату через разъем JTAG (в нем есть и SWD пины, какие именно — можно посмотреть в документации на ST-Link/v2, там есть распиновка разъема). А STM32F4-Discovery подключается кабелем miniUSB — ST-Link/v2 и снимаются перемычки, соединяющие отладчик с девбордом. Соединять достаточно VDD, SWDIO, SWCLK, GND
YVSemenov говорит 15.06.2014 в 10:02 :
Совершенно случайно решил проверить: что если подтянуть BOOT0 к питанию, а BOOT1 к земле — всё заработало! На видео у Вас работает и при BOOT0 к питанию и BOOT1 к питанию — хотя у меня плата точь в точь.
YVSemenov говорит 15.06.2014 в 10:06 :
Хотя наверно немного разные, так как Вы пишете: «подтянуть BOOT0 к земле (нормальное положение)», у меня в том же положении он к питанию подключается.
заводим такую плату так же как на видео, ни каких откликов, подскажите в чем может быть дело, как проверить на живучесть? если не трудно на почту напишите, может что подскажите почитать?
На почту я пишу только в частном коммерческом порядке. Без отладчика или осциллографа особо не проверить никак.
Andrey говорит 29.10.2014 в 23:36 :
Добрый день, спасибо за статью, весьма полезно. Не подскажите, как решить такаю проблему: пробую прошить stm32f103c8 с помощью Flash Loader Demonstrator через USART1, нормально определяется контроллер, объем памяти, показывает список страниц, все незалоченные, далее выбираю файл, жму next, получаю ошибку «unable to erase flash». Не работает также опция скачать прошивку в файл, выдает ошибку read protection (хотя все страницы незалочены). Не работает и опция erase all. С но теперь уже с ошибкой «write protected» Платку купил вот такую: http://www.ebay.fr/itm/STM32F103C8T6-ARM-STM32-Developpement-Minimum-Conseil-Module-Pour-Arduino-EB-/231274901824?ssPageName=ADME:L:OC:US:3160 (понравилось то, что ее можно как микросхему dip40 использовать).
У вас установлена защита от записи и считывания прошивки. Чтобы ее снять, нужен JTAG или SWD программатор и ST-Link Utility например.
Andrey говорит 04.11.2014 в 15:28 :
Спасибо! Тем не менее, как-то непонятно, читаю AN3155 — USART protocol used in the STM32 bootloader (http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00264342.pdf), в нем приведена таблица команд, которые воспринимает бутлоадер через USART1, в частности, указано, что при блокировке чтения доступна команда «Readout Unprotect», которая должна эту блокировку снять (предварительно очистив всю память). Ну ок, пытаюсь посредством Flash Loader Demonstrator отправить эту команду процессору — получаю в ответ «unsupported command». Версия bootloader’а — 2.2, должен поддерживать. Как говорится, не верь глазам своим К сожалению, у меня нет ни SWD, ни ST-Link, чтобы попробовать с их помощью (заказал, жду). Может быть, все-таки есть возможность победить проблему с помощью USART?
Честно говоря не пробовал, т.к. ST-Link у меня есть. Надо будет на досуге поэкспериментировать.
Andrey говорит 08.11.2014 в 15:51 :
Понятно, если появятся новости, отпишите, пож-та. Спасибо!
Uriy говорит 18.01.2015 в 22:42 :
Подскажите кто нибудь,проблема с синтезатором.Слетела прошивка.Какой прогой прошивальщиком я могу залить bin файл на eeprom s29gl512tfi02.На плате есть jtag разъем.В структурной схеме возле шины txd и rxd есть надпись uart.uart адаптер и прошивка есть.Только проблема с программным обеспечение.Какое использовать под uart адаптер.
Зависит от микроконтроллера.
Скорее всего можно использовать Segger J-link
Uriy говорит 18.01.2015 в 22:43 :
Забыл уточнить модель синта.Roland gw-8.
Андрей говорит 12.03.2015 в 13:04 :
Здравствуйте, подскажите пожалуйста, как считать прошивку с контроллера STM32 через UART?

На этапе выбора файла прошивки выбрать upload from device и вместо записи Вы считаете прошивку, если она не защищена.
Вот в этом окне:
Чтение прошивки STM32 flash loader demonstrator
Андрей говорит 04.04.2015 в 13:28 :
Спасибо за ответ, считать прошивку получилось, но после считывания прошивки с помощью USB UART программой Flash loader принтер включается индикатор питания горит на кнопки не реагирует, такое предположение что контроллер висит. Можете подсказать как вывести его из этого состояния. Заранее благодарен.
А как принтер связан с прошивкой контроллера? USB UART — это отдельное устройство.
Если же речь о МК, то нужно просто вернуть BOOT0 в исходное положение не забывать и перезапустить контроллер кнопкой Reset.
Андрей говорит 09.04.2015 в 23:52 :
Контроллер STM32 используется в термо принтере UNS TP61.01, в данном принтере выходят из строя драйвер авто обрезчика бумаги, который выводит из строя контроллер. У меня лежат на полке уже три принтера таких , встал вопрос о их восстановлении, плат в сборе на принтеры нет, вот решил заняться этим вопросом. К контроллеру я подключался внутрисхемно на плате предусмотрены с завода штырьки для подключения. Подключился к этим выводам считал прошивку с рабочего принтера, переключил перемычку BOOT0=0, нажал кнопку Reset, рабочий принтер после считывания более не работает.
Возможно, стоит защита от считывания прошивки? это было бы весьма логично, т.к. прошивка — интеллектуальная собственность. И может быть настроена на самостирание при снятии защиты.
Андрей говорит 13.04.2015 в 21:22 :
Спасибо за ответ, буду думать что дальше делать.
Владимир говорит 21.07.2015 в 12:06 :
Спасибо. Именно вашей статьи и не хватало. Решил пересесть с Ардуино на STM32 и думал обязательно ли нужен ST-Link.
Александр говорит 13.08.2016 в 19:27 :

Прошу прощения, работа занимает все время, не всегда удается быстро ответить.
ST-Link подключается к плате согласно распиновке — JTMS — SWDIO контакт, JTCK — SWCLK, GND и Vcc как обычно.
Распиновка JTAG:
Александр говорит 08.08.2019 в 23:55 :
Может кто подсказать, получил процессор стм32ф405, впаял в полётный контроллер (омнибус ф4), в ДФУ режим не входит (кнопка есть для замыкания бут). Прошить удалось только через программатор стлинк. При попытке войти в дфу через конфигуратор контроллера (есть там такая возможность, через командную строку входить), полётник виснет. ФлешЛоадерДемонстратор не коннектится, пишет, что что-то с загрузчиком. Знаний особо нет по микроконтроллерам… Может кто подскажет, мог ли слететь загрузчик заводской и если да, то как восстановить?
