Как мога да променя началния адрес на флаш?

Използвам 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
Здравейте berendi, благодаря ви много за отговора. Разреших този проблем по твоето предложение. Промених байта на опцията от 0x0080 на 0x2010, след което работи добре. За байт с опция за запис направих следното. 1. Изпълнете STM32 ST-Link Utility. 2. Menu -› Target -› Option Bytes... --› Boot address option bytes. - 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 (или дори микроконтролер на кората на ръката), но изглежда, че 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

Можете също да напишете буутлоудър. Bootloader се намира на адреса 0x0800 0000 и зарежда фърмуера на вашето приложение, което означава, че скача към него.

Това е другият начин да го направите.

person yldzmuhammed    schedule 11.09.2020