STM32 — это очень просто. Зашита от считывания прошивки stm32 Прошивка STM32 с помощью USB-Uart переходника под Windows

Готовую программу надо каким-либо образом запихать в контроллер. Для этого существует множество способов.

JTAG/SWD адаптер
Так как часто для отладки под ARM используется JTAG, то этот метод получается наверное самым популярным. Для этой цели используется какой-либо адаптер. Например я использую так что показывать буду на его примере. Там все просто — подключаешь адаптер к контроллеру стандартным SWD или JTAG шлейфом. Через линии NRST/TDI/TDO/TCK/TMS для JTAG или через SWO/SWOCLK/SWDIO/NRST для SWD режима. На адаптере моей верси CoLinkEX оба эти разьема выведены на одну колодку, так что получается как бы сразу и JTAG и SWD соединение. А там какое надо такое и выбираешь. Особой разницы в отладке/прошивке между ними нет.

Либо используя утилитку CoFlash oт CooCox.com

Чтобы Keil сгенерировал hex файл нужно выставить галочку в опциях проекта.

Формат там такой:

fromelf --bin --output .\имя_будущего_файла.bin .\имя_создаваемого_файла.axf

Ну или, если выходные файлы создаются в какой-либо подпапке, то путь будет включать и эту подпапку

Первичный Bootloader
Если нет JTAG/SWD адаптера, то не беда. Достаточно иметь переходник или так как почти все ARM контроллеры содержат в памяти аппаратно встроенный бутлоадер, позволяющий накатить прошивку. Главное следить за тем, чтобы напряжение на выходе с адаптера совпадало с напряжением питания контроллера, а то можно пожечь входы (FTDI можно запитать от 3.3 вольт. А для работы с RS232 использвоать не MAX232, а MAX3232 — то же самое, но на 3.3 вольта). Я в качестве USB-UART использую свою демоплату с джампером питания выставленным на 3.3 вольта. Питание беру с той же платы.

Вход Boot_0 выставыляю в 1, вход Boot_1 выставляю в 0. Набрасываю на RX1 и TX1 контроллера STM32F103C8 проводочки от RX-TX микрохсемы FTDI

Настраиваем порт, жмем Next

Тут можно посмотреть какие страницы флеша нам доступны на запись. Жмем Next

Для LPC от NXP используется другая утилитка, зовется она Flash Magic — те же яйца, вид сбоку. Разве что может быть для входа в загрузчик надо другие выводы коротить. Это надо в User Manual на LPC уточнять уже.

Mass Storage USB Bootloader
Кроме того, у LPC1343 (у других LPC не встречал) есть одна прикольня фича. Там встроенный загрузчик может работать и по USB. Для этого надо собрать следующую схему:

В противном случае мы, наверное, считаем мусор. А если удалить файл firmware.bin и на ее место записать файл с бинариком новой прошивки, то он вольется во флеш. Усе, не надо больше ничего! Красота! Правда в линухе оно работает не так как надо, дело в том, что линух пишет туда начиная со второго чтоль сектора и в результате Epic Fail. Впрочем, там же есть замечательная утилитка dd которая может скопировать на эту «флешку» файл в точности как надо, с нулевого адреса.

Вторичный бутлоадер
Поскольку я решил зарыться в STM32, то мне тоже захотелось такую вкусняшку как USB boot в режиме mass storage. Забросил идею Владимиру aka RtxOnAir и в результате он, за пару дней, выдал аналогичное решение для STM32F103.

Для загрузки с USB нужна следующая схема:


Транзистор подтягивает линию D+ к питанию и это означает, что на шине кто то появился, заставляя OС компа произвести определение устройства. Можно сделать и по колхозному. Подтянуть D+ через резистор напрямую. Но в этом случае для входа в бут придется передергивать шнур USB, иначе винда не захочет находить устройство. А так контроллер сам дернет вожжу.

Штука у Владимира получилась классная — автоматом определяет все типы кристаллов серии F103, позволяет выбрать любую ногу для передергивания USB шиной. Для входа во вторичный бутлоадер надо выводы Boot_0 и Boot_1 посадить на землю и нажать RESET ну или воткнуть девайс в USB если шина у нас не коммутируемая. Также можно выбирать работу от внутреннего генератора или от внешнего.

