Как считать прошивку с stm32

от admin

Сливаем дамп флешки STM32 стандартными инструментами

Как считать прошивку контроллера который не был залочен? До очень просто.

Подключаем плату через st-link и запускаем программу STM32CubeProgrammer или ST-LINK Utility.

Обе программы имеют вполне годный консольный help и документацию, в которой он, по сути, дублируется.

STM32CubeProgrammer. Сохраняет прошивку в bin, hex, srec

В port выбирается используемый интерфейс, далее идет адрес старта прошивки (0x08000000), размер прошивки (0x20000) и название файла куда будет сохранена прошивка.

ST-LINK Utility. Сохраняет прошивку в файл.

Ключ -c выполняет подключение, ключ -Dump переводит программу ST-LINK в режим чтения прошивки, далее идет адрес старта прошивки (0x08000000), размер прошивки (0x20000) и название файла куда будет сохранена прошивка.

Сравнить слитый файл с прошивкой на микроконтроллере можно через следующую команду в ST-LINK Utility. Выведет первый не совпавший адрес.

Конечно, удобнее сравнивать файл прошивки с дампом в GUI. Он выводит два окошка с файлами где красным подсвечены не совпавшие секции.

Как прошить чип 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, многие разработчики используют именно ее, так как считают, что этот продукт более надежен и прост в использовании.

Читать:
Как сменить ip через cmd

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

Опубликовано 31.01.2020 автором kvv213 в следующих категориях:
Soft железо статья

Name already in use

stlink / doc / tutorial.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

stlink Tools Tutorial

Available tools and options

Option Tool Description Available
since
—flash=n[k, M] st-flash One can specify —flash=128k for example, to override the default value of 64k for the STM32F103C8T6
to assume 128k of flash being present. This option accepts decimal (128k), octal 0200k, or hex 0x80k values.
Leaving the multiplier out is equally valid, e.g.: —flash=0x20000 . The size may be followed by an optional
«k» or «M» to multiply the given value by 1k (1024) or 1M (1024 x 1024) respectively.
One can read arbitary addresses of memory out to a binary file with: st-flash read out.bin 0x8000000 4096 .
In this example 4096 bytes are read and subsequently written to out.bin .
Binary files (here: in.bin ) are written into flash memory with: st-flash write in.bin 0x8000000
v1.4.0
—format st-flash Specify file image format to read or write. Valid formats are binary and ihex . v1.3.0
—freq=n[k, M] st-info
st-flash
st-util
The frequency of the SWD/JTAG interface can be specified, to override the default 1800 kHz configuration.
This option solely accepts decimal values with the unit Hz being left out. Valid frequencies are:
5k, 15k, 25k, 50k, 100k, 125k, 240k, 480k, 950k, 1200k (1.2M), 1800k (1.8M), 4000k (4M) .
v1.6.1
—opt st-flash Optimisation can be enabled in order to skip flashing empty (0x00 or 0xff) bytes at the end of binary file.
This may cause some garbage data left after a flash operation. This option was enabled by default in earlier releases.
v1.6.1
—reset st-flash Trigger a reset after flashing. The default uses the hardware reset through NRST pin.
A software reset (via AIRCR ; since v1.5.1) is used, if the hardware reset failed ( NRST pin not connected).
v1.0.0
—connect-under-reset st-info
st-flash
st-util
Connect under reset. Option makes it possible to connect to the device before code execution. This is useful
when the target contains code that lets the device go to sleep, disables debug pins or other special code.
v1.6.1
—hot-plug st-info
st-flash
st-util
Connect to the target without reset. v1.6.2
—probe st-info Display hardware information about the connected programmer and target MCU. v1.2.0
—version st-info
st-flash
st-util
Print version information. v1.3.0
—help st-flash
st-util
Print list of available commands.

Reading & Writing Option Bytes

Example to read and write option bytes:

st-flash: Checksum for binary files

When flashing a file, a checksum is calculated for the binary file, both in md5 and the sum algorithm. The latter is also used by the official ST-LINK utility tool from STMicroelectronics as described in the document: UM0892 — User manual STM32 ST-LINK utility software description .

The stlink toolset also provides a GUI which is an optional feature. It is only installed if a gtk3 toolset has been detected during package installation or compilation from source. It is not available for Windows. If you prefer to have an user interface on the latter system, please use the official ST-LINK Utility instead.

The stlink-gui offers the following features:

  • Connect/disconnect to a present STlink programmer
  • Display basic device information
  • Select a binary file from the local filesystem to flash it to the detected device connected to the programmer
  • Export the memory of the connected chip to a file which can be saved to the local filesystem
  • Display of the memory address map in the main window for each, the device memory and a loaded binary file

Within the GUI main window tooltips explain the available user elements.

Solutions to common problems

a) Verify if udev rules are set correctly (by Dave Hylands)

