После прочтения комментариев звучит так, как будто у вас есть / вы хотите загрузчик.Если ваша цель здесь состоит в том, чтобы иметь два разных приложения, одно для выполнения основной обработки и обработки в реальном времени, а другое - просто для программирования новой прошивки, тогда вы хотите создать загрузчик в своем стандартном пространстве загрузки флэш-памяти.
Загрузчики принципиально делают несколько вещей, все остальное - лишние.
- Проверьте себя, используя какой-либо тип проверки целостности данных, например CRC.
- Проверяет приложение
- Переходык приложению.
Загрузчики также запрограммируют приложения в пространстве приложения и проверят, что они запрограммированы правильно, прежде чем переходить также.Колин дал несколько полезных советов о добавлении CRC в шестнадцатеричный файл перед его программированием во флэш-памяти для проверки приложений.
Есть несколько вещей, на которые стоит обратить внимание.Первым будет скрипт компоновщика, и это чрезвычайно важно.Сценарий компоновщика будет использоваться для сопоставления входных объектов с выходными объектами, а затем на основе этого сценария определить, в какое пространство памяти они попадают.Для обоих ваших приложений вам нужно создать карту памяти того, как вы хотите, чтобы обе программы находились внутри флэш-памяти.С этого момента вы можете затем создать сценарии компоновщика для обеих программ, так что шестнадцатеричный файл может быть сгенерирован в пределах параметров того, что вы считаете приемлемым флэш-пространством для программы.Каждый ваш проект будет иметь свой собственный скрипт компоновщика.Пример будет выглядеть примерно так:
LR_IROM1 0x08000000 0x00010000 { ; load region size_region
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00018000 { ; RW data
.ANY (+RW +ZI)
}
}
Это даст ОЗУ для приложения, а также отправную точку для приложения.
После этого вы можете запустить загрузчики дать ему информацию о том, где находится пространство приложения для прыжков и программирования.Еще раз это все определяется вами из вашей карты памяти и сценариев компоновщика обоих приложений.Вам нужно будет добавить отдельную запись внутри компоновщика для вашего CRC и длины для сравнения рассчитанных и сохраненных значений.Какой бы инструмент вы ни использовали, чтобы добавить CRC в шестнадцатеричный файл и запрограммировать его на флэш-память, не забудьте записать местоположение и сделать его известным скрипту компоновщика, чтобы вы могли ссылаться на эти адреса для проверки целостности позже.
После того, как вы проверите все и определите, что можно перейти к приложению, вы можете использовать некоторую сборку ARM, чтобы перейти к начальному адресу приложения.Перед прыжком обязательно отключите все периферийные устройства и прерывания, которые были включены в загрузчике.Как упоминал Колин, они будут совместно использовать ОЗУ, поэтому важно, чтобы вы деинициализировали все использованное, иначе у вас возникнет серьезная ошибка.
В этот момент программа использовала другой выложенный шестнадцатеричный файл.с помощью сценария компоновщика, поэтому он должен начать выполняться как запланировано, если у вас есть правильное смещение таблицы векторов, которое полностью входит в ваш вопрос.
Что касается вашего вопроса о "адресе вектора Flash", я думаю, что вы на самом деле имеете в виду адрес таблицы векторов прерываний.Таблица векторов прерываний - это структура данных в памяти, которая отображает запросы прерываний на адреса обработчиков прерываний.Именно здесь регистр ПК захватывает, например, следующий доступный адрес команды при срабатывании аппаратного прерывания.Это можно увидеть, отслеживая конвейер ARM в нескольких строках кода сборки.Каждая запись в этой таблице является адресом обработчика.Это смещение должно быть согласовано с вашим приложением, в противном случае вы никогда не зайдете в основную функцию, и программа окажется в пространстве приложения, но не имеет ничего общего, поскольку все адреса обработчиков неизвестны.Вот для чего SCB->VTOR
.Это регистр адреса смещения таблицы векторных прерываний.В этом случае вы можете сделать несколько вещей.К счастью, они жестко запрограммированы внутри файлов, сгенерированных STM, внутри файла "system_stm32 (xx) xx.c" (xx - ваш вариант микроконтроллера).Существует определение для чего-то, называемого VECT_TAB_OFFSET
, которое является смещением в карте памяти таблицы векторов и присваивается регистру SCB->VTOR
с выбранным значением.Ваша таблица векторов прерываний всегда будет лежать на начальном адресе вашего основного приложения, поэтому для загрузчика это может быть 0x00
, но для приложения это будет вычитание начального адреса пространства приложения и первого адресуемогофлэш-адрес микроконтроллера.
/************************* Miscellaneous Configuration ************************/
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
/******************************************************************************/
Перед программированием убедитесь, что вы понимаете, что ожидается от микропроцессора, используя документацию STM.Векторные таблицы в этом чипе могут быть кратны 0x200
.Но чтобы ответить на ваш вопрос, этот адрес можно определить несколькими способами.Ваша карта памяти, и, в конце концов, у вас будет жестко запрограммированная ссылка на нее как на определение.Вы можете понять это оттуда.
Надеюсь, это поможет и удачи вам в вашем приложении.