Вообще, инструкция явно говорит, что USB может работать только от внешнего кварцевого резонатора, т.к. частота внутреннего нестабильная и вообще кака. Не будем спорить с создателями камня, но у нас наш бутлоадер отлично завелся на HSI и при комнатной температуре отлично работал. Впрочем, стабильность тут явно не на высоте и надо быть осторожным.

Конфигурация бутлоадера
Для конфигурации нашего бута RtxOnAir написал небольшую утилитку:

Запустив которую можно выбрать нужные опции и нажав «Ок» получить сконфигурированный бутлоадер, который надо залить в МК любым вышеуказанным способом. Переключив джамперы Boot0 и Boot1 в режим нормальной работы Boot0=0 Boot1=1 и нажав сброс мы должны увидеть как в системе появится новый USB Mass Storage диск с емкостью равным размеру флеш памяти нашего кристалла за вычетом размеров бутлоадера.

Конфигурация проект под вторичный Bootloader
Поскольку этот бутлоадер распологается в области откуда обычно идет пользовательская прошивка, то в создаваемых под него проектах надо немного сконфигурировать опции линковки и компиляции, чтобы они начинались с области не занятой бутом. Для этого в Keil надо в опции проекта подправить начальный адрес:

После чего файлы прошивки можно банальным копированием загонять в STM32 и никакой программатор или адаптер больше не нужны совсем. Красота же!

Допустим вы выпустили на рынок своё устройство и опасаетесь того, что кто-то начнёт его копировать… Действительно - достаточно подключиться программатором к нашему устройству и считать прошивку, например, через утилиту ST-Link Utility (Target Connect ).

Конечно можно просто оторвать ножки микроконтроллера… но разработчики ST Microelectronics предлагают альтернативу получше. У всех МК есть система защиты (read out protection). Суть её крайне проста - если в специальном регистре (Option bytes) установлено определённое значение - то возможность отладки и считывания прошивки отключается. В таком режиме у вас также пропадёт возможность перепрошивки МК. Разумеется, эту защиту можно отключить, поменяв значение в регистре Option bytes, однако в таком случае память программы будет затёрта, а значит её никто не сможет скопировать.

Поменять значение в регистре можно при помощи всё той же ST-Link Utility, Target Option Bytes… Read out protection ENABLE .


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

Для реализации защиты удобно воспользоваться стандартной библиотекой периферии, а конкретно stm32f10x_flash.c содержит необходимую нам функцию. Сам регистр, а также работа с флеш-памятью описана в документе . Однако перед этим вспомним как реализована защита многократного включения заголовочных файлов. Мы использовали такие директивы препроцессора как:

  • #define - директива указывает препроцессору заменять строку в файле, однако если аргумент (то что стоит в конце) не указывается сам идентификатор (то что по середине) остётся в системе и может быть проверен другими директивами (т.е. можно написать условие, при котором определённый код будет выполняться или наоборот);
  • #ifndef - директиву можно прочитать как «если не определенно», однако нам больше подойдёт другая #ifdef - «если определенно»;
  • #endif - директива указывающая конец условия.

Создадим идентификатор, который будет говорить, что данная сборка финальная. Пока данная строка закомментирована - код помещённый между #ifdef и #endif выполняться не будет.

//#define RELEASE

При конечной сборке достаточно просто раскомментировать строчку и прошить устройство.

#ifdef RELEASE // code here #endif

А теперь к самой сути. Мы уже разбирались как работать с внутренней флеш-памятью микроконтроллера. Перед записью битов защиты необходимо разблокировать доступ к памяти, затем необходимо произвести нужные операции и снова заблокировать доступ. Получается следующее:

#ifdef RELEASE #warning "Protection is ON. Debug is OFF" if (FLASH_GetReadOutProtectionStatus() == RESET) { FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); } #endif

Сегодня мы будем защищать прошивку на stm32 от считывания кул-хакерцами. Дабы не тянуть резину, вот кусок кода:

#ifdef NDEBUG if (FLASH_GetReadOutProtectionStatus() == RESET) { FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); } #endif

Как не сложно догадаться, кусок использует библиотеку от stm. Такой кусок кода использовать очень удобно - контроллер сам устанавливает свою защиту при первом запуске, а первый запуск легко организовать после прошивки. Вот она, свобода от тирании фьюзов!

Да, я знаю, насчет холивора насчет «библиотека vs непосредственное обращение к регистрам». Моя позиция тут такова - если нужна большая скорость, или осталось совсем мало памяти, но нужно непосредственное обращение к регистрам. Если и скорость не важна и памяти много, лучше использовать библиотеку - так программа пишется быстрее и получается более читаемая.

Снять защиту
Контроллер то мы защитили. Но вот беда - нужно поправить нашу программу, а при установленной защите ничего с контроллером сделать нельзя - ни прочитать ни записать. Как снять защиту? Сразу предупреждаю - ребята из ST все сделали правильно и вместе с защитой уничтожается вся прошивка.

Для снятия защиты нам понадобится программа st-link utility. Скачать ее можно .

Запускаем программу и выбираем вот этот пункт, либо просто жмем ctrl-b:

В поле «состояние защиты от чтения выбираем выключено». И нажимаем кнопку Apply:

Вместе с битом защиты стирается и вся память:

Защищайтесь, мы за безопасный эмбед.

Ну, вот мы и дошли до одного из самых интересных этапов, — как же залить в контроллер готовую прошивку и оживить наконец нашу железяку.

Вообще-то прошивать контроллеры STM32 можно по-разному, но мы рассмотрим самый простой вариант прошивки — через последовательный интерфейс с помощью фирменной утилиты Flash Loader Demonstrator. Эта утилита совершенно бесплатна и её можно скачать как с официального , так и .

Как мы ранее уже говорили, — в системной области памяти контроллера зашит bootloader. Именно он и позволяет записать прошивку во flash-память через последовательный интерфейс.

Детально bootloader описан в документе AN2606 (CD00167594.pdf), а используемый им протокол — в документе AN3155 (CD00264342.pdf). Это для тех, кто хочет исчерпывающей информации, а мы рассмотрим процесс прошивки через bootloader вкратце.

Для начала вам нужно скачать и установить себе на компьютер утилиту Flash Loader Demonstrator.

Итак, ногу Tx контроллера нужно соединить с ногой Rx преобразователя, а ногу Rx контроллера — с ногой Tx преобразователя. Кроме этого, контроллер нужно запитать и обеспечить нужные уровни на ногах BOOT0 (pin 44), BOOT1 (pin 20). Для запуска bootloadera, который расположен в system memory, ногу BOOT1 нужно подтянуть к «земле», а BOOT0 — к «питанию» (табличка справа).

Подтяжку для BOOT0, BOOT1 лучше делать не жёсткую, а джамперами, чтобы можно было легко выбирать режимы загрузки (например, переключившись после заливки проги в режим загрузки из flash, можно будет эту прогу сразу и потестить).

Схема подключения показана ниже.

Чётность и количество бит данных уже настроены как надо, скорость можно менять — контроллер в процессе инициализации обмена настраивается на выбранную скорость автоматически, com-порт нужно выбрать тот, который создался при подключении USB-to-COM преобразователя к компьютеру (наш преобразователь создаёт при подключении виртуальный com-порт, полностью имитирующий настоящий аппаратный). После того, как всё настроили — жмём «Next».

О том, что всё нормально и соединиться с контроллером удалось, нам сообщит зелёный сигнал светофора на следующей страничке. Если связь не установится — на эту страничку нас вообще не пустят, сообщив, что контроллер не отвечает.

При установлении связи программа автоматически определит сколько у контроллера flash-памяти и защищена ли эта память от чтения. Нажав кнопку «Remove protection» защиту можно снять, но при этом содержимое флеша будет стёрто (предыдущая записанная туда прошивка уничтожится). Жмём «Next».

В следующем окне нам предлагают выбрать тип программируемого камня (хотя непонятно зачем, — он и так автоматически определяется), а также показывают для нашего камня PID, карту flash-памяти, и версию bootloader-а. Просто жмём «Next».

В следующем окне нужно выбрать, что мы собственно хотим с нашим контроллером делать. Тут возможны следующие варианты: Erase (стереть), Download to device (загрузить в контроллер прошивку), Upload from device (считать прошивку с контроллера), Enable/Disable Flash protection (включить/выключить защиту flash-памяти), Edit option bytes (изменить байты опций). Соответственно, если мы хотим залить прошивку — выбираем Download to device, потом жмём на квадрат с тремя точками и выбираем в проводнике файл с прошивкой, которую надо залить, после чего опять жмём «Next».

На следующей странице внизу появится прогресс-бар, в котором будет показан ход выполнения процедуры загрузки. После того, как вся прошивка будет загружена в контроллер, этот прогресс-бар станет зелёным и в нём белыми буквами будет написано: «Download operation finished successfully» (операция загрузки успешно завершена). После этого, можно нажать кнопку «Close» и закрыть Flash Loader Demonstrator

Всё, теперь чтобы залитая программа начала выполняться нам останется только настроить контроллер на загрузку из flash (BOOT0 = 0, BOOT1 — любой уровень) и перезагрузить его.

Самый простой и доступный способ прошивки STM32 – с помощью бутлоудера , в этой статье мы рассмотрим как это сделать на примере платы miniSTM32F103V .

Для начала давайте разберёмся, что такое бутлоадер или как его ещё называют загрузчик . Загрузчик - это просто программа, которая хранится в определённой секции памяти и может перезаписывать флеш микроконтроллера. Она зашивается при производстве чипа и её нельзя изменить каким-либо образом. Для того чтобы микроконтроллер зашёл в эту секцию памяти, надо вывод BOOT0 подтянуть к питанию, а вывод BOOT1 к земле. На плате эти два вывода находятся возле usb разъема, а подтяжка осуществляется с помощью перемычек.
Ниже приведена таблица, которая определяет с какой области памяти запустится микроконтроллер после сброса, в зависимости от BOOT0 и BOOT1 .


Предположим мы установили перемычки, теперь надо передать загрузчику hex-файл с прошивкой, передавать будем по uart , для этого нам потребуется преобразователь usb-uart .


У меня такой преобразователь сделан на основе микросхемы FT232RL , используя тонкое жало для паяльной станции запаять её очень просто. Методика запайки следующая, первым дело надо прихватить по ножке с двух противоположных углов, затем когда микросхема зафиксирована, пропаять остальные ножки паяльником или феном. И последний штрих, ещё раз пропаиваем ножки, которые запаяли первыми, чтобы снять с них механическое напряжение.

Подключаем переходник usb-uart к компьютеру и в зависимости от того на какой микросхеме он сделан CP2120 или FT232 , устанавливаем соответствующие драйвера. После этого он должен определиться в системе как COM_PORT.


Теперь подключим наш переходник к плате, вывод RX переходника соединяем с выводом MCU_TхD , а вывод ТХ с выводом MCU_RхD . Топология платы, которую выслал продавец, немного отличается от той, что на верхней картинке, выводы для прошивки выведены отдельно и отмечены красными стрелочками.


Далее надо скачать программу, с помощью которой будем связываться с загрузчиком, называется она FLASH LOADER DEMONSTRATOR .


После установки программы выбираем com port, под которым определился наш переходник usb-uart и нажимаем кнопку NEXT, скорость определится автоматически. Если контроллер защищён от считывания, то защиту можно снять, нажав кнопку "Remove Protection" при этом флеш память будет стёрта и соответственно все данные, которые в ней записаны потеряны.


Если контроллер не защищён появится окно изображенное ниже, в нём нажимаем кнопку NEXT.


В следующем окне нужно выбрать, что мы хотим сделать: считать/записать флеш микроконтроллера, стереть её, запретить чтение\запись, нас интересует запись, для этого выбираем файл, который хотим загрузить и нажимаем NEXT.

Что еще почитать