STM32 универсальный Bootloader — FOTA
Обновление прошивки, обычно называемое OTA (Over the Air) обновлением или FOTA (Firmware Over-The-Air) обновлением, представляет собой технологию обновления прошивки через интернет.
1.1 Режимы обновления загрузчика
Существует два распространённых режима обновления загрузчика:
RT-Thread OTA использует второй режим обновления загрузчика, сочетая разделы «загрузчик», «приложение» и «загрузка».
Для облегчения использования OTA обновления разработчиками, RT-Thread команда разработчиков предоставляет универсальный загрузчик. Разработчики могут использовать этот загрузчик для лёгкого управления, обновления и обслуживания прошивки устройств.
На рисунке ниже представлена структура программного обеспечения универсального загрузчика RT-Thread:
[Здесь вставьте изображение]
Официальный загрузчик RT-Thread предоставляется в виде файла bin. Его можно загрузить по адресу: http://iot.rt-thread.com.
Обычно во встраиваемых системах программы не имеют файловой системы, а Flash разделяется на различные функциональные блоки, образуя разные функциональные разделы.
Чтобы иметь возможность обновлять прошивку с помощью OTA, обычно требуется как минимум две программы, работающие на устройстве. Загрузчик отвечает за проверку и обновление прошивки, а приложение отвечает за бизнес-логику. Они выполняют разные функции и хранятся в разных адресах Flash, образуя разделы «загрузчик» и «приложение».
Однако большинство встраиваемых систем работают во Flash. При загрузке обновления прошивка не записывается непосредственно в раздел «приложение», а сначала загружается в отдельный раздел для временного хранения, называемый «раздел загрузки» или «раздел приложения 2», в зависимости от режима обновления загрузчика.
Загрузчик, приложение и раздел загрузки вместе образуют таблицу разделов. Таблица разделов определяет уникальные свойства каждого раздела, включая имя раздела, размер раздела и адреса начала и конца раздела.
Универсальный загрузчик содержит три раздела:
[Вставьте здесь изображение]
Ymodem — это протокол передачи текстовых данных, который обеспечивает поддержку передачи файлов в OTA-приложениях. Обновление прошивки на основе протокола Ymodem является примером применения OTA.
Процесс работы загрузчика представлен на рисунке ниже:
[Вставьте здесь изображение]
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.
Хотя автор RT-FOTA использовал версию nano от RT-Thread, он добавил полные компоненты device и finsh, что упрощает расширение дополнительных пакетов. Однако это также увеличивает размер nano, и пользователям, которым необходимо перенести проект, придётся переносить больше кода. Если пользователь использует полную версию RT-Thread, перенос будет проще, но займёт больше места во Flash. Поэтому, чтобы уменьшить занимаемое пространство и упростить перенос, я улучшил RT-FOTA следующим образом:
После улучшения 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
Рисунок 2. Описание изображения.
Рисунок 3. Описание изображения.
Рисунок 4. Описание изображения.
Рисунок 5. Описание изображения.
Ymdown — это команда загрузки на основе протокола Ymodem, использующая компоненты ymodem и ymodem_ota системы RTT. В файле ymodem_ota.c параметр DEFAULT_DOWNLOAD_PART устанавливается как раздел по умолчанию для загрузки, то есть при использовании команды ymdown без параметров загрузка будет выполняться в раздел DEFAULT_DOWNLOAD_PART. Также можно указать раздел для загрузки с помощью параметра раздела.
Рисунок 6. Описание изображения.
Рисунок 7. Описание изображения.
Шаг 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 )