To investigate, start by plugging your STLINK device into the usb port. Then run lsusb . You should see an entry something like the following:

Note the bus number (005) and the Device (017). You should then do: ls -l /dev/bus/usb/005/017 (replacing 005 and 017 appropriately).

On my system I see the following:

which is world writable (this is from the MODE:=»0666″ below). I have several files in my /etc/udev/rules.d directory. In this particular case, the 49-stlinkv2-1.rules file contains the following:

and the idVendor of 0483 and idProduct of 374b matches the vendor id from the lsusb output.

Make sure that you have all 3 files from here: https://github.com/stlink-org/stlink/tree/master/etc/udev/rules.d in your /etc/udev/rules.d directory. After copying new files or editing existing files in /etc/udev/ruled.d you should run the following:

to ensure that the rules actually take effect. Using the trigger command means that you shouldn’t need to unplug and replug the device, but you might want to try that for good measure as well.

If the VID:PID of your device doesn’t match those in any of the 3 files, then you may need to create a custom rule file to match your VID:PID.

b) NOTE: Chinese Fake-Chips CKS32F103C8T6 or CS32F103C8T6 being marked as «STM32F103C8T6»

In contrast to «Clone chips» which identify themselves as such by their official marking (manufacturer, model, etc.), so called «Fake chips» do not. Instead counterfeiters try to copy the outer appearance of the original and thus are very hard to detect. Possible malfunction then may lead to various effects and issues during operation also in in connection with this toolset.

As of December 2019 several so called «Bluepill-Boards» with a STM32F103C8T6 appeared on the market that do not hold the original part. In this known example one finds the counterfeited «STM32F103C8T6» MCUs to identify themselves with chip-id 0x2ba01477 instead of 0x1ba01477 .

In the following you find some hints on how to identify your chip and track down fraud:

However it appears that not all counterfeited parts cause problems during operation, but some are known to not even being able to execute a basic «blinky» example binary. Further there can be problems that may not even show up or affect you directly, but somewhen later in time (or maybe never). This demonstrates there is no guarantee for a proper working chip with equal functionality compared to the original.

Please keep this in mind and be sceptical when facing problems with this type of boards. Check your hardware and try to identify what you have in front of you before assuming a bug in the stlink toolset.

Please let us know, if you come across any further websites or tutorials that help to identify STM32 fake chips so we can list them here to help others.

c) Appearance of the warning message WARN src/common.c: unknown chip id!

The chip ID is the main identifier for STM32 MCU and their specific type and provides primary information on flash and SRAM architecture. This so called DBGMCU_IDCODE register is allocated either at memory address 0xE0042000 or 0x40015800 .

A failure of chip identification results in the error WARN src/common.c: unknown chip id! . There are different variants of this message that refer to different issues:

  • unknown chip id! 0 —> Target chip (board) is unknown.
    1. Microcontroller is in stop/standby mode.
    2. The signals DIO and CLK are reversed on the SWD-Interface.
  • unknown chip id! 0x3748 —> A target chip (board) cannot be detected.
    1. No target is connected —> In this case st-info —probe displays chip id 0x0748 with STLINK/V2 and chip id 0x03e8 with STLINK-V3.
    2. The chip is connected but has gone into an undefined state of operation where the SWD pins are unresponsive. —> Try to use —connect-under-reset while pressing the reset button on the target board.
    3. A firmware-issue prevents the programmer from normal operation. —> Ensure that your programmer runs the latest firmware version and consider to upgrade any older version by using the official firmware upgrade tool provided by STMicroelectronics.
  • unknown chip id! 0xe0042000 —> The memory register holding the information on the chip ID could not be read. The following problems may lead to this case:
    1. This problem is caused by the SWDIO and SWCLK being configured for other purpose (GPIO, etc) other than Serial Wire configuration or Jtag —> A possible solution to this is to short the BOOT0 pin with VDD (1) and to reset the chip / board by the execuing st-flash erase in order to return the MCU back to normal operation. Afterwards BOOT0 should be set back to GND (0).
    2. There is a hardware defect in the connection between the MCU and the used programmer (solder points, cables, connectors).

d) Understanding hardware and software reset functionality for st-flash and reset-related device recovery

Typically a reset signal is sent via the reset pin NRST . Using st-flash for flashing results in the following behaviour:

  • without the —reset option: st-flash write results in one reset signal on the NRST line
  • with the —reset option: st-flash write —reset results in two subsequent reset signals on the NRST line

Depending on the used programmer the hardware reset line is not always connected. This is especially the case for low-cost STLINK/V2 clone programmers. Here the SWD connector consists of only 4 pins: VCC , SWCLK , GND and SWDATA .

When the physical reset line NRST is not connected, a reset is initiated by software via SWD_SWDIO/JTAG_TMS (software reset). Just as mentioned above, flashing is possible here eiher with and without the —reset option.

