Перейти к содержанию
    

Изменение стартового адреса программы stm32f105

Всем привет.

Есть StmCudeIDE, есть желание изменить дефолтный стартовый адрес с 0x08000000 на 0x08010000 и запустить отладчик.

Изменил в скрипте линкера:

/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8010000,   LENGTH = 192K
}
/*  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 256K */

в system_stm32f1xx.c изменил смещение таблицы прерываний:

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x00010000U /*!< Vector Table base offset field.
                                  This value must be a multiple of 0x200. */

в настройках проекта с дефолта меняю стартовый адрес (vector table=0x08010000)

112233.thumb.png.e6ea99401c9c5bd2f657d1a253fdce25.png

 

в STMProgrammer вижу что бинарик залит по адресу 0x08010000.

 

При попытке запуска отладчика программа падает.

Кто сталкивался, что делаю не так или еще что-то нужно сделать?

 

Спасибо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что бы вы там не меняли в настройках, микроконтроллер все равно будет стартовать с 0x08000000.

Примерно так ))))

 

Сначала - https://www.litres.ru/dzhozef-u/yadro-cortex-m3-kompanii-arm-polnoe-rukovodstvo-48411055/

А потом Cube )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, dimka76 said:

Что бы вы там не меняли в настройках, микроконтроллер все равно будет стартовать с 0x08000000.

Примерно так ))))

Это так.

Собственно а зачем стартовать с оффсета?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В линкерскрипте есть запись ENTRY(Reset_Handler). Отладчик по ней запускает код. Не важно с какого адреса он расположен. А вот при включении питания загрузчик, расположенный по адресу 0x08000000, должен передать управление куда надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, VladislavS said:

В линкерскрипте есть запись ENTRY(Reset_Handler). Отладчик по ней запускает код. Не важно с какого адреса он расположен. А вот при включении питания загрузчик, расположенный по адресу 0x08000000, должен передать управление куда надо.

оно так и предполагается, по 0x08000000 будет бутлоадер. Бутлоадер уже работает, шьет прошивку, но при переходе на адрес 0x08010000 всё виснет, в main.c бутлоадера:

#define FIRMWARE_START			(FLASH_BASE + 0x10000)

далее

			  typedef void (*pFunction)(void);
			  pFunction JumpToApplication;

			  HAL_RCC_DeInit();

			  SysTick->CTRL = 0;
			  SysTick->LOAD = 0;
			  SysTick->VAL = 0;

			  __disable_irq();

			  __DSB();

			  JumpToApplication = (void (*)(void)) (*((uint32_t *) ((FIRMWARE_START + 4))));
			  __set_MSP(*(__IO uint32_t*) FIRMWARE_START);
			  JumpToApplication();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этого есть отладчик. Смотрите всё, начиная с reset'a и до перехода на программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот мой переход.

#define INTERNAL_FLASH_SECTOR_0		FLASH_BASE
#define INTERNAL_FLASH_SECTOR_1		(INTERNAL_FLASH_SECTOR_0 + 16_kb)
#define INT_FLASH_SIZE	(INTERNAL_FLASH_SECTOR_1 + INT_FLASH_OFFSET_SIZE)
#define INT_FLASH_CRC	(INTERNAL_FLASH_SECTOR_1 + INT_FLASH_OFFSET_CRC32)
#define INT_FLASH_START	(INTERNAL_FLASH_SECTOR_1 + 4)
  
  
...
__set_MSP(*(uint *)(INTERNAL_FLASH_SECTOR_1));
SCB->VTOR = INTERNAL_FLASH_SECTOR_1;
((void(*)())(*((uint *)INT_FLASH_START)))();  // Offset 4: firmware length, firmware crc, reset handler	

Работает отлично

 

Вы не перекидываете вектора прерываний VTOR.
Вполне возможно при следующем прерывании вызывается обработчик, которого нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 минут назад, RadiatoR сказал:

Вот мой переход.


__set_MSP(*(uint *)(INTERNAL_FLASH_SECTOR_1));
SCB->VTOR = INTERNAL_FLASH_SECTOR_1;
((void(*)())(*((uint *)INT_FLASH_START)))();  // Offset 4: firmware length, firmware crc, reset handler	

Работает отлично

А если у ТС-а процессор в thread-mode работает?  :wink2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в бутлоадере?

 

Даже если и так, то он предусмотрит это. По крайней мере должен понимать как работать со своей средой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, RadiatoR said:

SCB->VTOR =

Это обычно делается в SystemInit() и руками не нужно устанавливать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, x893 said:

Это обычно делается в SystemInit() и руками не нужно устанавливать.

В моем случае до замены VTOR проводится обновления FLASH и расчет CRC. Только после совпадения происходит переход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Из под IDE норм работает и в дебаге и в релизе.

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

На первом же HAL_Delay прошивка остается навсегда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 час назад, x893 сказал:

Это обычно делается в SystemInit() и руками не нужно устанавливать.

Возможно, в этом и проблема. После перехода из загрузчика в  основную прошивку эта функция переопределяет значение VTOR на адрес начало флеш-памяти, т.е. на таблицу векторов загрузчика. А это совсем не то, что требуется для работы прерываний в основной программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, Darth Vader said:

Возможно, в этом и проблема. После перехода из загрузчика в  основную прошивку эта функция переопределяет значение VTOR на адрес начало флеш-памяти, т.е. на таблицу векторов загрузчика. А это совсем не то, что требуется для работы прерываний в основной программе.

там оффсет в прошивке задан, system_stm32f1xx.c:

 

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x00010000U /*!< Vector Table base offset field.
                                  This value must be a multiple of 0x200. */

в SystemInit

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

м.б. таблицу покорежило, надо смотреть ...

таблица правильная, systick хендлер описан верно

Изменено пользователем ichthyandr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...