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

Не запускается прошивка из Bootloader'a на STM32F103

Всем привет!

 

Писал я писал прошивку и написал. Теперь захотелось сделать бутлоадер. Взял готовый бутлоадер, и подправил пару мест в своей прошивке:

В Ld скрипте заменил

FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 128K

на

FLASH (rx)      : ORIGIN = 0x8002000, LENGTH = 120K

 

В system_stm32f1xx.c убрал строки:

#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

а добавил их в самом начале main()

SCB->VTOR = FLASH_BASE + 0x2000; /* Vector Table Relocation in Internal FLASH. */

На этом казалось бы и всё. Если стартовать прошивку отладчиком - всё работает. Линковщик собирает адреса начиная с 0х08002000 и так далее. В таком случае Reset_Handler находится по смещению 0x0800db7c, а main() в 0x0800bb7c

 

Теперь немного о способе запуска основного кода из Bootloader:

Первое что делаю перед запуском это:

- Останавливаю используемый бутлоадером SysTick таймер:

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

- запрещаю прерывания:

__asm volatile ("cpsid i");

Уже от отчаянья сбрасываю NVIC:

NVIC->ICER[0] = 0xFFFFFFFF;
NVIC->ICER[1] = 0xFFFFFFFF;
NVIC->ICER[2] = 0xFFFFFFFF;

NVIC->ICPR[0] = 0xFFFFFFFF;
NVIC->ICPR[1] = 0xFFFFFFFF;
NVIC->ICPR[2] = 0xFFFFFFFF;

Отключаю периферию:

RCC->APB1RSTR = 0;
RCC->APB2RSTR = 0;
RCC->APB1ENR = 0;
RCC->APB2ENR = 0;

Сбрасываю RCC:

RCC_DeInit();

 

Далее стандартные шаги расчёта вектора перехода:

pProgResetHandler = (void(*)(void))(*((blt_addr *)(*(FLASH_BASE+0x2000)+0x00000004))); //Тут получается 0x0800db7c - та же цифра что и .Reset_Handler
__set_MSP(FLASH_BASE+0x2000);
pProgResetHandler();
while(1); // Это строка вроде как никогда не достижима

 

И вот тут самое интересное. Вектор переходит на .Reset_Handler и идёт исполнять его код, но к моменту когда надо прыгнуть на main() в отладке видно что строка имеет положенный ей вид:

bl 0x0800bb7c

и он даже прыгает туда, и попадает по нужному адресу, но о УЖАС в окне отладки совсем другой код. Какой-то вырванный из середины прошивки код. НО ОН ПО ЭТОМУ АДРЕСУ. а сам main() где-то в другом месте. Совсем в другом месте.

Как так то?

Что я делаю не так?

И естественно исполняя этот код процессор попадает в жуткие состояния.

Помогите чем нить :)

 

ЗЫ. Основная прошивка построена на FreeRTOS, но я не могу связать FreeRTOS и это состояние, т.к. до неё дело даже не доходит.

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


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

...но о УЖАС в окне отладки совсем другой код...

Как бэ не

__set_MSP(FLASH_BASE+0x2000);

а

__set_MSP(*(volatile unsigned int *)(FLASH_BASE+0x2000));

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


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

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

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

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

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

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

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

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

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

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