Как прошить чип 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 в массовом порядке все, кому не лень. А не лень в первую очередь нашим китайским друзьям. Вот и поставляют они универсальные отладчики-программаторы в невероятных количествах на мировой рынок. И это хорошо, ведь благодаря массовому выпуску и конкуренции есть возможность приобрести программатор за очень небольшие средства. Да, он не самой последней версии, но работать с ним можно. Нужно только разобраться как.

stlink, st-link, v2, mini, программатор, без крышки, проводки, клетка, пурпурный

Типичные представители китайских ST-Link V2 Mini

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

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

st-link v2 mini, stlink, mini, jtag, прошивка, stm32, stm8, клетчатый, разъем, IDC, IDC10, pin, pins, пины, SWIM, SWDIO

Распиновка у моего 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 вольта.

usb2ttl, usb2uart, usb2com, адаптеры, waveshare

Типичные китайские 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 устарела и предложит ее обновить. При желании можно обновить, на китайских устройствах проблем без или после обновления версии прошивки не обнаружено.

st-link v2 mini плата Nucleo подключение

Огрызок 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 в этот момент сигнализирует о режиме остановки попеременным миганием синего и красного светодиодов.

stm32cube, connected, stm32

Программатор подключившийся к плате посредством интерфейса 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. А если же проблем нет, то переходим непосредственно к программированию.

STM32CubeProg, st-link, cube prog, firmware update

Процесс обновления прошивки 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, stm32, загрузчик

Альтернативный способ загрузки прошивки в 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).

stm32, usart, st-link, подключение, плата, провода, USB

К Nucleo-64 подключены свистки UART и ST-Link

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

stm32cubeprog, stm32, cube, prog, programmer, uart, usart, загрузчик, бутлоадер, bootloader

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, программатор, stm32

Место где кроются настройки в ST-Link Utility

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

st-link itility, stm32, программатор

Все готово к заливке прошивки в 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, stm32, программирование, контроллер, прошивка, firmware

Вид 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, FlashLoader, Flash Demonstrator, программатор, ST

Основные экраны STM32 Flash Loader

Пользоваться загрузчиком очень просто, так как интерфейс скуден и все сложное убрано далеко от глаз. В принципе, все, что в нем есть, это очистка бита защиты flash-памяти чипа от чтения (в микроконтроллерах STM32 есть такая штатная функция, как защита от чтения), управление защитой записи и чтения секторов встроенной flash -памяти, возможность загрузки и выгрузки прошивки и содержимого flash-памяти чипа, редактирование Option Bytes (настроек микроконтроллера).

DfuSe

Наименование DfuSe происходит от Device Firmware Upgrade STMicroelectronics Extension. Методика DFU была придумана для еще более простого обновления прошивок на разработческих платах с портом USB. Программа работает только через подключение по USB. Доступны библиотеки для написания собственных приложений по загрузке прошивок в микроконтроллеры.

dfu, stm32, dfuse, программатор

Основной и единственный экран DfuSe

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

dfu, dfumanager, manager, stm32, программатор

Интерфейс 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) ой как удобно.

st-link v2.1, nucleo-64, подключение, плата, провода, шпыньки, пины

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:
  1. VDD_Target – сенсор питания платы, через него нельзя запитать что-либо, он действует наоборот. При подключении к платам со стандартным питанием его можно не подключать.
  2. SWCLK – подключаем к PA14
  3. GND
  4. SWDIO – подключаем к PA13.
  5. NRST – сброс
  6. SWO – порт по отладочной информации.
  • Также подключаем пины Tx (сверху) и Rx (снизу) к PA10 и PA9 соответственно.
  • Берем питание еще откуда-либо, например, с левого пина JP1, там 3.3 вольта.

Соответственно, если все подключено верно, то появляется сразу три возможности:

  1. При подключении ST-Link V2.1 к ПК по USB подключается папка с несколькими файлами, включая инструкцию. Эта папка – внутренняя Flash-память ST-Link (он так же построен на чипе STM32, поэтому в нем все есть). Если в эту папку скопировать файлик с прошивкой, то он автоматически запишется в подключенную плату. Однако, следует учитывать, что объем «флешки» программатора всего 156 Кб, и очень объемную прошивку залить таким образом может не получиться.
  2. Подключаться по SWD (ST-Link) программаторами и осуществлять все предусмотренные операции. При этом корректно отрабатывает Reset.
  3. Подключаться к USART1 (или любому другому доступному к которому были подключены выводы) терминальной программой. При этом в операционной системе COM-порт определяется как STLink Virtual COM Port. А при наличии правильной конфигурации BOOT01/BOOT1 можно так же обращаться и к заводскому загрузчику.

Вместо заключения

Разработчики STM32 проделали огромную работу, как в плане разработки своих чипов, так и программного обеспечения. Несомненно, что чипы STM32 современны и весьма удобны в работе. Вокруг них собрана невероятная инфраструктура, написаны сотни и тысячи спецификаций, разработаны десятки программных и аппаратных комплексов для работы с микроконтроллерами STM32. Но все это многообразие может вызвать реакцию отторжения у новичка, который может быть просто ошеломлен объемом информации, которую следует переварить, дабы хоть как-то начать ориентироваться в мире STM32. И надеюсь, что мое кратенькое погружение в запутанный мир современной микроэлектроники позволит хоть немного облегчить труд познания.

Казалось бы, что тема прошивки чипов STM32 исчерпана, но приведенные методики хоть и являются массовыми, но сами по себе всего лишь верхушка айсберга, вершина огромного пласта информации. И соответственно присутствует огромное, непаханое поле для творчества.



Как прошить чип STM32: 4 комментария

  1. Zlodey

    >>При подключении к USART следует помнить,
    >>что чипы семейства STM32 работают на напряжении 3.3 В
    >>и не стоит подключаться к ним переходниками с напряжением в 5 вольт
    _____________
    Враньё, рекомендую почитать раздел даташита "Pinouts and pin description", смотрите в таблице аббревиатуру "FT", затем исправьте статью. В остальном статья отличная. Успехов вам))

    1. kvv Автор записи

      Действительно большинство пинов, например у STM32F103RB толерантны к 5V, но далеко не все, например, у дефолтных USART2 они только 3.3V. Если посмотреть еще шире, то у чипов STM32G4x1 есть пины толерантные к 5V, а есть только к 3.6V. В общем, замечание верное, прежде чем подцепить что-то что по напряжению отличается от штатного - посмотри спецификацию.

      1. Аноним

        Объясните пожалуйста простым языком, если Boot0 и Boot1 это сбор до заводских настроек. То зачем тогда NRST вообще ? Что это за сброс. А если у нас только Boot0 мы его кидаем к земле для работы с ST-Link.

        1. kvv Автор записи

          Комбинация Boot0 и Boot1 используется для вызова заводского загрузчика при перезагрузке контроллера (стирать флешпамять и загружать прошивки можно через загруженный заводской загрузчик), а NRST это сигнал аппаратного сброса контроллера (полезно когда на команды сброса он уже не реагирует), т.е. это как кнопка Reset на системном блоке.

Добавить комментарий