8-900-374-94-44
[email protected]
Slide Image
Меню

Загрузчик stm32: Загрузчик с шифрованием для STM32 / Хабр

Bootloader на STM32 — Емельянов Эдуард Владимирович — LiveJournal

?
Bootloader на STM32
eddy_em
June 20th, 2014

Сколько уже собирался, а только сейчас руки дошли проверить, как работает загрузчик STM32.

На макетке STM32P103 (с 64-ножечным STM32F103RBT6) от Olimex впаял резистор на 15кОм между перемычкой B0_L (подтяжка к земле для нормальной загрузки). Правда, резисторы SMD’шные у меня дома, пришлось паять обычный на 1/8Вт (уродство, конечно, но очень хотелось). Подключил четырьмя проводками (земля, +3.3В, Rx, Tx) к баксовому переходничку USB<->TTL (я их несколько штук на ибее купил) и воткнул в USB. Нажал кнопочку RESET, проводом закоротил B0_H и отпустил RESET. Отсутствие свечения тестового светодиода подсказало, что выполнение программки, которая там была прошита, не активировано.


Еще давно отсюда я скачал утилиту stm32flash, позволяющую прошивать эти МК через загрузчик. И даже собрал для арча бинарный пакет.

На форумах пишут, что 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, железяки

Загрузчик ST-ONE для STM32 — большая мощь в маленькой системе

Bootloader, он же загрузчик, представляет собой микропрограмму, которая всегда находится в постоянной памяти (ROM) контроллера и запускается каждый раз, как только подается питание на устройство. Этот код первым выполняется и получает управление при каждом старте устройства.

ST-ONE представляет собой мини BIOS, только для маленькой системы.

ST-ONE имеет крайне малый размер для его огромных возможностей — всего 32 Кбайта. При запуске загрузчика происходит базовая инициализация устройства и другие важные процессы старта: восстановление текущего времени из backup-домена, при необходимости; проведение контрольных программных и аппаратных проверок; загрузка параметров запуска устройства; контроль лицензирования, установка и обновление ПО; защита устройства и ряд других задач. После завершения процессов инициализации и контроля, загрузчик передает управление основной программе (прошивке) и завершает свою работу. Для пользователя это выглядит незаметным, так как происходит мгновенно, а устройство сразу начинает выполнять свои функции.

ST-ONE обладает очень важной особенностью — он превращает MCU, в котором запускается, в стандартный USB-диск! Это позволяет подключить систему к компьютеру или смартфону и общаться с устройством путем обмена файлами как с обычной флешкой. Вы можете загрузить файлы с микропрограммой (прошивкой) и ее обновлениями путем обыкновенного копирования. Это исключает понятие «прошивки» устройства, а процедура обновления ПО ваших изделий становится простой и понятной даже неподготовленному пользователю. Так же на эмулируемом диске доступны конфигурационные файлы с параметрами (INI), в которых можно сконфигурировать начальное поведение вашего устройства или получить дополнительную информацию. Важной особенностью является возможность загрузчика обновлять самого себя! Получайте новый функционал и улучшения легким движением без программатора.

Функциональные возможности

ST-ONE обладает большим базовым функционалом для управления микропрограммами и устройством. Имеет уникальный механизм расширения собственного функционала. Помимо богатых возможностей самого загрузчика, реализован механизм плагинов, который получил название «JACK».

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

Такой подход позволяет разнести возможности на по-настоящему неограниченные просторы не изменяя размер самого загрузчика и рамках ограниченных ресурсов. Jack-файлы для загрузчика можно найти в соответствующем разделе или создавать самостоятельно. Эти подпрограммы могут выполнять различные сервисные задачи самого загрузчика или устройства: снятие дампов, индикация состояний и т.п. Могут являться самостоятельными микропрограммами, например: мониторами портов, реализацией интерфейсов передачи данных, работать с периферией и памятью, тестировать устройство и многое другое! Возможности JACK-механизма ограничены лишь размером плагина и уровнем квалификации разработчика.

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

