реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Boot STM32F100, Прошу помощи в написании загрузчика
west329_
сообщение May 28 2013, 18:04
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Пишу простой загрузчик под F100. В планах на старте использовать UART, а потом переехать на SPI, чтоб была возможность ещё и отлаживать собственные данные.

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

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

Вопрос следующий, как перенести вектора прерываний, после загрузчика ?
Go to the top of the page
 
+Quote Post
KRS
сообщение May 28 2013, 18:26
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Почитайте про NVIC на Cotrex-M3 это легко делается, (регистр VTOR)

здесь писал вариант перехода из загрузчика в основную программу, для IAR
http://electronix.ru/forum/index.php?s=&am...st&p=969601
Go to the top of the page
 
+Quote Post
west329_
сообщение May 28 2013, 19:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Жаль что нельзя обойтись просто записью в линковщике, чтоб перенести векторы.
как то так
define symbol __ICFEDIT_intvec_start__ = 0x08000000 + 0x400;

проверил, стартует нормально до доходит до первого прерывания и улетает в космосс
Go to the top of the page
 
+Quote Post
KRS
сообщение May 28 2013, 19:47
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

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

Go to the top of the page
 
+Quote Post
west329_
сообщение May 28 2013, 19:52
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



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

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

Изменения в 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;


Спасибо за помощь. Ваша ссылка разкоментила много пробелов относительно работы прерываний.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 28 2013, 20:09
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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 еще раз перезаписывать...


Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016