Как я могу изменить начальный адрес на флеш-памяти?

Я использую STM32F746ZG и FreeRTOS. Начальный адрес флеш-памяти - 0x08000000. Но я хочу поменять его на 0x08040000. Я искал эту проблему через Google, но не нашел решения.

Я изменил скрипт компоновщика следующим образом.

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
/* FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K */
FLASH (rx)      : ORIGIN = 0x8040000, LENGTH = 768K
}

Если я только изменю его и запустил отладчик, проблема будет. Если я изменю VECT_TAB_OFFSET с 0x00 на 0x4000, он будет работать нормально.

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x40000  /* 0x00 */

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 

Но если я не использую отладчик, он ничего не работает. Это означает, что он работает только при использовании ST-Linker.

Пожалуйста, дайте мне знать, если вы знаете решение. Спасибо за ваш ответ.


person Hans    schedule 05.07.2019    source источник
comment
Вопрос в том, почему вы хотите изменить начальный адрес.   -  person followed Monica to Codidact    schedule 05.07.2019
comment
У вас может быть автономный загрузчик, сидящий на первых страницах флэш-памяти. Это обычный вариант использования.   -  person SirNobbyNobbs    schedule 10.07.2019


Ответы (3)


Адрес загрузки может быть установлен в байтах опции.

Вы можете установить любой адрес во флеш-памяти с шагом 16k. В области байтов опций есть два 16-битных регистра, один используется, когда на выводе загрузки низкий уровень при сбросе, а другой - когда на выводе высокий уровень. Запишите желаемый адрес со сдвигом вправо на 14 бит, т. Е. Деленным на 16384.

Для загрузки с 0x08040000 запишите 0x2010 в регистр, как описано в главе Программирование байтов опций справочного руководства.

введите описание изображения здесь

person followed Monica to Codidact    schedule 05.07.2019
comment
Привет, Беренди, Большое спасибо за ответ. Я решил эту проблему вашим предложением. Я изменил байт опции с 0x0080 на 0x2010, тогда он работает нормально. Для байта опции записи я сделал следующее. 1. Запустите служебную программу STM32 ST-Link. 2. Меню - ›Цель -› Байты опций ... - ›Байты опций адреса загрузки. - person Hans; 08.07.2019
comment
Следующее - значение по умолчанию. BOOT_ADD0 (H) 0x0080 Загрузка с (H) 0x00200000 --- ›BOOT_ADD0 (H) 0x2010 Загрузка с (H) 0x08040000 3. Применить Итак, я изменил 3 части для изменения начального адреса флеш-памяти, и все работает нормально. 1. Сценарий компоновщика (0x08000000 - ›0x08040000) 2. System_stemf7xx.c (VECT_TAB_OFFSET 0x00 -› 0x40000) 3. Опционный байт (0x80 - ›0x2010) - person Hans; 08.07.2019

Вам нужно разместить 8 байтов в исходном начале FLASH. Stm32 всегда загружается с адреса 0x00000000, который совпадает с одним из модулей памяти (в зависимости от загрузочных контактов и параметров).

Первое слово содержит указатель стека, второе - обработчик сброса. Вы никогда не получите доступ к своему коду, поскольку он всегда загружается с одного и того же адреса.

Вам нужно будет изменить сценарий компоновщика и файлы запуска, в которых определены векторы.

person 0___________    schedule 05.07.2019
comment
К сожалению, все это не относится к STM32F7. - person followed Monica to Codidact; 05.07.2019
comment
Хорошее описание общего случая stm32 (или даже микроконтроллера ARM Cortex), но похоже, что stm32f7 действительно поддерживает это, как ответил @berendi. - person domen; 05.07.2019
comment
@berendi Конечно, это применимо, если цель - написать собственный загрузчик. О, менять адрес бессмысленно - person 0___________; 06.07.2019
comment
@P__J__ Всегда есть RAM по адресу 0 на F7, он не может переназначить что-либо еще там. Прочтите справочное руководство. - person followed Monica to Codidact; 06.07.2019
comment
@berendi с этой модификацией конечно для этого семейства - person 0___________; 06.07.2019

Вы также можете написать загрузчик. Загрузчик находится по адресу 0x0800 0000 и загружает прошивку вашего приложения, то есть переходит к нему.

Это другой способ сделать это.

person yldzmuhammed    schedule 11.09.2020