JACK доступен в сервисном режиме работы бутлоадера. Переключение в сервисный режим происходит специальной программной или аппаратной командой. Так же в сервисном режиме можно скачать с кристалла и сам загрузчик в виде файла, с целью резервного хранения на других носителях, на случай краха системы или потребности в восстановлении.

Работа с прошивками и лицензирование

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

Для шифрования используется мощный механизм на базе AES128, который признан Агентством национальной безопасности США как стандарт безопасности. Распаковка прошивок происходит с использованием открытого и закрытого ключей. Возможность ввода ключа имеется в файлах конфигурации, а целостность ПО проверяется вычисляемыми MD5-суммами.

Загрузчик принимает следующие типы ПО:

  • Открытые прошивки
  • Зашифрованные прошивки для всех устройств (работает везде, где введен ключ)
  • Зашифрованные прошивки для конкретного устройства по ID (персонализированные)

Открытые прошивки доступны для тиражирования и скачивания прямо с кристалла микроконтроллера в виде файла. Готовы к распространению или перепрошивке в другие устройства. Зашифрованные прошивки недоступны для скачивания в открытом виде с MCU. После установки закрытой прошивки в кристалл, ряд механизмов программной и аппаратной защиты не дадут просто так скачать или прочитать микропрограмму. Это важно для коммерческих продуктов, которым необходимо обновление и поддержка, но требуется лицензионная и авторская защита.

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

Ключевые преимущества

Надежность. ST-ONE является хорошо оптимизированным, высокопроизводительным и мощным решением. Отказоустойчивость загрузчика находится на высоком уровне, а механизмы самозащиты и контроля целостности не позволят внести несанкционированные модификации в его код. В случае непреднамеренного разрушения загрузчика, под влиянием сторонних факторов или неправильная работа кода так же будет максимально исключена — произойдет аварийный останов системы.

Гибкое управление поведением загрузчика и процессом старта устройства. Возможность аппаратного управления загрузчиком и его функциями путем подачи сигналов на заданные PIN-ы, или полное программное управление с компьютера, смартфона, или планшета — путем подключения к

USB.

Реализована возможность менять параметры бутлоадера в привычном для многих 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: Загрузчик STM32

Настраиваемый загрузчик для микроконтроллеров STM32. Этот проект включает в себя демонстрацию для различного оборудования того, как выполнять программирование в приложении прошивки, расположенной на внешней SD-карте с файловой системой FAT32.

В каждом примере используется одна и та же библиотека загрузчика, расположенная в папке lib/stm32-bootloader . Примеры находятся в папке проектов и поставляются с отдельным выделенным файлом README с описанием, относящимся к этой конкретной реализации.

Обновление: пример STM32L496-Discovery поддерживает компиляцию и сборку проекта с помощью готовой цепочки инструментов GNU Arm Embedded Toolchain (ARM GCC) в дополнение к IAR EWARM. Ознакомьтесь с проектом README для получения дополнительной информации.

Пожалуйста, обратитесь к https://akospasztor.github.io/stm32-bootloader для получения полной документации по исходному коду библиотеки загрузчика.

  • Функции загрузчика
  • Организация исходного кода
  • Примеры
  • Как использовать
  • Конфигурация
  • Каталожные номера
  • Конфигурируемое пространство приложения
  • Стирание флэш-памяти
  • Программирование флэш-памяти
  • Проверка флэш-памяти после программирования
  • Проверка контрольной суммы
  • Проверка защиты флэш-памяти, включение/выключение защиты от записи
  • Расширенная обработка ошибок, отказоустойчивая конструкция
  • Обновление прошивки загрузчика и возможность полного перепрограммирования чипа: вход во встроенный загрузчик ST из программного обеспечения (без срабатывания булавки BOOT)
  • Последовательная трассировка через SWO для упрощения отладки и разработки
  • Простота настройки и портирования на другие микроконтроллеры

Репозиторий

