Сколько уже собирался, а только сейчас руки дошли проверить, как работает загрузчик STM32.
На макетке STM32P103 (с 64-ножечным STM32F103RBT6) от Olimex впаял резистор на 15кОм между перемычкой B0_L (подтяжка к земле для нормальной загрузки). Правда, резисторы SMD’шные у меня дома, пришлось паять обычный на 1/8Вт (уродство, конечно, но очень хотелось). Подключил четырьмя проводками (земля, +3.3В, Rx, Tx) к баксовому переходничку USB<->TTL (я их несколько штук на ибее купил) и воткнул в USB. Нажал кнопочку RESET, проводом закоротил B0_H и отпустил RESET. Отсутствие свечения тестового светодиода подсказало, что выполнение программки, которая там была прошита, не активировано.
На форумах пишут, что UART STM32 больше 115200 бит/с не тянет, поэтому запускаем так:
stm32flash -b115200 /dev/ttyUSB0
stm32flash - http://stm32flash.googlecode.com/
Serial Config: 115200 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (Medium-density)
- RAM : 20KiB (512b reserved by bootloader)
- Flash : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Resetting device... done.
Ура! Работает!
Кстати, последняя строчка не очень-то нужна иногда. Можно на досуге внести патчик — добавить еще ключ, по которому перезагрузка по выходу не будет произодиться (а то неудобно проводком замыкать). На плате систему управления ИК-спектрометром надо будет обязательно кнопочку воткнуть!
Для проверки записал в МК то же самое, что там уже было:
stm32flash -b115200 /dev/ttyUSB0 -w testproject. bin
stm32flash - http://stm32flash.googlecode.com/
Using Parser : Raw BINARY
Serial Config: 115200 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (Medium-density)
- RAM : 20KiB (512b reserved by bootloader)
- Flash : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Wrote address 0x08003754 (100.00%) Done.
Resetting device... done.
Вполне быстро. Я доволен. Можно забыть об огороженном st-link’е с JTAG!
P.S. Вот же рукожопие! Хотел сейчас проверить работоспособность «копеечного» приемника-передатчика на 315МГц и спалил из-за переплюсовки приемник ☹. Хорошо хоть два купил, в понедельник возьму из дома второй.
Tags: stm32, железяки
Bootloader, он же загрузчик, представляет собой микропрограмму, которая всегда находится в постоянной памяти (ROM) контроллера и запускается каждый раз, как только подается питание на устройство. Этот код первым выполняется и получает управление при каждом старте устройства.
ST-ONE представляет собой мини BIOS, только для маленькой системы.
ST-ONE имеет крайне малый размер для его огромных возможностей — всего 32 Кбайта. При запуске загрузчика происходит базовая инициализация устройства и другие важные процессы старта: восстановление текущего времени из backup-домена, при необходимости; проведение контрольных программных и аппаратных проверок; загрузка параметров запуска устройства; контроль лицензирования, установка и обновление ПО; защита устройства и ряд других задач. После завершения процессов инициализации и контроля, загрузчик передает управление основной программе (прошивке) и завершает свою работу. Для пользователя это выглядит незаметным, так как происходит мгновенно, а устройство сразу начинает выполнять свои функции.
ST-ONE обладает очень важной особенностью — он превращает MCU, в котором запускается, в стандартный USB-диск! Это позволяет подключить систему к компьютеру или смартфону и общаться с устройством путем обмена файлами как с обычной флешкой. Вы можете загрузить файлы с микропрограммой (прошивкой) и ее обновлениями путем обыкновенного копирования. Это исключает понятие «прошивки» устройства, а процедура обновления ПО ваших изделий становится простой и понятной даже неподготовленному пользователю. Так же на эмулируемом диске доступны конфигурационные файлы с параметрами (INI), в которых можно сконфигурировать начальное поведение вашего устройства или получить дополнительную информацию. Важной особенностью является возможность загрузчика обновлять самого себя! Получайте новый функционал и улучшения легким движением без программатора.
ST-ONE обладает большим базовым функционалом для управления микропрограммами и устройством. Имеет уникальный механизм расширения собственного функционала. Помимо богатых возможностей самого загрузчика, реализован механизм плагинов, который получил название «JACK».
Это микропрограммы-расширения — утилиты, которые можно подгружать прямо в момент работы бутлоадера не затрагивая основную систему. Перепрошивка или какие-либо изменения не требуется. Загрузка JACK-файла осуществляется простым копированием на сервисный диск — это второй диск, эмулируемый бутлоадером. JACK стирается после отключения питания или сброса системы в штатном режиме.Такой подход позволяет разнести возможности на по-настоящему неограниченные просторы не изменяя размер самого загрузчика и рамках ограниченных ресурсов. Jack-файлы для загрузчика можно найти в соответствующем разделе или создавать самостоятельно. Эти подпрограммы могут выполнять различные сервисные задачи самого загрузчика или устройства: снятие дампов, индикация состояний и т.п. Могут являться самостоятельными микропрограммами, например: мониторами портов, реализацией интерфейсов передачи данных, работать с периферией и памятью, тестировать устройство и многое другое! Возможности JACK-механизма ограничены лишь размером плагина и уровнем квалификации разработчика.
JACK доступен в сервисном режиме работы бутлоадера. Переключение в сервисный режим происходит специальной программной или аппаратной командой. Так же в сервисном режиме можно скачать с кристалла и сам загрузчик в виде файла, с целью резервного хранения на других носителях, на случай краха системы или потребности в восстановлении.
Работа с прошивками и лицензированиеST-ONE имеет мощный механизм лицензирования микропрограмм. Это позволяет распространять шифрованные прошивки в свободном доступе по открытым каналам связи, а запускать только в целевых устройствах. От пользователя потребуется ввести персональный или глобальный ключ на распространяемое программное обеспечение, если он необходим. Поддерживается несколько механизмов лицензирования ПО.
Для шифрования используется мощный механизм на базе AES128, который признан Агентством национальной безопасности США как стандарт безопасности. Распаковка прошивок происходит с использованием открытого и закрытого ключей. Возможность ввода ключа имеется в файлах конфигурации, а целостность ПО проверяется вычисляемыми MD5-суммами.
Загрузчик принимает следующие типы ПО:
Открытые прошивки доступны для тиражирования и скачивания прямо с кристалла микроконтроллера в виде файла. Готовы к распространению или перепрошивке в другие устройства. Зашифрованные прошивки недоступны для скачивания в открытом виде с MCU. После установки закрытой прошивки в кристалл, ряд механизмов программной и аппаратной защиты не дадут просто так скачать или прочитать микропрограмму. Это важно для коммерческих продуктов, которым необходимо обновление и поддержка, но требуется лицензионная и авторская защита.
Простой и понятный механизм обновления и передачи микропрограмм конечным потребителям, поднимает на совершенно новый уровень формат работы с пользователями устройств. Существенно упрощает работу обслуживающему персоналу снижая издержки.
Ключевые преимуществаНадежность. ST-ONE является хорошо оптимизированным, высокопроизводительным и мощным решением. Отказоустойчивость загрузчика находится на высоком уровне, а механизмы самозащиты и контроля целостности не позволят внести несанкционированные модификации в его код. В случае непреднамеренного разрушения загрузчика, под влиянием сторонних факторов или неправильная работа кода так же будет максимально исключена — произойдет аварийный останов системы.
Гибкое управление поведением загрузчика и процессом старта устройства.
Возможность аппаратного управления загрузчиком и его функциями путем подачи сигналов на заданные PIN-ы, или полное программное управление
с компьютера, смартфона, или планшета — путем подключения к
Реализована возможность менять параметры бутлоадера в привычном для многих INI-файле, в интуитивно-понятном формате через текстовый редактор. В настройки вынесены основные механизмы контроля и управления эмулируемой файловой системой, схема загрузки, настройка аппаратного обеспечения, конфигурация PIN-ов и др. PIN-ы управления и индикации, легко назначаются и переназначаются в конфигурационных файлах. Указывается метод управления — логический 0 или 1. Это значит, что загрузчик может быть тонко настроен и использован на различных аппаратных платформах, отличных от ST-ONE.
В файловой системе загрузчика, присутствует генерируемый, информационный файл с технической информацией. В нем можно получить краткую сводку по текущей системе: модель чипа, uniqueID, контрольные суммы MD5 прошивки, системное время, адреса точек входа для сборки прошивок, справочные данные по управлению загрузчиком и некоторые другие параметры. Этих данных достаточно для свободной работы с устройством. Для контроля целостности прошивки, сборки собственных микропрограмм или контакта с удаленной службой поддержки не обращаясь к документации и другим источникам.
Одним из основных преимуществ ST-ONE как USB-FLASH диска, является то, что к использованию доступна вся память кристалла, за исключением размера самого загрузчика. Это достигается путем мощных, нестандартных решений без вспомогательных средств и дополнительных микросхем памяти — только средствами MCU. Используется прозрачная эмуляция собственной, модифицированной файловой системы FAT12, что приближает эффективность использования ресурса контроллера к максимуму.
Это большое достоинство по сравнению с другими решениями этого класса! Так как в известных сторонних решениях может использоваться только до 45% памяти кристалла под основной код, еще 45% на обслуживание/обновление прошивки; до 7% — загрузчик, около 3% накладные расходы. В других случаях используются вспомогательные технические средства — дополнительные микросхемы памяти, программное и аппаратное обеспечение, драйвера, другие интерфейсы и механизмы, что значительно усложняет конечное устройство, снижая отказоустойчивость, универсальность и надежность. Увеличивает стоимость и энергопотребление. Очень многие загрузчики, в том числе под другие системы, не умеют обновлять сами себя — требуется программатор. ST-ONE не имеет таких недостатков, а перечень ключевых преимуществ и возможностей еще более широк (см. в соответствующих разделах документации).
Системные требованияФактически, системные требования отсутствуют. Устройство имеющее на борту загрузчик ST-ONE использует стандартизированные протоколы и механизмы обмена по шине USB. Это придает невероятную гибкость, свободу действий и кросс-платформенность. Пользователь не зависит от программного обеспечения вендора. Не требуется программатор или другие технические средства. Уровень квалификации технического персонала может быть минимальным.
Для работы с устройством под управлением ST-ONE не потребуются драйвера. Загрузчик совместим со всеми операционными системами: Windows, Linux, Android, MacOS и др. Не требует дополнительных модулей и программных продуктов. Управление устройством осуществляется с помощью системных утилит, которые есть в любой операционной системе. Сразу готов к работе после подачи питания или подключения.
Настраиваемый загрузчик для микроконтроллеров STM32. Этот проект включает в себя демонстрацию для различного оборудования того, как выполнять программирование в приложении прошивки, расположенной на внешней SD-карте с файловой системой FAT32.
В каждом примере используется одна и та же библиотека загрузчика, расположенная в папке lib/stm32-bootloader
. Примеры находятся в папке проектов
и поставляются с отдельным выделенным файлом README с описанием, относящимся к этой конкретной реализации.
Обновление: пример STM32L496-Discovery
поддерживает компиляцию и сборку проекта с помощью готовой цепочки инструментов GNU Arm Embedded Toolchain (ARM GCC) в дополнение к IAR EWARM. Ознакомьтесь с проектом README для получения дополнительной информации.
Пожалуйста, обратитесь к https://akospasztor.github.io/stm32-bootloader для получения полной документации по исходному коду библиотеки загрузчика.
Репозиторий
├acks Docs
├ack Drivers
│ ├ ├^ CMSIS
│ └—S STM32L4XX_HAL_DRIRIR
├мобил
│ ├ ├ ├ ЩЕ
├ ├
│ ├ ├ ├ ├ ├ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│. загрузчик
└── проекты
├── STM32L476-CustomHw
├── STM32L496-CustomHw
└── крышка STM32L49 6Dis32L4
Папка docs
содержит сгенерированную документацию исходного кода загрузчика и другие статические файлы, связанные с документацией.
Папка драйверов
содержит драйверы CMSIS (стандарт программного интерфейса микроконтроллера Cortex), а также драйверы HAL (уровень аппаратной абстракции) от ST.
Исходный код загрузчика и соответствующий заголовочный файл можно найти в папке lib/stm32-bootloader
. Кроме того, папка lib
также содержит библиотеку FatFs.
Различные демонстрации находятся в папке проектов
. Каждый пример проекта содержит папку include
и source
, в которой расположены соответственно заголовочный и исходный файлы. Файлы компилятора и SDK находятся в соответствующих подпапках. Кроме того, каждый пример проекта имеет специальный файл README, подробно объясняющий его функциональность.
Этот репозиторий содержит следующие примеры.
Микроконтроллер | Hardware | Project path |
---|---|---|
STM32L476VG | Custom | projects/STM32L476-CustomHw |
STM32L496VG | Custom | projects/STM32L496-CustomHw |
STM32L496AG | 32L496GDISCOVERY | projects/STM32L496 -Discovery |
Загрузчик можно легко настроить и адаптировать к требуемому оборудованию и среде, т. е. для выполнения обновлений прошивки через различные интерфейсы или даже для реализации обновлений по беспроводной сети (OTA), если аппаратное обеспечение включает в себя модули беспроводной связи. Для успешного программирования в приложении необходимо соблюдать следующую последовательность:
Bootloader_Init()
. Bootloader_Erase()
. Bootloader_FlashBegin()
. Bootloader_FlashNext()
. Процедура программирования требует, чтобы 8 байтов данных (двойное слово) были одновременно запрограммированы во флэш-память. Эта функция автоматически увеличивает адрес, по которому записываются данные. Bootloader_FlashEnd()
.Образ приложения должен быть в двоичном формате. Если проверка контрольной суммы включена, двоичный файл должен включать значение контрольной суммы в конце изображения. При создании образа приложения необходимо вычислить контрольную сумму по всему образу (кроме области контрольной суммы) со следующими параметрами:
Важные примечания :
system_stm32xxxx.c
. Это должно быть либо отключено (загрузчик может быть настроен на выполнение перемещения векторной таблицы перед переходом), либо вручную установить регистр смещения векторной таблицы (VTOR) на соответствующее значение смещения, которое является начальным адресом пространства приложения. Для получения дополнительной информации см. [1]. Загрузчик можно широко настроить в файле bootloader.h
. Файл включает подробные комментарии и описания, относящиеся к настраиваемым параметрам и определениям.
[1] PM0214, «Руководство по программированию Cortex®-M4 для серий STM32F3, STM32F4, STM32L4 и STM32L4+», http://www. st.com/resource/en/programming_manual/dm00046982.pdf
Последнее обновление: 22 июля 2022 г. Цель этой серии — предоставить простые и практические примеры, понятные каждому. Этот пост посвящен загрузчику в STM32F76xxx (дизайн загрузчика), где мы обсуждаем, как спроектировать загрузчик.
Мы также прикрепили пояснение к видео внизу этого поста.
Содержание
В этом руководстве мы будем использовать концепции, которые уже были объяснены в приведенных ниже руководствах. Поэтому я бы попросил вас сначала пройти эти уроки, если вы не знакомы с этими темами.
В нашем последнем посте мы обсудили, что такое загрузчик и зачем он нам нужен в нашем проекте. Из этого поста мы перейдем к реализации загрузчика. Прежде чем внедрять загрузчик, мы должны знать, каким должен быть наш загрузчик. Итак, нам нужно разработать собственный загрузчик. Мы разработаем собственный загрузчик.
Перед проектированием загрузчика, если вы знаете, что происходит, когда вы нажимаете кнопку сброса в микроконтроллере, это поможет вам лучше понять.
В этой серии руководств мы будем использовать флэш-память в качестве режима одного банка. Один пробел разделен на несколько секторов, как показано ниже.
Мы обсудим режимы загрузки, доступные в устройствах STM32F767xxx. Когда вы нажимаете кнопку сброса, процессор начинает работать с адреса 0x00000000. Но мы можем изменить это, используя эти режимы загрузки. Каждый микроконтроллер имеет один или несколько загрузочных контактов. Используя это, мы можем сказать процессору начать с адреса, который нам нужен. Чтобы узнать режимы загрузки ваших устройств STM32, ознакомьтесь с справочным руководством вашего STM32. STM32F76xxx имеет только один загрузочный контакт (а не два). Обратитесь к изображению ниже, которое было взято из таблицы данных.
Здесь Если контакт BOOT0 заземлен, то он будет начинаться с адреса 0x00200000
. Если на выводе BOOT0 высокий уровень во время включения, он начнется с адреса 0x00100000
, где находится системный загрузчик. Но мы не хотим запускать системный загрузчик. Мы хотим запустить наш загрузчик. В этом случае мы можем оставить контакт BOOT0 заземленным и поместить наш код загрузчика в 0x08000000 9.0006
.
Я знаю, вы запутаетесь. Мы помещаем наш код загрузчика в 0x08000000
, а контроллер начинается с 0x00200000
. Как это воспримет наш загрузчик? На самом деле оба указывают на одно и то же воспоминание. Разница только в шине, которая используется для доступа к этой памяти. В STM32F767Zi доступ к 0x00200000
будет осуществляться с использованием шины ITCM , где у нас есть разрешение только на чтение и выполнение, но не на запись. Но адрес 0x08000000
будут доступны по шине AXI , где у нас есть разрешение на чтение, запись и выполнение. Вот почему мы записываем наш загрузчик в эту память, и процессор будет читать эту память, используя шину ITCM. Для понимания можно предположить, что 0x00200000
— это псевдоним 0x08000000
.
Если хотите это проверить, то запишите загрузчик в 0x08000000
и прочитайте 0x00200000
. В обоих адресах будут присутствовать одни и те же данные.
Ранее мы говорили, что микроконтроллер запустится с адреса 0x00000000
, тогда как можно изменить адрес на какой-то другой? Вот где в игру вступает алиасинг памяти. Если контакт BOOT0 заземлен, то 0x00200000
будет действовать как 0x00000000
. В противном случае 0x00100000
будет действовать как 0x00000000
. Я надеюсь, что вы ясно теперь.
Примечание: Это действительно для STM32F767Zi. Проверьте техническое описание вашего контроллера.
Для получения более подробной информации вы можете обратиться к техническому описанию STM32F76xxx.
Системный загрузчик в STM32 — это загрузчик, предоставленный производителями чипов. Что мы не можем перезаписать, так как он загрузился в память ПЗУ. Мы также можем назвать это загрузчиком ПЗУ. Используя этот загрузчик, мы можем обновить прошивку или приложение из загрузчика. Но мы не можем выполнять многие операции, такие как обновление приложения по беспроводной сети, как OTA. Итак, написание собственного загрузчика на STM32 поможет нам реализовать все, что нам нравится.
Ранее мы обсудили некоторые важные вещи, связанные с памятью, и поняли, что лучше написать собственный загрузчик вместо использования системного загрузчика в нашем проекте. Перейдем к загрузчику. Итак, мы поместим загрузчик в 0x08000000
, и когда система включится, она запустит загрузчик. Затем мы должны поместить приложение в другую память. Из загрузчика мы должны вызвать приложение. Это просто, верно? Но это не так.
Во-первых, мы должны решить, где хранить приложение и загрузчик. В этой серии я также собираюсь сохранить два пространства резервных копий для приложения, где я буду хранить текущую версию приложения (слот 1) и предыдущую версию приложения (слот 2). У меня есть флэш-память на 2 МБ в STM32F767Zi. Вот почему я решил сохранить две версии приложения в качестве резервной копии. Основываясь на имеющейся у вас памяти, вы можете определить количество слотов.
0x08000000
по 0x0800FFFF
) ( 64KB ). 0x08040000
по 0x080BFFFF
) ( 512KB ). 0x080C0000
по 0x0813FFFF
) ( 512 КБ ). 0x08140000
по 0x081BFFFF
) ( 512 КБ ). 0x08020000
до 0x0803FFFF
) ( 128 КБ ).Посмотрите на изображение ниже для лучшего понимания.
Теперь мы доработали область памяти для хранения приложения, загрузчика и приложений резервного копирования. Мы должны спланировать работу загрузчика и приложения.
Я разработал загрузчик и приложение, как показано на рисунке ниже.
Примечание: Этот дизайн предназначен только для образовательных целей. Может быть что-то, что мы можем улучшить. Некоторые ошибки также будут в этом дизайне.
Описание этапов процесса загрузчика приведено ниже.
Загрузчик запускается при включении или сбросе микроконтроллера.
Убедитесь, что кнопка загрузки пользователя нажата. Этот штифт загрузки не совпадает с контактом BOOT0 . Этот PIN-код загрузки является нашим PIN-кодом загрузчика для идентификации процесса обновления прошивки/приложения.
Получение данных от UART.
Запишите полученные данные либо в слот 1, либо в слот 2 в зависимости от доступности.
Сбросьте микроконтроллер, чтобы загрузчик снова заработал.
Причины перезагрузки будут храниться в определенной области. Прочтите причину перезагрузки и перейдите к блоку B7, блоку B8, блоку B10 и блоку B13.
Поскольку это самая первая загрузка, загрузчик скопирует приложение из слота 1 в фактическую область приложения, которая имеет вид 0x08040000
. Затем перейдите к блоку B11.
Проверьте CRC из фактического местоположения приложения. Это поможет нам определить, было ли приложение изменено каким-либо хакером или повреждена память.
Передать управление приложению.
Если приложение запрашивает загрузку предыдущего приложения, перейдите к Блоку B14.
Скопируйте старое приложение из слота 1 или слота 2 в актуальное приложение и перейдите к блоку B11.
Если проверка CRC не удалась, не запускайте приложение и оставайтесь там.
Ниже приводится описание шагов процесса приложения.
Загрузчик запускает приложение. Затем перейдите к блоку A2.
Проверьте наличие прерывания GPIO.
Мигает светодиод.
Мы получили прерывание, что означает, что доступен какой-то пакет OTA. Итак, напишите причину перезагрузки в виде ОТА-запроса. Затем идите к блоку A5.
Сброс устройства. Так что Bootloader получит пакет OTA и обновит его.
Наша цель — реализовать логику, которую мы объяснили выше. Мы разделяем реализацию на несколько постов.
Пожалуйста, ознакомьтесь с приведенным ниже видео объяснением.
В следующем посте мы напишем базовый загрузчик на STM32, который дает управление приложению.