Jump to content

    
Sign in to follow this  
Spider

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

Recommended Posts

Всем привет!

 

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

В 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 и это состояние, т.к. до неё дело даже не доходит.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this