Беспроводное обновление прошивки (DFU/OTA) через MCUBoot

Материал носит ознакомительный характер. Работа с электроникой и микроконтроллерами требует соблюдения техники безопасности; автор не несет ответственности за возможные повреждения оборудования или иной ущерб, возникший в ходе обучения.

Мы подошли к этапу, который превращает электронный макет в полноценный продукт. В мире Arduino обновление программы требовало кабеля и нажатия кнопки в IDE. Однако современные устройства часто работают в закрытых корпусах или установлены в труднодоступных местах. Для таких случаев используют DFU (Device Firmware Update). Если данные передаются по беспроводному каналу, процесс называют OTA (Over-the-Air).

В экосистеме nRF Connect SDK за надежность процесса отвечает MCUBoot — защищенный загрузчик (Bootloader), который управляет запуском и обновлением ПО.

Как MCUBoot работает с памятью

Чтобы прерванная связь не превратила устройство в «кирпич», nRF52840 делит Flash-память на области. Система не записывает новый код поверх старого, а использует систему слотов под управлением Image Manager.

Как показано в Схеме 1, память разделена на два рабочих пространства.

  1. Primary Slot: здесь хранится и исполняется текущая прошивка.
  2. Secondary Slot: сюда загружается новая версия при обновлении.
  3. MCUBoot: микропрограмма, которая стартует первой. Она проверяет целостность новой версии и решает, нужно ли менять прошивки местами.

Механизм подтверждения (Confirm)

MCUBoot поддерживает режим Swap (перестановка) с защитой от ошибок. Процесс выглядит так:

  1. Вы загружаете файл во вторичный слот.
  2. Устройство перезагружается. MCUBoot временно меняет прошивки местами.
  3. Новая прошивка запускается. Если в течение заданного времени код не вызовет функцию подтверждения, MCUBoot сочтет версию неисправной и при следующей перезагрузке вернет старую рабочую копию.

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

Настройка проекта

Вам не придется размечать память вручную. Благодаря системе Kconfig достаточно добавить параметры в файл prj.conf.

Минимальные настройки для включения MCUBoot и OTA через Bluetooth в Zephyr RTOS:

# Включаем загрузчик MCUBoot
CONFIG_BOOTLOADER_MCUBOOT=y

# Разрешаем управление образами прошивки
CONFIG_IMG_MANAGER=y
CONFIG_MCUBOOT_IMG_MANAGER=y

# Включаем Bluetooth-сервис для передачи прошивки (SMP Server)
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y

После сборки в папке build/zephyr появится файл app_update.bin. Его нужно отправлять на устройство.

Загрузка через смартфон

Для OTA-обновления используйте приложение nRF Connect for Mobile.

  1. Соберите проект с любым заметным изменением (например, измените период мигания светодиода из темы о [Драйверах GPIO, UART и ADC]).
  2. Подключитесь к устройству в приложении.
  3. Нажмите кнопку DFU (иконка со стрелкой).
  4. Выберите файл app_update.bin и запустите процесс.

Проведите тестовое обновление:

  1. Измените версию прошивки в prj.conf: CONFIG_MCUBOOT_IMAGE_VERSION="1.0.1".
  2. Загрузите её через смартфон.
  3. Проверьте, что устройство перезагрузилось и выполняет новый код.

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

Понравился урок?

Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей

Продолжить в Telegram