STM32 текущий адрес вектора флэш-памяти - PullRequest
0 голосов
/ 08 февраля 2019

Я работаю в системе с двумя ОС с STM32F103, у меня есть две отдельные программы, которые запрограммированы в разных местах FLASH.если обе программы одинаковы, единственный способ узнать, какая из них запущена, это просто по ее начальному вектору.Но как я могу прочитать текущий вектор начального адреса программы в STM32 ???

1 Ответ

0 голосов
/ 06 марта 2019

После прочтения комментариев звучит так, как будто у вас есть / вы хотите загрузчик.Если ваша цель здесь состоит в том, чтобы иметь два разных приложения, одно для выполнения основной обработки и обработки в реальном времени, а другое - просто для программирования новой прошивки, тогда вы хотите создать загрузчик в своем стандартном пространстве загрузки флэш-памяти.

Загрузчики принципиально делают несколько вещей, все остальное - лишние.

  1. Проверьте себя, используя какой-либо тип проверки целостности данных, например CRC.
  2. Проверяет приложение
  3. Переходык приложению.

Загрузчики также запрограммируют приложения в пространстве приложения и проверят, что они запрограммированы правильно, прежде чем переходить также.Колин дал несколько полезных советов о добавлении 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.Но чтобы ответить на ваш вопрос, этот адрес можно определить несколькими способами.Ваша карта памяти, и, в конце концов, у вас будет жестко запрограммированная ссылка на нее как на определение.Вы можете понять это оттуда.

Надеюсь, это поможет и удачи вам в вашем приложении.

...