Автор |
Сегодня, с бурным развитием Интернета вещей, многие терминальные продукты требуют функций OTA. Сегодня я хотел бы поделиться с вами легким OTA-компонентом с открытым исходным кодом, специально разработанным для микроконтроллеров: mOTA.
Этот проект с открытым исходным кодом представляет собой OTA-компонент, специально разработанный для 32-битных микроконтроллеров. Компонент включает в себя три части: загрузчик, упаковщик прошивки (Firmware_Packager) и передатчик прошивки. Он также предоставляет три части на основе различных микроконтроллеров (STM32F1/STM32F407/). STM32F411/STM32L4) и корпуса протоколов YModem-1K. Исходя из этого, в данном проекте предусмотрен отправитель прошивки YModem_Sender на основе протокола YModem-1K. В папке примеров собраны проекты кейсов, в том числе случаи использования SPI Flash и QSPI Flash для хранения прошивки.
Буква m в mOTA может означать мини, микро, MCU (микроконтроллер) и OTA (Over-the-Air Technology), то есть беспроводную технологию. Согласно определению Википедии, OTA — это метод распространения новых данных. программное обеспечение и конфигурации устройств или даже способы обновления ключей шифрования, например, для мобильных телефонов, преобразователей цифрового видео или устройств защищенной голосовой связи — зашифрованных радиостанций двусторонней связи. Важной особенностью OTA является то, что центральный пункт может отправлять обновления всем пользователям, он не может отклонять, уничтожать или изменять обновление, и обновление немедленно применяется ко всем на канале. Пользователи могут «отклонять» обновления OTA, но менеджеры каналов также могут выгнать их из канала. Отсюда мы можем вывести несколько основных характеристик технологии OTA:
Этот проект реализует только часть технологии OTA-обновления данных, то есть основные функции технологии OTA, перечисленные выше, и не заботится о технологии передачи, используемой при центральном распределении данных. (В примере этого проекта UART используется в качестве среды передачи между MCU и внешним устройством)
MCU на устройстве OTA Модернизацию можно понимать как IAP (In Application Programming) технология, MCU Через периферийные интерфейсы (например. UART 、 IIC 、 SPI 、 CAN 、 USB и другие интерфейсы) для подключения модулей, устройств и оборудования с сетевыми возможностями (далее совместно именуемые «хост-компьютер»). Главный компьютер получает пакет встроенного ПО с сервера, а затем отправляет пакет встроенного ПО на сервер через интерфейс связи, используя согласованный протокол связи. MCU , Зависит от MCU Отвечает за анализ прошивки, расшифровку, хранение, обновление и другие операции для выполнения функции обновления прошивки устройства. Следует отметить, что example
Представленные примеры основаны не на файловых системах, а скорее на Flash Разделите его на различные функциональные области для выполнения обновлений прошивки.
Этот компонент реализует следующие функции:
user_config.h
Конфигурация download Раздел и factory Расположение раздела внутри чипа flash или SPI flash , использовал SFUD (Serial Flash Universal Driver) как SPI flash Базовая библиотека драйверов. Если используется SPI flash поддерживать SFDP (Serial Flash Discovable Parameters) ,вы можете заменить другие марки и модели без изменения исходного кода. SPI flash 。Если неподдерживать SFDP ,SFUD Уже соответствует в SPI flash Что касается таблицы параметров, то также можно заменить другие марки и модели без изменения исходного кода. SPI flash 。документ | Описание функции |
---|---|
main.c | Автоматически генерируется STM32CubeMX и отвечает за инициализацию периферийных устройств. |
user_config.h | пользователь Конфигурациядокумент,Используется для пользовательского функционального компонента OTA |
app_config.h | приложение Конфигурациядокумент,Разработка кода конфигурации из некоторых вариантов запуска |
app.c | Прикладной уровень, отвечающий за реализацию кода бизнес-логики. |
firmware_manage.c | Уровень интерфейса управления встроенного ПО обеспечивает все рабочие интерфейсы встроенного ПО. |
protocol_parser.c | Уровень деконструкции протокола реализует распаковку и пакетизацию протокола. |
data_transfer.c | Уровень передачи данных предоставляет внешние интерфейсы для отправки и получения данных. |
data_transfer_port.c | Положение трансплантации уровня передачи данных позволяет легко модифицировать его на другие интерфейсы связи. |
utils.c | Библиотека инструментов, которая реализует некоторые функции инструмента, которые необходимо вызывать глобально. |
bsp_config.h | BSP Слой из документа Конфигурация |
bsp_common.h | BSP Слой из общедоступного заголовка документа |
bsp_board.c | Реализуйте некоторый собственный код инициализации для платы. |
bsp_uart.c | Универсальная библиотека драйверов UART. |
bsp_uart_port.c | UART изинтерфейспересадкадокумент |
bsp_uart_config.h | UART из Конфигурациядокумент |
bsp_timer.c | Универсальная библиотека драйверов таймеров |
bsp_flash.c | абстрактный интерфейс работы с флэш-разделом |
fal_stm32f1_flash.c | Встроенный флэш-интерфейс STM32F1 для записи, чтения и стирания абстрактного интерфейса |
Вся идея дизайна загрузчика содержит много контента. Эта идея дизайна также представлена в виде PDF-документа. Подробности см. в разделе «Идеи программирования загрузчика».
В зависимости от настроенной схемы разделов процесс обновления прошивки будет несколько отличаться. Здесь показан только краткий процесс обновления, чтобы облегчить быстрое понимание процесса обновления прошивки. Для более подробного содержания, пожалуйста, прочитайте «. Идеи программирования загрузчика» 》Документация и исходный код.
Целью этого компонента является минимизация количества изменений в приложении для достижения функции OTA. Как видно из рисунка ниже, загрузчик выполняет все операции, такие как загрузка, сохранение, проверка, расшифровка и обновление прошивки. Что должна делать часть приложения Есть три вещи.
Вообще говоря, есть два способа уведомить загрузчик о необходимости обновления прошивки:
Подводя итог, идеального решения не существует. Этот компонент поддерживает одно из двух вышеперечисленных решений, и вы можете выбирать и идти на компромиссы в соответствии с фактическими потребностями.
Поскольку в корпусе используется протокол YModem-1K, и этот компонент запускает обновление прошивки путем отправки инструкций с главного компьютера, если во время теста на устройстве работает приложение, должно быть условие для входа в загрузчик. удобство демонстрации, использование корпуса. Функциональная кнопка на плате используется в качестве условия запуска для имитации отправки хост-компьютером команды обновления на устройство. Подробную информацию см. в инструкциях по использованию корпуса.
Причина, по которой механизм обнаружения и обработки встроенного ПО указан отдельно, заключается в облегчении понимания логики кода. Эта часть также представлена в виде PDF-документа. Подробности см. в разделе «Механизм обнаружения и обработки встроенного ПО».
Следует отметить, что в данном случае мы выбрали YModem-1K протокол, поэтому, если он будет непосредственно принят или протестирован
example
Для случаев в каталоге нужно выбирать размер заголовка упаковщика прошивки. 1024 byte 。
Примечание. Вышеуказанные инструменты разработаны на основе Qt6. YModem_Sender зависит от библиотеки Qt Serial_port и должен быть добавлен самостоятельно. Как часть компонента OTA, вышеупомянутые инструменты, естественно, имеют открытый исходный код. В качестве рабочей платформы используется Windows, и она тестировалась только на Win10 и Win11. Если вам нужно изменить и скомпилировать проект, вам придется установить Qt самостоятельно. Найдите руководство по установке самостоятельно.
Корпус этого компонента основан на протоколе YModem-1K и UART в качестве среды передачи данных между MCU и внешним миром. Таким образом, это не просто расчет места, занимаемого частью основного кода, а всего доступного проекта. . Эти данные более значимы для справки. Ниже указан размер флэш-памяти и оперативной памяти, занимаемой несколькими конфигурациями.
Program Size: Code=7796 RO-data=464 RW-data=116 ZI-data=9316
flash: 8376 byte (8.18 kB)
ram: 9432 byte (9.21 kB)Program Size: Code=8574 RO-data=1010 RW-data=116 ZI-data=9572
flash: 9700 byte (9.47 kB)
ram: 9688 byte (9.46 kB)Program Size: Code=8846 RO-data=614 RW-data=116 ZI-data=9348
flash: 9576 byte (9.35 kB)
ram: 9464 byte (9.24 kB)Program Size: Code=9706 RO-data=1158 RW-data=116 ZI-data=9604
flash: 10980 byte (10.72 kB)
ram: 9720 byte (9.49 kB)Поскольку разница в занимаемых размерах между двойными и тройными разделами невелика, занятость двойных разделов отдельно не указывается. Этот компонент был сжат настолько, насколько это возможно. Однако, поскольку обработка данных прошивки требует определенного объема ОЗУ, дальнейшее сжатие этой части будет затруднено, если не будет изменен минимальный процессорный блок каждого пакета (на данный момент 4096 байт). , Пожалуйста, выберите в соответствии с фактическими потребностями.
Из-за большой нагрузки по написанию руководств этот проект с открытым исходным кодом на данный момент не предоставляет подробной документации по миграции. Код разработан послойно и обладает определенной переносимостью. Его могут читать опытные инженеры. example
Пример кода и это описание могут быть перенесены на другие платформы микросхем. Вот лишь несколько объяснений.
Выкопайте яму и запишите видео о пересадке позже, когда у меня будет время.
source
Справочник, для трансплантации из необходимого документа.source/Component
и source/BSP
Библиотека компонентов в каталоге не требуется для трансплантации и должна быть адаптирована в соответствии с функциональными потребностями.Ниже приведены основные этапы трансплантации.
Рекомендуемая ссылка example
Случаи трансплантированы.
source
Каталог издокумента поместите его в каталог проекта, вы можете разместить его и назвать как угодно.source
в каталогеиздокумент按нуждаться添加进代码工程середина(source/Component
Библиотека компонентов в каталоге не требуется для портирования) и содержит соответствующий каталог из заголовка документа.data_transfer_port.c
и fal_stm32f1_flash.c
Если функции внутри соответствуют случаю, никаких изменений не требуется.protocol_parser.c
и protocol_parser.h
, если это соответствует случаю, никаких изменений не требуется.app.c
документ из функции переносится в код вашего приложения, не забудьте включить app.h
, который при необходимости можно изменить.example
Найдите и добавьте его в проект в каталоге середина, и вы сможете изменить его позже. )user_config.h
документ, пожалуйста, внимательно прочитайте инструкцию.app_config.h
да Нужно ли изменить элемент конфигурации?USING_APP_SET_FLAG_UPDATE
(в противном случае проигнорируйте этот шаг) и отметьте Кусочек место существования RAM , то необходим журнал конфигурации update_flag
где RAM Адрес и конфигурация IDE или Документ загрузки Scatter не инициализирует его. IDE Метод Конфигурация показан на рисунке ниже. ( Необходимо включить common.h
) Среди них макро FIRMWARE_UPDATE_VAR_ADDR
существовать user_config.h
середина Конфигурация,Этот случайда 0x20000000
. Обратите внимание, что предоставлено update_flag
из RAM Район надо проверить NoInit
。/* Обновление прошивки из флага Кусочек, флаг Кусочек не сбрасывается */
#if (USING_IS_NEED_UPDATE_PROJECT == USING_APP_SET_FLAG_UPDATE)
#if defined(__IS_COMPILER_ARM_COMPILER_5__)
volatile uint64_t update_flag __attribute__((at(FIRMWARE_UPDATE_VAR_ADDR), zero_init));
#elif defined(__IS_COMPILER_ARM_COMPILER_6__)
#define __INT_TO_STR(x) #x
#define INT_TO_STR(x) __INT_TO_STR(x)
volatile uint64_t update_flag __attribute__((section(".bss.ARM.__at_" INT_TO_STR(FIRMWARE_UPDATE_VAR_ADDR))));
#else
#error "variable placement not supported for this compiler."
#endif
#endif
C99
(Если используется perf_counter , вам нужно выбрать gnu99
) , оптимизировать в соответствии с Вам просто нужно его выбрать. Рекомендуется нажать Конфигурация, как показано на картинке. USING_APP_SET_FLAG_UPDATE
(иначе игнорируйте этот шаг), после прохождения компиляции Проверять map документ Нет добавил новый Region , и адрес правильный, Type
для Zero
, площадь для UNINIT
Если все соответствует, трансплантация прошла успешно. APP Часть трансплантации относительно проста и может быть непосредственно упомянута. example
случай в .
user_config.h
середина Конфигурация согласована, иначе она не сможет работать./* После настройки таблицы векторов разрыва середины включите общий разрыв середины. */
extern int Image$$ER_IROM1$$Base;
BSP_INT_DIS();
SCB->VTOR = (uint32_t)&Image$$ER_IROM1$$Base;
BSP_INT_EN();
update_flag
Отметьте значение Кусочекиз и системный комплексный код Кусочекиз, как показано ниже. Это середина, FIRMWARE_UPDATE_MAGIC_WORD
изценитьда 0xA5A5A5A5
, Обратите внимание, что это значение должно быть bootloader Будьте последовательны 。
Если вам нужна функция «Восстановление заводской прошивки», отметив Кусочекиспользовать, также укажите дату. или, соответствующий макропринципу да FIRMWARE_RECOVERY_MAGIC_WORD
,ценитьдля 0x5A5A5A5A
。update_flag = FIRMWARE_UPDATE_MAGIC_WORD;
HAL_NVIC_SystemReset();
Чтобы минимизировать флэш-пространство, занимаемое загрузчиком, чем меньше размер, тем шире диапазон применения компонента. Конечно, этот компонент имеет открытый исходный код, и вы можете добавить RTOS или другой код в загрузчик.
Мы знаем, что идеальная рабочая среда загрузчика — без использования каких-либо периферийных устройств. В некоторых конструкциях приложение размещается по первому адресу флэш-памяти, а загрузчик - по другим адресам. Преимущество состоит в том, что приложению не требуется устанавливать начальную позицию и таблицу векторов прерываний приложения, а количество изменений минимально. Недостаток в том, что этот метод сложно назвать универсальным и его необходимо настраивать в загрузчике или используемой периферии в приложении, иначе при обновлении прошивки могут возникнуть различные отклонения. Фактически, периферийные устройства, используемые каждым устройством и каждым продуктом, не определены. Чтобы быть универсальным, этот компонент выбрал решение создания загрузчика по первому адресу флэш-памяти.
Реальность такова, что не все устройства имеют относительно большой объем свободной флэш-памяти. Некоторые устройства не могут использовать несколько разделов, а раздел загрузчика + приложение уже является пределом. Если схема разделов загрузчика другая, размер флэш-памяти, которую он занимает, также отличается. Чтобы максимально уменьшить размер загрузчика, раздел спроектирован так, чтобы его можно было настраивать.
fpk да mOTA Упаковщик прошивки компонента генерирует документ на основе bin документ, существующий, имеет дополнительный 96 byte После заголовка из синтезируется в новый документ с суффиксом да.
.fpk
。fpk взято из английских слов Firmware Package из аббревиатуры, означающей «пакет прошивки», этот компонент вместе именуется «пакет прошивки», а при упоминании «прошивка» обычно имеется в виду изда. bin документ。
В настоящее время да не может из. Этот компонент предоставляет функциональные возможности и функции безопасности на основе fpk Он реализован с использованием заголовков таблиц и нескольких разделов, поэтому для упаковки прошивки и генерации необходим упаковщик прошивки. fpk Пакет прошивки. Чтобы максимально эффективно использовать эти функции и функции безопасности, bootloader из Процесс обновленияда На основе заголовков, содержащихизпрошивка包开发из,На данный момент мы не рассматриваем возможность добавления процесса обновления без заголовков. когдаран,Не исключено, что по просьбе для будет слишком много людей.,я сделаю это
Этот проект с открытым исходным кодом использует или будет использовать следующие сторонние библиотеки. Благодаря следующим превосходным библиотекам кода (перечислены в произвольном порядке).
адрес: https://gitee.com/DinoHaw/mOTA