├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), если аппаратное обеспечение включает в себя модули беспроводной связи. Для успешного программирования в приложении необходимо соблюдать следующую последовательность:

  1. Проверить наличие защиты от записи во флэш-память и при необходимости отключить ее.
  2. Инициализировать флэш-память с помощью Bootloader_Init() .
  3. Очистить пространство приложения с помощью Bootloader_Erase() .
  4. Подготовьтесь к программированию, вызвав Bootloader_FlashBegin() .
  5. Выполнение программирования путем повторного вызова функции Bootloader_FlashNext() . Процедура программирования требует, чтобы 8 байтов данных (двойное слово) были одновременно запрограммированы во флэш-память. Эта функция автоматически увеличивает адрес, по которому записываются данные.
  6. Завершите программирование, вызвав Bootloader_FlashEnd() .

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

  • Алгоритм: CRC32
  • Размер: 4 байта
  • Исходное значение: 0xFFFFFFFF
  • Порядок битов: старший бит первый

Важные примечания :

  • Для успешного перехода приложения из загрузчика необходимо переместить векторную таблицу прошивки приложения. При сбросе системы таблица векторов фиксируется по адресу 0x00000000. При создании приложения код запуска микроконтроллера по умолчанию устанавливает смещение таблицы векторов на 0x0000 в файле 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

Загрузчик в STM32 — Учебное пособие по загрузчику, часть 2⋆ EmbeTronicX

Последнее обновление: 22 июля 2022 г. Цель этой серии — предоставить простые и практические примеры, понятные каждому. Этот пост посвящен загрузчику в STM32F76xxx (дизайн загрузчика), где мы обсуждаем, как спроектировать загрузчик.

Мы также прикрепили пояснение к видео внизу этого поста.

Содержание

Предварительные требования

В этом руководстве мы будем использовать концепции, которые уже были объяснены в приведенных ниже руководствах. Поэтому я бы попросил вас сначала пройти эти уроки, если вы не знакомы с этими темами.

  • Основы загрузчика

Введение

В нашем последнем посте мы обсудили, что такое загрузчик и зачем он нам нужен в нашем проекте. Из этого поста мы перейдем к реализации загрузчика. Прежде чем внедрять загрузчик, мы должны знать, каким должен быть наш загрузчик. Итак, нам нужно разработать собственный загрузчик. Мы разработаем собственный загрузчик.

Требуется аппаратное обеспечение

  • STM32F767Zi Nucleo (Вы можете использовать любые платы STM32. Но используйте адреса, основанные на вашем контроллере).
  • Светодиод (если у вас нет встроенного светодиода)

Загрузчик в STM32F76xxx

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

