Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Boot STM32F100
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
west329_
Пишу простой загрузчик под F100. В планах на старте использовать UART, а потом переехать на SPI, чтоб была возможность ещё и отлаживать собственные данные.

Недавно перебрался с ПИК, мозги ещё немного не перелинковал под АРМ.

Тело загрузчика размещаю в начале памяти RОМ первые 10 страниц памяти 10кБ.
По аналогии полез в линковщик прописал ему смещение относительно базового адреса 0x08000000 + 10кБ.
ИАР не возражал и перенёс исполняемый код по смещению.
Собственно сам загрузчик будет работать нормально, вопрос возник с рабочей программой, которая про загрузчик ничего не знает и самое главное вектора прерываний указываю на загрузчик а не на основную программу.
Вектора как понял сидят по адресу 0х8000000-0х800011f

Вопрос следующий, как перенести вектора прерываний, после загрузчика ?
KRS
Почитайте про NVIC на Cotrex-M3 это легко делается, (регистр VTOR)

здесь писал вариант перехода из загрузчика в основную программу, для IAR
http://electronix.ru/forum/index.php?s=&am...st&p=969601
west329_
Жаль что нельзя обойтись просто записью в линковщике, чтоб перенести векторы.
как то так
define symbol __ICFEDIT_intvec_start__ = 0x08000000 + 0x400;

проверил, стартует нормально до доходит до первого прерывания и улетает в космосс
KRS
Цитата(west329_ @ May 28 2013, 23:29) *
Жаль что нельзя обойтись просто записью в линковщике, чтоб перенести векторы.

Так достаточно просто обрезать флешь указав что начинается с 0x08000000 + 0x400;

west329_
Все таки можно на этапе линковки сместить таблицу векторов прерываний.

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

Изменения в BOOTstm32f100xB.icf
Код
define symbol __ICFEDIT_intvec_start__ = 0x08000000 + 0x400;
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 + 0x400;


Изменения в system_stm32f10x.c
Код
#define VECT_TAB_OFFSET  0x400


теперь можно смело писать 2 независимых приложения загрузчик и рабочий код, правда думаю перед выходом с загрузчика нужно остановить все прерывания, иначе можно улететь не туда

переключение таблицы выполняет void SystemInit(void) кому интетесно
Код
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif


Цитата(KRS @ May 28 2013, 22:47) *
Так достаточно просто обрезать флешь указав что начинается с 0x08000000 + 0x400;


Спасибо за помощь. Ваша ссылка разкоментила много пробелов относительно работы прерываний.
KRS
Цитата(west329_ @ May 28 2013, 23:52) *
переключение таблицы выполняет void SystemInit(void) кому интетесно
Код
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif

Это IMHO лишнее!
VTOR после ресета сам установится. (иначе программа вообще не стартанет).
А для старта основной программы - бутлоадер сам VTOR установит и перейдет по ресет вектору.
Зачем VTOR еще раз перезаписывать...


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.