Готовую программу надо каким-либо образом запихать в контроллер. Для этого существует множество способов.
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 содержит необходимую нам функцию. Сам регистр, а также работа с флеш-памятью описана в документе . Однако перед этим вспомним как реализована защита многократного включения заголовочных файлов. Мы использовали такие директивы препроцессора как:
Создадим идентификатор, который будет говорить, что данная сборка финальная. Пока данная строка закомментирована - код помещённый между #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-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
.
Подключаем переходник usb-uart
к компьютеру и в зависимости от того на какой микросхеме он сделан CP2120
или FT232
, устанавливаем соответствующие драйвера. После этого он должен определиться в системе как COM_PORT.
iletmuseum.ru - Интернет. Защита. Система. Обзоры программ. Периферия