Проблема с Bootloader

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Alex-Elektron
Встал на лапы
Сообщения: 113
Зарегистрирован: Сб янв 11, 2014 21:25:55

Проблема с Bootloader

Сообщение Alex-Elektron »

Доброго времени суток!
Всё ПО пишу в Keil.
Есть самописный Bootloader, функция джампа на пользовательское ПО стандартная, адрес начала пользовательского ПО 0x08002000:

Код: Выделить всё

void GoToUserApp(void){
	uint32_t appJumpAddress;
	void (*GoToApp)(void);
       
	appJumpAddress = *(__IO uint32_t*)(FLASH_DISK_START_ADDRESS + 4);
	GoToApp = (void (*)(void))appJumpAddress;
     
	SCB->VTOR = FLASH_DISK_START_ADDRESS;
     
	__set_MSP(*(__IO uint32_t*) FLASH_DISK_START_ADDRESS); //stack pointer (to RAM) for USER app in this address
        
	GoToApp();
}
1) Есть пользовательское ПО со стоп-режимом, заливаю обычным ST-Linkом, всё работает, как часы
2) Шью через бутлоадер:
а) та же самая прошивка не работает как надо. МК не просыпается от RTC,
б) выключаю стоп-режим, прошивка начинает работать.

Т.е. явно нарушена адресация таблицы векторов прерываний

В файле system_STM32L1xx.c указал адрес смещения таблицы векторов

#define VECT_TAB_OFFSET 0x00002000U

в Target IROM1 указал 0x8002000 соответственно
на вкладке Linker поставил птицу в Use Memory Layout from Target Dialog

Что я упускаю?
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: Проблема с Bootloader

Сообщение AlanDrakes »

Проверьте, что вы возвращаете ВСЕ регистры в их исходное состояние перед переходом в секцию кода.
Была у меня схожая проблема со своим загрузчиком, в итоге причина оказалось именно в разрешённом прерывании и не восстановленых регистрах.
При прыжке в код приложения могло случайно сработать прерывание. В этот момент таблица векторов могла указывать как на загрузчик, так и на приложение - неопределённое поведение.
Либо прерывание возникало до его разрешения приложением - тоже неопределённое поведение (в случае SysTick + RTOS до запуска самой RTOS).
И прочие неявные мелочи.
Аватара пользователя
qbit
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт апр 02, 2013 10:03:29
Откуда: Санкт-Петербург
Контактная информация:

Re: Проблема с Bootloader

Сообщение qbit »

[uquote="Alex-Elektron",url="/forum/viewtopic.php?p=3817180#p3817180"]2) Шью через бутлоадер:
а) та же самая прошивка не работает как надо. МК не просыпается от RTC,
б) выключаю стоп-режим, прошивка начинает работать.

Т.е. явно нарушена адресация таблицы векторов прерываний

В файле system_STM32L1xx.c указал адрес смещения таблицы векторов

#define VECT_TAB_OFFSET 0x00002000U

в Target IROM1 указал 0x8002000 соответственно
на вкладке Linker поставил птицу в Use Memory Layout from Target Dialog[/uquote]

А в самой программе Вы меняете таблицу векторов? У Вас первой строчкой должно быть либо

Код: Выделить всё

#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
NVIC_SetVectorTable( NVIC_VectTab_FLASH, VECT_TAB_OFFSET );
либо

Код: Выделить всё

SCB->VTOR = NVIC_VectTab_FLASH | (VECT_TAB_OFFSET & (uint32_t)0x1FFFFF80);
Для связи email: info собака qbit.su
Alex-Elektron
Встал на лапы
Сообщения: 113
Зарегистрирован: Сб янв 11, 2014 21:25:55

Re: Проблема с Bootloader

Сообщение Alex-Elektron »

Да починилось всё само уже, спасибо) А на счёт
qbit писал(а):[uquote="Alex-Elektron",url="/forum/viewtopic.php?p=3817180#p3817180"]2) Шью через бутлоадер:
а) та же самая прошивка не работает как надо. МК не просыпается от RTC,
б) выключаю стоп-режим, прошивка начинает работать.

Т.е. явно нарушена адресация таблицы векторов прерываний

В файле system_STM32L1xx.c указал адрес смещения таблицы векторов

#define VECT_TAB_OFFSET 0x00002000U

в Target IROM1 указал 0x8002000 соответственно
на вкладке Linker поставил птицу в Use Memory Layout from Target Dialog[/uquote]

А в самой программе Вы меняете таблицу векторов? У Вас первой строчкой должно быть либо

Код: Выделить всё

#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
NVIC_SetVectorTable( NVIC_VectTab_FLASH, VECT_TAB_OFFSET );
либо

Код: Выделить всё

SCB->VTOR = NVIC_VectTab_FLASH | (VECT_TAB_OFFSET & (uint32_t)0x1FFFFF80);
я в загрузчике табличку векторов ещё меняю. Что мешало завестись программе, в итоге, так и не понял. Заработало и хорошо, больше подобных сбоев не было.
Ответить

Вернуться в «ARM»