Мне нужно переместить isr_vector, чтобы освободить место для двух переменных, которые мне нужно там сохранить.
Я попробовал это в скрипте компоновщика
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 92K
RAM2 (xrw) : ORIGIN = 0x10000000, LENGTH = 32K
FLASH0 (rx) : ORIGIN = 0x08000000, LENGTH = 4K
FLASH (rx) : ORIGIN = 0x08001000, LENGTH = 1020K
my_ram (xrw) : ORIGIN = 0x20017000, LENGTH = 4K
}
/* Define output sections */
SECTIONS
{
/* CUSOTM SECTION */
.myBufBlock(NOLOAD) :
{
KEEP(*(.myRAM)) /* keep my variable even if not referenced */
} > my_ram
.crcBlock :
{
. = ALIGN(8);
KEEP(*(.myCrcSection)) /* Startup code */
. = ALIGN(8);
} >FLASH0
/* The startup code goes first into FLASH */
.isr_vector :
{
. = ALIGN(8);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(8);
} >FLASH
И изменил смещение на 0x1000:
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
VECT_TAB_OFFSET = 0x1000;
VECT_TAB_BASE_ADDRESS = 0x08000000UL;
Когда я это делаю, программа на stm32 не запускается, что я делаю не так?
Не было бы разумнее переместить ваши пользовательские переменные вместо того, чтобы настаивать на «по причинам-...». В MCU не может быть ничего более важного, чем таблица векторов, поэтому я никогда не понимаю, почему все настаивают на ее перемещении.
По крайней мере, ваш вектор сброса должен находиться в начале флэш-памяти, иначе как процессор узнает, какую инструкцию выполнить первой?
Ваша идея неверна
Это невозможно — начальный указатель стека хранится во флэш-памяти со смещением 0 (*), а вектор сброса — со смещением 4.
Когда вы включаете систему, ЦП всегда будет загружать SP и ПК с этих смещений, чтобы он мог начать выполнение вашего кода. Нет никакого способа изменить это. (Вы можете переместить таблицу векторов позже, после запуска кода, но не раньше.)
Я бы предложил поместить ваш CRC или любые другие данные, которые у вас есть, с некоторым фиксированным смещением после таблицы векторов.
(*) Обратите внимание, что вы можете использовать загрузочные контакты (и регистры конфигурации загрузочных контактов) для сопоставления SRAM или системного загрузчика по адресу 0x00000000, но здесь это вам не поможет.
Я понял, что мне нужно сначала разместить Isr_vector в памяти, а затем поместить мои данные, а затем остальной пользовательский код.
Где изменить таблицу векторов? в основной()? Вы вообще добираетесь до главного? Можно ли мигать светодиодом? В конце концов, базовая программа мигания не требует прерываний, поэтому наличие мигающего светодиода будет означать, что по крайней мере запуск прошел правильно. Вы не показали, где находится исполняемый файл .text. Где на самом деле находится ваш обычный исполняемый код?