Configuring the STM32 pin JTAG_TMS/SWD_SWDIO as an output now also prevents the SWD interface from flashing and resetting the device. In consequence this constellation typically requires a hard reset to allow for the ST-Link/V2 programmer to reconnect to the target at all.

As soon as the device is in DFU mode, the JTAG_TMS/SWD_SWDIO pin is left in the default state with all JTAG pins available. Here flashing of the device is now possible with and without the —reset option.

The debug command (gdb) monitor jtag_reset sends a hard reset signal via the NRST pin to reset the device and allows for flashing it (again).

( Content below is currently unrevised and may be outdated as of Mar 2021. )

Using the GDB server

This assumes you have got the libopencm3 project downloaded in ocm3 . The libopencm3 project provides a firmware library, with solid examples for Cortex M3, M4 and M0 processors from any vendor. It has some good, reliable examples for each of the Discovery boards.

Even if you don’t plan on using libopencm3, the examples they provide will help you verify that:

  • Your installed toolchain is capable of compiling for cortex M3/M4 targets
  • stlink is functional
  • Your arm-none-eabi-gdb is functional
  • Your board is functional

A GDB server must be started to interact with the STM32 by running st-util tool :

Then, GDB can be used to interact with the kit:

From GDB, connect to the server using:

GDB has memory maps for as many chips as it knows about, and will load your project into either flash or SRAM based on how the project was linked. Linking projects to boot from SRAM is beyond the scope of this document.

Because of these built in memory maps, after specifying the .elf at the command line, now we can simply “load” the target:

st-util will load all sections into their appropriate addresses, and “correctly” set the PC register. So, to run your freshly loaded program, simply “continue”

Your program should now be running, and, if you used one of the blinking examples from libopencm3, the LEDs on the board should be blinking for you.

Using the gdb server

To run the gdb server:

The STLink device to use can be specified using the —serial parameter.

Then, in your project directory, someting like this. (remember, you need to run an ARM gdb, not an x86 gdb)

Resetting the chip from GDB

