main_ubi_sdk v 0.1.3
This is UBI4 documentation
Bootloader иструкция по использованию

Загрузка бутлоадера

Правильно настроенный загрузчик просто ставится в проект.

Доработка основного приложения

Для того, чтобы основное приложение корректно загружалось в бутлоадер, нужно сделать следующие вещи. (На примере STM)

  1. Добавить __enable_irq(); В первую строчку void main(). Потому что загрузчик выключает прерывания перед переходом в основную программу.
  2. Найти в SDK/UBI_SDK.h MAIN_PROGRAM_START_ADDRESS. Это начало место начала основной программы. Например 0x0800A000U
  3. Переопределить вектора.
    1. Заходим в Core/Src/system_stm32**xx.c и находим там закомментированный #define USER_VECT_TAB_ADDRESS . Его нужно раскоментировать.
    2. Чуть ниже изменяем #define VECT_TAB_OFFSET 0x00000000U на значение сдвига Main_programm. Правильно будет без 0x08..., но если с ним, то тоже работать будет. В нашем примере это 0x0000A000U
  4. Переписать линковщик. Идем в STM32**xxxx_FLASH.ld. Находим строчку FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K и изменяем ее на FLASH (rx) : ORIGIN = 0x800A000, LENGTH = 86K (из общей длины надо вычесть размер сдвига и размер памяти data_table) После этого прошивка готова

Отладка двух проектов одновременно.

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

  1. Подключаем .elf файл. Идем в Debug configuration "основного" проекта, который мы хотим запускать. -> Startup -> Run command и пишем add-symbol-file ../UBI4_BMS_Bootloader/Debug/UBI4_BMS_Bootloader.elf 0x8000140 где путь относительный от корня проекта (ioc файла) к .elf файлу подключаемого проекта. А число 0x800... это адрес .text подключаемого проекта. Его можно найти в Build analizer -> Memory details. Это НЕ начало программы, а начало .text. Разные вещи.
  2. Опционально переименовываем main() бутлоадера в boot_main(). Лучше сделать это так
    int main(void)
    {
    // USER CODE BEGIN 1
    }
    int boot_main(void)
    {
    // USER CODE END 1
    int main(int argc, char *argv[])
    Definition CMakeCCompilerId.c:853
    Тогда генератор кода не будет это исправлять при каждом запуске. После этого надо переназначить в Core/Startup/startup_**.s файле bl main в bl boot_main. Теперь возвращаемся в Debug configuration -> Startup -> Run command и добавляем сточку b boot_main
    Attention
    Есть особенность. При первом запуске отладки дебаггер не успевает поставить брейкпоинт, он на нем не остановится, но остановится в boot_main() если перезапустить отладку без загрузки. То есть по нажатию кнопки "Reset the chip"

    Такое подключение работает в обе стороны. Можно запускать основную программу подключая бутлоадер как дополонительную (как в примере) и наоборот. Единстевнное, что не работает - Live watch не отображает переменные "дополнительной" программы.
    Attention
    Также надо помнить, что если ты поменял код "второстепенной" программы и после этого перезапустил отладку, это не изменит программую. Изменненный код нужно загружать отдельно, запуская его через дебаг test