1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Aladdin-Wang-RT-FOTA-STM32L431

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 25 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 14:29 8a2ae16

STM32 универсальный Bootloader — FOTA

  1. Обновление прошивки: краткое описание

Обновление прошивки, обычно называемое OTA (Over the Air) обновлением или FOTA (Firmware Over-The-Air) обновлением, представляет собой технологию обновления прошивки через интернет.

1.1 Режимы обновления загрузчика

Существует два распространённых режима обновления загрузчика:

  • Режим загрузчика с разделами «загрузчик», «приложение 1» и «приложение 2»: после запуска загрузчик проверяет разделы «приложение 1» и «приложение 2». Если версия прошивки в одном из разделов новее, то запускается соответствующий раздел. При наличии новой версии обновления прошивка загружается в другой раздел, который не используется, а при следующем запуске выбирается новая версия. Преимущество этого метода заключается в отсутствии необходимости переноса прошивки и быстрой скорости запуска. Недостаток — разделы «приложение 1» и «приложение 2» должны быть одинакового размера и занимать Flash-память; кроме того, эти разделы могут содержать только приложения, но не другие типы прошивок, такие как Wi-Fi.
  • Режим загрузчика с разделами «загрузчик», «приложение» и «загрузка»: после запуска загрузчик проверяет раздел «загрузка» на наличие новой версии прошивки. Если новая версия найдена, она переносится в раздел «приложение». После завершения переноса выполняется раздел «приложение». Если в разделе «загрузка» нет новой версии, сразу выполняется раздел «приложение». При наличии новой версии прошивка загружается в раздел «загрузка», а после перезагрузки происходит обновление. Преимущество — раздел «загрузка» может быть меньше раздела «приложение», что экономит Flash-память и трафик загрузки; раздел «загрузка» также может загружать другие типы прошивок. Недостаток — требуется перенос прошивки, и начальная скорость запуска немного медленнее.

RT-Thread OTA использует второй режим обновления загрузчика, сочетая разделы «загрузчик», «приложение» и «загрузка».

  1. RT-OTA: введение

Для облегчения использования OTA обновления разработчиками, RT-Thread команда разработчиков предоставляет универсальный загрузчик. Разработчики могут использовать этот загрузчик для лёгкого управления, обновления и обслуживания прошивки устройств.

На рисунке ниже представлена структура программного обеспечения универсального загрузчика RT-Thread:

[Здесь вставьте изображение]

Официальный загрузчик RT-Thread предоставляется в виде файла bin. Его можно загрузить по адресу: http://iot.rt-thread.com.

  1. Разделы Flash: краткое описание

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

Чтобы иметь возможность обновлять прошивку с помощью OTA, обычно требуется как минимум две программы, работающие на устройстве. Загрузчик отвечает за проверку и обновление прошивки, а приложение отвечает за бизнес-логику. Они выполняют разные функции и хранятся в разных адресах Flash, образуя разделы «загрузчик» и «приложение».

Однако большинство встраиваемых систем работают во Flash. При загрузке обновления прошивка не записывается непосредственно в раздел «приложение», а сначала загружается в отдельный раздел для временного хранения, называемый «раздел загрузки» или «раздел приложения 2», в зависимости от режима обновления загрузчика.

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

Универсальный загрузчик содержит три раздела:

[Вставьте здесь изображение]

  1. Протокол передачи файлов Ymodem

Ymodem — это протокол передачи текстовых данных, который обеспечивает поддержку передачи файлов в OTA-приложениях. Обновление прошивки на основе протокола Ymodem является примером применения OTA.

  1. Функции RT-OTA
  • Функция обновления прошивки: загрузчик переносит новую версию прошивки из раздела «загрузка» в раздел «приложение». Основной процесс выглядит следующим образом:
    • Загрузчик проверяет версии прошивок в разделах «загрузка» и «приложение» при запуске.
    • Если версии совпадают, выполнение переходит к разделу «приложение», и загрузчик завершает работу.
    • В противном случае загрузчик переносит прошивку из раздела «загрузка» в раздел «приложение».
    • Во время переноса загрузчик может выполнять операции проверки, расшифровки и распаковки прошивки.
    • После переноса загрузчик удаляет старую версию прошивки из раздела «загрузка».
    • Устройство перезагружается, и выполнение переходит к новой прошивке в разделе «приложение», после чего загрузчик завершает свою работу.

Процесс работы загрузчика представлен на рисунке ниже:

[Вставьте здесь изображение]

  • Функция восстановления прошивки: если прошивка повреждена, загрузчик переносит заводскую прошивку из раздела factory в раздел «приложение». Процесс выглядит следующим образом:
    • При запуске загрузчик проверяет, установлен ли сигнал сброса для восстановления прошивки.
    • Если сигнал активен более 10 секунд, заводская прошивка переносится в раздел «приложение».
    • Если сигнал не активен более 10 секунд, процесс продолжается с шага 2.2.
    • Во время переноса загрузчик выполняет операции проверки, расшифровки, распаковки и т. д.
    • После переноса заводская прошивка остаётся в разделе factory.
    • Происходит перезагрузка, и выполнение переходит к прошивке в разделе «приложение», после чего загрузчик завершает свою работу.
  1. Введение в RT-FOTA

RT-Thread официально выпустила универсальный загрузчик для серии микроконтроллеров STM32. На веб-сайте можно настроить загрузчик и создать файл записи без написания кода. Это позволяет разработчикам легко создавать функцию загрузчика в своих продуктах. Однако, поскольку официальный загрузчик RT-Thread является коммерческим продуктом и не раскрывает исходный код, его использование ограничено другими платформами и затрудняет добавление специфических функций продукта. Поэтому появился RT-FOTA.

RT-FOTA совместим со всеми функциями официального RT-OTA. Чтобы отличить его от официального RT-OTA, он называется RT-FOTA.

Адрес проекта RT-FOTA: https://gitee.com/spunky_973/rt-fota.

RT-FOTA можно напрямую использовать в полной версии RT-Thread, просто поместив файлы rt_fota.c, rt_fota.h и rt_fota_crc.c в проект и настроив компоненты env.

  1. Функции RT-FOTA
  • Поддержка пакета RBL от RT-Thread с использованием тех же методов. В настоящее время поддерживаются функции CRC32, AES256, quicklz и fastlz.
  • Поддержка командного режима (компонент FINSH) и восстановления заводской прошивки.
  • Поддержка разделов Flash (компонент FAL).
  • Добавление команд fota и ymdown.
  • Другие функции можно расширить самостоятельно.
  1. Пример использования RT-FOTA

Хотя автор RT-FOTA использовал версию nano от RT-Thread, он добавил полные компоненты device и finsh, что упрощает расширение дополнительных пакетов. Однако это также увеличивает размер nano, и пользователям, которым необходимо перенести проект, придётся переносить больше кода. Если пользователь использует полную версию RT-Thread, перенос будет проще, но займёт больше места во Flash. Поэтому, чтобы уменьшить занимаемое пространство и упростить перенос, я улучшил RT-FOTA следующим образом:

  • Изменил среду компиляции на Arm Compiler 6.13 и установил уровень оптимизации -Oz.
  • Удалил компонент device и использовал упрощённую версию RT-Thread nano, добавив только компонент finsh.
  • Использовал STM32CubeMX для создания соответствующего проекта, облегчая перенос на другие платформы STM32.

После улучшения RT-FOTA занимает всего 42 КБ во Flash без потери функциональности.

Обновлённый проект RT-FOTA доступен по адресу: https://gitee.com/Aladdin-Wang/RT-FOTA-STM32L431.

8.1 Структура проекта

[Вставьте изображение]

8.2 Конфигурация программного обеспечения

Конфигурация программного обеспечения RT-FOTA по-прежнему сосредоточена в файле rtconfig.h. Все макросы, которые необходимо изменить в соответствии с различными требованиями, собраны в rtconfig.h, включая те, которые пользователь должен изменить:

...
#define STM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE             (256 * 1024)
#define STM32_FLASH_END_ADDRESS      ((uint32_t)(STM32_FLASH_START_ADRESS
``` Данный текст является техническим и содержит информацию о разработке и тестировании программного обеспечения. Основной язык текста  русский.

**STM32_FLASH_SIZE)**

#define STM32_SRAM1_START              (0x20000000)      
#define STM32_SRAM1_END                (STM32_SRAM1_START + 64 * 1024)   // 结束地址 = 0x20000000(基址) + 64K(RAM大小)


// <<< end of configuration section >>>
/* On-chip Peripheral Drivers */
#define BSP_USING_ON_CHIP_FLASH
#define BSP_USING_LPUART1
#define BSP_USING_SPI2
/* Onboard Peripheral Drivers */
#define BSP_DATAFALSH_CS_GPIOX       GPIOB
#define BSP_DATAFALSH_CS_GPIO_PIN    GPIO_PIN_12

#define RT_FOTA_SIGNAL_LED
#define RT_FOTA_SIGNAL_LED_GPIOX     GPIOB
#define RT_FOTA_SIGNAL_LED_GPIO_PIN  GPIO_PIN_1
#define RT_FOTA_SIGNAL_LED_ON_LEVEL  GPIO_PIN_RESET

#define RT_FOTA_DEFAULT_KEY
#define RT_FOTA_DEFAULT_KEY_CHK_TIME 10
#define RT_FOTA_DEFAULT_KEY_GPIOX    GPIOA
#define RT_FOTA_DEFAULT_KEY_GPIO_PIN GPIO_PIN_7
#define RT_FOTA_DEFAULT_KEY_LEVEL    GPIO_PIN_SET
/* package */
#define PKG_USING_FAL
#define FAL_DEBUG 1
#define FAL_PART_HAS_TABLE_CFG
#define FAL_PART_TABLE                                                               \
{                                                                                       \
    {FAL_PART_MAGIC_WROD, "app",    "onchip_flash", 64*1024,       192*1024, 0}, \
    {FAL_PART_MAGIC_WROD, "ef", FAL_USING_NOR_FLASH_DEV_NAME, 0 , 1024 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD, "download", FAL_USING_NOR_FLASH_DEV_NAME, 1024 * 1024 , 512 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD, "factory", FAL_USING_NOR_FLASH_DEV_NAME, (1024 + 512) * 1024 , 512 * 1024, 0}, \
}
#define FAL_USING_SFUD_PORT
#define FAL_USING_NOR_FLASH_DEV_NAME "w25q64"

#define PKG_USING_YMODEM_OTA
#define TINY_CRYPT_AES
#define PKG_USING_QUICKLZ
#define QLZ_COMPRESSION_LEVEL 3

/* RT-FOTA module define */
#define RT_FOTA_SW_VERSION      "1.0.0"
/* FOTA application partition name */
#ifndef RT_FOTA_APP_PART_NAME
#define RT_FOTA_APP_PART_NAME   "app"
#endif

/* FOTA download partition name */
#ifndef RT_FOTA_FM_PART_NAME
#define RT_FOTA_FM_PART_NAME    "download"
#endif

/* FOTA default partition name */
#ifndef RT_FOTA_DF_PART_NAME
#define RT_FOTA_DF_PART_NAME    "factory"
#endif

/* AES256 encryption algorithm option */
#define RT_FOTA_ALGO_AES_IV     "0123456789ABCDEF"
#define RT_FOТА_ALGO_AES_KEY    "0123456789ABCDEF0123456789ABCDEF"

#define SOC_SERIES_STM32L4
#endif **Нормальный запуск:**

**Рисунок 1.** Описание изображения.

### 8.5. Командный режим

Командный режим RT-FOTA использует компонент FINSH системы RTT, помимо команд, встроенных в систему RTT, также добавляются команды fota и ymdown:

#### Команда fota

После ввода команды fota и нажатия Enter можно увидеть справочную информацию по команде:

```c
rt-fota />fota
Usage:
fota probe                       - probe RBL file of partiton
fota show partition addr size    - show 'size' bytes starting at 'addr'
fota clone des_part src_part     - clone src partition to des partiton
fota exec                        - execute application program
  1. Параметр probe может распечатать информацию о разделе RBL:

Рисунок 2. Описание изображения.

  1. Здесь перечислены основные элементы информации о файлах RBL разделов fm_area и df_area, что удобно для разработчиков:
  • App partition name: указывает имя раздела, установленное при упаковке файла RTT;
  • Algorithm mode: указывает алгоритм, используемый файлом RTT: AES256/Quicklz/Fastlz;
  • Firmware version: указывает номер версии встроенного программного обеспечения файла RTT;
  • Code raw size: размер исходного кода;
  • Code package size: размер упакованного кода;
  • Build Timestamp: время создания кода.
  1. Параметр show может отображать конкретные данные раздела для удобства отладки и проверки:

Рисунок 3. Описание изображения.

  1. Параметр clone — это реализация клонирования данных раздела: здесь данные раздела factory полностью копируются в раздел download.

Рисунок 4. Описание изображения.

  1. Параметр exec используется для выполнения прикладного кода раздела app:

Рисунок 5. Описание изображения.

Команда ymdown