You may reset the chip using GDB if you want. You’ll need to use `target extended-remote’ command like in this session:

Note that st-link does not support ‘run’, as it does not load arbitrary programs without explicit commands. In order to continue, one can use ‘monitor reset’ to reset the MCU.

Remember that you can shorten the commands. tar ext :4242 is good enough for GDB.

If you need to send a reset signal, you can use the following command:

Disassembling THUMB code in GDB

By default, the disassemble command in GDB operates in ARM mode. The programs running on CORTEX-M3 are compiled in THUMB mode. To correctly disassemble them under GDB, uses an odd address. For instance, if you want to disassemble the code at 0x20000000, use:

Running programs from SRAM

You can run your firmware directly from SRAM if you want to. Just link it at 0x20000000 and do

It will be loaded, and pc will be adjusted to point to start of the code, if it is linked correctly (i.e. ELF has correct entry point).

Writing to flash

The GDB stub ships with a correct memory map, including the flash area. If you would link your executable to 0x08000000 and then do

Как считать прошивку с stm32

STM32F1xx:

1. Защита:

Пользовательскую область флэш-памяти можно защитить от чтения ненадежным кодом. Страницы флэш-памяти также могут быть защищены от нежелательной записи из-за потери контекстов счетчика программ.

Зернистость защиты от записи:

● четыре страницы для устройств с низкой и средней плотностью

● две страницы для устройств с высокой плотностью и связностью.

1.1 Защита от чтения:

Защита чтения активируется путем установки байт опций RDP, а затем, применяя системный сброс для перезагрузки нового байта опций RDP.

Прим.: Если защита чтения установлена, когда отладчик все еще подключен через JTAG / SWD, примените POR (сброс при включении) вместо сброса системы (без подключения отладчика).

После того как запрограммирован защитный байт:

● Основной доступ к памяти для чтения флэш-памяти не допускается, за исключением кода пользователя (при загрузке основной флэш-памяти с отключенным режимом отладки).

● Страницы 0-3 (для устройств с низкой и средней плотностью) или страницы 0-1 (для устройств с высокой плотностью и связностью) автоматически защищены от записи. Остальная часть памяти может быть запрограммирована кодом, выполняемым из основной флэш-памяти (для IAP, постоянного хранения и т. Д.), Но она защищена от записи / стирания (но не против стирания массы) в режиме отладки или при загрузке с встроенный SRAM.

● Все функции, связанные с загрузкой кода и выполнением кода из встроенного SRAM, по-прежнему активны (JTAG / SWD и загрузка из встроенного SRAM), и это можно использовать для отключения защиты чтения. Когда байт опции защиты чтения изменяется на значение защиты памяти, выполняется массовое стирание.

● Доступ к основной флэш-памяти через код, выполняемый с SRAM или FSMC, и доступ к Flash через чтение данных с использованием DMA1, DMA2, JTAG, SWV (просмотрщик последовательного канала), SWD (отладка последовательного интерфейса), ETM и сканирование границ не допускаются.

Состояние защиты от флэш-памяти:

Прим.: Удаление байта опции не приведет к стиранию массы, поскольку стертое значение (0xFF) соответствует защищенному значению.

Снятие защиты:

Чтобы отключить защиту чтения от встроенной SRAM:

● Удалите всю область байта опций. В результате код защиты чтения (RDP) будет равен 0xFF. На этом этапе защита чтения по-прежнему включена.

● Запрограммируйте правильный код RDP 0x00A5 для снятия защиты с памяти. Эта операция сначала вынуждает Mass Erase основной флэш-памяти.

● Сбросьте устройство (POR Reset), чтобы перезагрузить байты опций (и новый код RDP) и отключить защиту чтения.

Прим.: Защита чтения может быть отключена с помощью загрузчика (в этом случае для перезагрузки байтов опций требуется только системный сброс).

1.2 Защита от записи:

В высокой плотности и устройств подключения линии, начиная со страницы 0 до 61, защита от записи осуществляется с зернистостью двух страниц одновременно. Оставшийся блок памяти (со страницы 62 на стр. 255 в устройствах с высокой плотностью и со стр. 62 на стр. 127 в устройствах линии связи) сразу защищен от записи.

В устройствах с низкой и средней плотностью защита от записи реализуется с гранулярностью по четыре страницы за раз.

Если на защищенной странице выполняется программа или операция стирания, флэш-память возвращает флаг ошибки защиты в регистре состояния флэш-памяти (FLASH_SR).

Защита записи активируется путем настройки байтов опции WRP [3:0], а затем применяя системный сброс для перезагрузки новых байтов опций WRPx.

Снятие защиты:

Чтобы отключить защиту от записи, предусмотрены два случая применения:

● Случай 1: защита чтения отключена после защиты от записи:

– Удалите всю область байтов опций, используя бит OPTER во флэш-памяти контрольный регистр (FLASH_CR)

– Запрограммируйте правильный код RDP 0x00A5 для снятия защиты с памяти. Эта операция сначала сделает общий сброс основной флэш-памяти.

– Сбросьте устройство (сброс системы), чтобы перезагрузить байты опций (и новый WRP [3:0] байт) и отключить защиту от записи

● Случай 2: защита чтения поддерживается активной после защиты от записи, полезная для программирования приложений с помощью пользовательского загрузчика:

– Удалите всю область байтов опций, используя бит OPTER во флэш-памяти контрольный регистр (FLASH_CR)

– Сбросьте устройство (сброс системы), чтобы перезагрузить байты опций (и новый WRP [3:0] байт) и отключить защиту от записи.

1.3 Опция защиты от записи блока:

Байты опций всегда доступны для чтения и защищаются от записи по умолчанию. Для того, чтобы получить доступ на запись (Программа / Erase) для опционных байтов, последовательность ключей (такой же, как для блокировки) должен быть записан в OPTKEYR. Правильная последовательность ключей дает доступ на запись к байтам опций, и это указывается OPTWRE в установленном регистре FLASH_CR. Доступ к записи может быть отключен путем сброса бит через программное обеспечение.

2 Описание байта опций:

Существует восемь опциональных байтов. Они настраиваются конечным пользователем в зависимости от требований приложения. В качестве примера конфигурации сторожевой таймер может быть выбран в аппаратном или программном режиме.

32-битное слово разделяется следующим образом в байтах опций.

Формат байта опций:

Организация этих байтов внутри информационного блока приведена в следующей таблице.

Байты опций могут быть считаны из мест памяти, перечисленных в следующей таблице, или из регистра байта Option (FLASH_OBR).

Прим.: Новые запрограммированные байты опций (пользователь, защита чтения / записи) загружаются после сброса системы.

Организация байт опций:

3 Уникальный идентификатор устройства (96 бит):

Уникальный идентификатор устройства идеально подходит:

● для использования в качестве серийных номеров (например, серийные номера USB-шнуров или другие конечные приложения)

● для использования в качестве ключей безопасности для повышения безопасности кода во флэш-памяти при использовании и объединении этого уникального идентификатора с программными криптографическими примитивами и протоколами перед программированием внутренней флэш-памяти

● активировать безопасные процессы загрузки и т. д.

96-битный уникальный идентификатор устройства предоставляет ссылочный номер, который уникален для любого устройства и в любом контексте. Эти биты никогда не могут быть изменены пользователем. 96-битный уникальный идентификатор устройства также может быть прочитан в отдельных байтах / словах / словах по-разному, а затем конкатенирован с использованием пользовательского алгоритма.

Похожие статьи