Особенности STM32F767Zi

  • Ядро: Arm ® 32-битный Cortex 9ЦП 0234 ® -M7 с DPFPU, ART Accelerator и L1-кэшем: 16 Кбайт кэш-памяти I/D, что позволяет выполнять состояние 0-ожидания из встроенной флэш-памяти и внешней памяти, до 216 МГц, MPU, 462 DMIPS/2,14 DMIPS/ МГц (Dhrystone 2.1) и инструкции DSP.
  • Двухрежимный Quad-SPI
  • Графика
    • Chrom-ART Accelerator (DMA2D), графический аппаратный ускоритель, обеспечивающий улучшенный графический интерфейс пользователя
    • Аппаратный кодек JPEG
    • Контроллер LCD-TFT
    • с поддержкой разрешения до XGA
    • MIPI ® Хост-контроллер DSI с поддержкой разрешения до 720p 30 Гц
  • Часы, сброс и управление питанием
    • Питание приложений от 1,7 В до 3,6 В и входы/выходы
    • POR, PDR, PVD и BOR
    • Выделенный источник питания USB
    • Кварцевый генератор с частотой от 4 до 26 МГц
    • Внутренний 16 МГц RC с заводской подстройкой (погрешность 1%)
    • Генератор 32 кГц для RTC с калибровкой
    • Внутренний RC 32 кГц с калибровкой
  • Маломощный
    • Режимы сна, остановки и ожидания
    • V BAT питание для RTC, резервные регистры 32×32 бита + 4 Кбайт резервного SRAM
  • 3×12-разрядный, 2,4 MSPS АЦП: до 24 каналов
  • Цифровые фильтры для сигма-дельта модулятора (DFSDM), 8 каналов / 4 фильтра
  • 2×12-битных цифро-аналоговых преобразователя
  • DMA общего назначения: 16-поточный контроллер прямого доступа к памяти с FIFO и поддержкой пакетов
  • До 18 таймеров: до тринадцати 16-разрядных (1 маломощный 16-разрядный таймер доступен в режиме остановки) и два 32-разрядных таймера, каждый из которых имеет до 4 IC/OC/PWM или счетчик импульсов и квадратурный (инкрементный) ) вход энкодера. Все 15 таймеров работают на частоте до 216 МГц. 2 сторожевых таймера, таймер SysTick
  • Режим отладки
    • Интерфейсы SWD и JTAG
    • Cortex ® -M7 Trace Macrocell™
  • До 168 портов ввода-вывода с возможностью прерывания
    • До 164 быстрых входов/выходов до 108 МГц
    • До 166 5 устойчивых к напряжению входов/выходов
  • До 28 коммуникационных интерфейсов
    • До 4 I 2 C-интерфейса (SMBus/PMBus)
    • До 4 USART/4 UART (12,5 Мбит/с, интерфейс ISO7816, LIN, IrDA, модемное управление)
    • До 6 SPI (до 54 Мбит/с), 3 с мультиплексированным симплексом I 2 S для аудио
    • 2 x SAI (последовательный аудиоинтерфейс)
    • 3 × CAN (2.0B Active) и 2x SDMMC
    • Интерфейс SPDIFRX
    • HDMI-CEC
    • Ведомый интерфейс MDIO
  • Расширенные возможности подключения
    • Полноскоростное устройство/хост/OTG-контроллер USB 2. 0 со встроенным PHY
    • Высокоскоростной/полноскоростной контроллер USB 2.0 для устройств/хоста/OTG с выделенным DMA, встроенным полноскоростным PHY и ULPI
    • 10/100 Ethernet MAC с выделенным DMA: поддерживает оборудование IEEE 1588v2, MII/RMII
  • 8- к 14-битному интерфейсу камеры до 54 Мбайт/с
  • Генератор истинных случайных чисел
  • Блок вычисления CRC
  • RTC: точность до доли секунды, аппаратный календарь
  • 96-битный уникальный идентификатор

Память в STM32F767Zi

  • До 2 Мбайт флэш-памяти, организованной в два банка с возможностью чтения во время записи
  • SRAM: 512 Кбайт (включая 128 Кбайт ОЗУ данных TCM для важных данных в реальном времени) + 16 Кбайт ОЗУ TCM для инструкций (для критических подпрограмм реального времени) + 4 Кбайт резервного SRAM
  • Гибкий контроллер внешней памяти с шиной данных до 32 бит: SRAM, PSRAM, SDRAM/LPSDR SDRAM, память NOR/NAND

Флэш-память в STM32F767Zi

  • Операции чтения флэш-памяти с двумя поддерживаемыми режимами ширины данных:
    • Режим одного банка nDBANK=1: доступ для чтения 256 бит
    •  Двойной режим банка nDBANK=0: доступ для чтения 128 бит
  • Операции программирования/стирания флэш-памяти
  • Защита от чтения/записи
  • Чтение во время записи (RWW) (возможно только в режиме двойного банка nDBANK=0)
  • Режим двойной загрузки (возможен только в режиме двух банков nDBANK=0)
  • ART Accelerator™: 64 строки кэша по 128/256 бит на интерфейсе ITCM (в зависимости от ширины доступа для чтения)
  • Предварительная выборка кода инструкции TCM

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

Режимы загрузки

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

  1. Загрузчик будет помещен в сектор 0, 1 ( 0x08000000 по 0x0800FFFF ) ( 64KB ).
  2. Фактическое приложение будет помещено в сектор 5,6 ( 0x08040000 по 0x080BFFFF ) ( 512KB ).
  3. Приложение резервного копирования будет помещено в сектор 7,8 ( 0x080C0000 по 0x0813FFFF ) ( 512 КБ ).
  4. Приложение резервного копирования 2 будет помещено в сектор 9,10 ( 0x08140000 по 0x081BFFFF ) ( 512 КБ ).
  5. Конфигурации будут храниться в секторе 3 ( 0x08020000 до 0x0803FFFF ) ( 128 КБ ).