Ymdown — это команда загрузки на основе протокола Ymodem, использующая компоненты ymodem и ymodem_ota системы RTT. В файле ymodem_ota.c параметр DEFAULT_DOWNLOAD_PART устанавливается как раздел по умолчанию для загрузки, то есть при использовании команды ymdown без параметров загрузка будет выполняться в раздел DEFAULT_DOWNLOAD_PART. Также можно указать раздел для загрузки с помощью параметра раздела.

  1. Команда ymodem_ota:

Рисунок 6. Описание изображения.

  1. Команда ymodem_ota -p: загрузка прошивки в раздел factory:

Рисунок 7. Описание изображения.

9. Как перенести

Шаг 1: Создание проекта с использованием STM32CubMX: RT-Thread операционная система переопределяет функции прерываний HardFault_Handler, PendSV_Handler и SysTick_Handler. Чтобы избежать проблем с повторным определением, перед созданием проекта необходимо отменить выбор этих функций прерывания (соответствующие опции комментариев — Hard fault interrupt, Pendable request, Time base :System tick timer) в конфигурации прерываний. Наконец, нажмите «Создать код». Конкретные операции показаны на следующем рисунке:

Рисунок 8. Описание изображения.

Шаг 2: Перенос на Keil MDK [на основе Keil MDK перенос RT-Thread Nano] Сначала необходимо установить пакет RT-Thread Nano. Загрузите и установите пакет RT-Thread Nano pack. После завершения загрузки дважды щёлкните файл для установки. Установите RT-Thread Nano pack после установки, отметьте kernel и shell.

Рисунок 9. Описание изображения.

Шаг 3: Добавьте все файлы в проект

Рисунок 10. Описание изображения.

Среди них файл drv_flash_l4.c должен быть выбран в соответствии с собственным проектом, а остальные не требуют изменений.

Рисунок 11. Описание изображения.

Шаг 4: Измените параметры компиляции на AC6 AC6 имеет более высокую скорость компиляции и меньший размер.

Рисунок 12. Описание изображения.

Рисунок 13. Описание изображения.

Шаг 5: Измените boart.c и rtconfig.h boart.c можно напрямую скопировать и использовать. Текст запроса:

RW_IRAM1,需与链接脚本中运行时域名相对应
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif

#define HEAP_END                       STM32_SRAM1_END
#endif

/**
 * This function will initial your board.
 */
void rt_hw_board_init()
{

    HAL_Init();
    SystemClock_Config();
    /* System Clock Update */
    SystemCoreClockUpdate();

    /* System Tick Configuration */
    _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
    MX_GPIO_Init();
    extern int uart_init(void);
    uart_init();
    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
    extern void rt_fota_print_log(void);
    rt_fota_print_log();
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
}

void SysTick_Handler(void)
{
    /* enter interrupt */
    rt_interrupt_enter();

    rt_tick_increase();

    /* leave interrupt */
    rt_interrupt_leave();
}

Перевод:

RW_IRAM1, должен соответствовать доменному имени времени выполнения в связанном скрипте
#define HEAP_BEGIN ((void *) &Image$$RW_IRAM1$$ZI$$Limit)
#endif

#define HEAP_END STM32_SRAM1_END
#endif

/**
* Эта функция инициализирует вашу плату.
*/
void rt_hw_board_init() {

   HAL_Init();
   SystemClock_Config();
   /* Обновление системных часов */
   SystemCoreClockUpdate();

   /* Конфигурация системного тика */
   _SysTick_Config (SystemCoreClock / RT_TICK_PER_SECOND);
   MX_GPIO_Init ();
   extern int uart_init (void);
   uart_init ();
   /* Вызов инициализации компонентов платы (используйте INIT_BOARD_EXPORT ()) */
#ifdef RT_USING_COMPONENTS_INIT
   rt_components_board_init ();
#endif
   extern void rt_fota_print_log (void);
   rt_fota_print_log ();
#if defined (RT_USING_USER_MAIN) && defined (RT_USING_HEAP)
   rt_system_heap_init ((void *) HEAP_BEGIN, (void *) HEAP_END);
#endif
}

void SysTick_Handler (void) {
/* войти в прерывание */
rt_interrupt_enter ();

rt_tick_increase ();

/* выйти из прерывания */
rt_interrupt_leave ();
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Aladdin-Wang-RT-FOTA-STM32L431.git
git@api.gitlife.ru:oschina-mirror/Aladdin-Wang-RT-FOTA-STM32L431.git
oschina-mirror
Aladdin-Wang-RT-FOTA-STM32L431
Aladdin-Wang-RT-FOTA-STM32L431
master