При ресете стартует загрузчик с 0х0800000 . Приложение с 0х0800С000. Последний адрес приложения, версия приложения тип приложения пишу в неиспользуемые вектора прерывания приложения. Загрузчик в файловой системе ищет файл с прошивкой. Если файл есть проверяет его тип и КС. Если ОК, то загружает файл с 0х0800С000 до последнего адреса из таблицы прерываний файла. Если файла нет то далее Он проверяет целостность приложения по КС .
Если КС ОК, то загрузчик запрещает прерывания, через VTAB меняет положение во флеш памяти таблицы прерываний на 0х0800С000 , загружает в стек значение первого слова приложениея и передает управление по адресу во втором слове приложения.
Приложение имеет WEB сервер и по http умеет загружать файл новой прошивки в файловую систему и затем делает програмный ресет, чтобы передать управление загрузчику.\
Для проектов с СМ0 прошивки грузятся по RS485/Modbus. Загрузчик короткий. Приложение с 0х08001800. При необходимости перепрошить Мастер по 485 дает команду приложению на ресет. После ресета начинает работать всегда загрузчик. Он ждет 2 сек команд мастера на заливку новой версии. Если у мастера есть прошивка, он в широковещательном режиме передает прошивку по шине RS485. Получив первую порцию прошивки ( там вектора) загрузчик каждого модуля на шине RS485 сверяет тип прошивки (из ячейки неиспользуемого вектора) со своим типом. Если она для него, то начинает писать её с адреса 0х08001800. Если прошивки нет, мастер сразу дает команду на старт приложения. Если мастер помер то загрузчик через 2 сек сам стартует приложение. Загрузчик проверяет КС приложения и если всё ок переписывает таблицу векторов из флеш в младшие адреса ОЗУ и переключает контроллер прерываний на ОЗУ (у CM0 нет VTAB)
В свойствах проекта пишу, что ОЗУ начинается с адреса 20000100, чтобы компоновщик не занимал младшие адреса ОЗУ под переменные.
Начало ПЗУ в свойствах TARGET проекта приложения 0х0800С000 (для СМ3, СМ4) или 0х08001800 (для СМ0)
Вначале приложение отлаживаю без загрузчика с 0х08000000, сделав два таргета - один с нулевого адреса для отладки без загрузчика, и второй для компоновки со смещением.
Для СМ3, СМ4 СМ0 пользуюсь только Кейлом. Никаких скриптов Link-у. После полной отладки. обьединяю нех файлы прошивок загрузчика и приложения в один для программирования при производстве. Пишу программатором ST-Link_v2 и STLink Utility