Посмотрите на изображение ниже для лучшего понимания.

Теперь мы доработали область памяти для хранения приложения, загрузчика и приложений резервного копирования. Мы должны спланировать работу загрузчика и приложения.

Операции с загрузчиком и приложением

Я разработал загрузчик и приложение, как показано на рисунке ниже.

Примечание: Этот дизайн предназначен только для образовательных целей. Может быть что-то, что мы можем улучшить. Некоторые ошибки также будут в этом дизайне.

Загрузчик

Описание этапов процесса загрузчика приведено ниже.

Блок B1

Загрузчик запускается при включении или сбросе микроконтроллера.

  • Перейти к блоку B2.
Блок B2

Убедитесь, что кнопка загрузки пользователя нажата. Этот штифт загрузки не совпадает с контактом BOOT0 . Этот PIN-код загрузки является нашим PIN-кодом загрузчика для идентификации процесса обновления прошивки/приложения.

  • Если да, перейдите к блоку B3.
  • Если нет, перейдите к блоку B6.
Блок B3

Получение данных от UART.

  • Перейти к блоку B4.
Блок В4

Запишите полученные данные либо в слот 1, либо в слот 2 в зависимости от доступности.

  • Перейти к блоку B5.
Блок B5

Сбросьте микроконтроллер, чтобы загрузчик снова заработал.

Блок B6

Причины перезагрузки будут храниться в определенной области. Прочтите причину перезагрузки и перейдите к блоку B7, блоку B8, блоку B10 и блоку B13.

Блок B7
  • Если приложение запрашивает обновление OTA, перейдите к блоку B3.
Блок B8
  • Если это самая первая загрузка, то перейдите к Блоку B9.
Блок B9

Поскольку это самая первая загрузка, загрузчик скопирует приложение из слота 1 в фактическую область приложения, которая имеет вид 0x08040000 . Затем перейдите к блоку B11.

Блок B10
  • Если это обычная загрузка, перейдите к Блоку B11.
Блок B11

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

  • Если проверка CRC прошла успешно, перейдите к блоку B12.
  • Если проверка CRC не удалась, перейдите к блоку B15.
Блок B12

Передать управление приложению.

Блок B13

Если приложение запрашивает загрузку предыдущего приложения, перейдите к Блоку B14.

Блок B14

Скопируйте старое приложение из слота 1 или слота 2 в актуальное приложение и перейдите к блоку B11.

Блок B15

Если проверка CRC не удалась, не запускайте приложение и оставайтесь там.

Приложение

Ниже приводится описание шагов процесса приложения.

Блок A1

Загрузчик запускает приложение. Затем перейдите к блоку A2.

Блок A2

Проверьте наличие прерывания GPIO.

  • Если произошло прерывание, то перейти к блоку A4.
  • В противном случае идите в блок A3.
Блок A3

Мигает светодиод.

Блок A4

Мы получили прерывание, что означает, что доступен какой-то пакет OTA. Итак, напишите причину перезагрузки в виде ОТА-запроса. Затем идите к блоку A5.

Блок A5

Сброс устройства. Так что Bootloader получит пакет OTA и обновит его.

Разбивка учебников

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

  1. Напишите простой загрузчик, запускающий приложение.
  2. Реализовать функцию обновления прошивки/приложения в загрузчике.
  3. Добавить некоторые функции в загрузчик, такие как проверка CRC, Slot1, Slot 2 и т. д.
  4. Добавить функцию обновления прошивки/приложения по беспроводной сети, такой как Bluetooth или Wi-Fi, в загрузчик и приложение.
  5. Обновление микропрограммы с помощью SD-карты (SPI-связь)

Объяснение видео

Пожалуйста, ознакомьтесь с приведенным ниже видео объяснением.

В следующем посте мы напишем базовый загрузчик на STM32, который дает управление приложению.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *