2017-01-04 6 views
0

Я написал загрузчик, чтобы перейти в мое приложение. Сначала я попытался с помощью простого мигающего приложения => Я могу перейти в приложение из загрузчика.Проблема с загрузчиком STM32F2

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

__disable_irq(); 
SCB->VTOR = (uint32_t)0x0800BA00; 
JumpAddress = *(__IO uint32_t*) (0X0800BA04); 
JumpToApplication = (pFunction) JumpAddress; 
__set_MSP(*(__IO uint32_t*) 0X0800BA00); 
JumpToApplication(); 

Я не знаю, что это неправильно и почему активация прерывания разбивают приложение.

Спасибо за вашу помощь

ответ

1

Перед тем, как перейти к приложению, вы должны деинициализации все, что вы инициализирован в загрузчике. Если ваш загрузчик использует USART с прерываниями, вы должны отключить этот USART (например, используя регистры /RCC->APBxRST) и отключить его прерывания. Вы также должны перейти к вашему приложению с включенными прерываниями. Ваше приложение должно получить чип так же, как и после обычного сброса.

Если ваше приложение использует эту хрень код из ST называется SPL или HAL, то убедитесь, что этот код делает НЕ сброс SCB-> Втор обратно в 0 или 0x8000000, потому что обычно он делает это в SystemInit(), который называется от Reset_Handler(), до main().

BTW - Вы абсолютно уверены в адрес вашего заявления? Вы обычно помещаете приложение на границу страницы, в то время как ваш код не указывает на то, что - 0x800ba00 (46.5kB) довольно далеко от ближайших границ страницы 32kB и 48kB ...

+0

Благодарим вас за ответ. Я отключил все периферийные и связанные прерывания. Мне также нужно сбросить их, как вы предлагаете? Я также подменяю общие прерывания перед прыжком. В SystemInit() я уже установил VECT_TAB_OFFSET в 0xBA00. Это не работает, когда приложение активирует прерывания. Есть ли у вас другая идея? Что касается адреса, я уверен, что это хороший, я пишу файл приложения-компоновщика, чтобы соответствовать этому адресу. – caius

+0

@caius - вы можете поручить компоновщику разместить ваше приложение на 0x800ba00, но имейте в виду, что мигание этого приложения на этот адрес приведет к стиранию памяти с 0x8008000 (32kB). Если он все еще не работает, то я думаю, вы должны попытаться отладить свою проблему - проверьте значения соответствующих регистров, посмотрите, что именно происходит «сбой» («не работает должным образом» или «перескакивает в жесткую ошибку» или sth другое) и т. д. –

+0

Еще раз спасибо за ваше время. Я попытаюсь отладить его, но я не уверен, как это сделать после перехода в приложение. Что касается адреса, я стираю с 0x8008000, как вы предлагаете. Чтобы понять, не стирают ли я его, каковы риски? – caius

0

установить настройку часов для кода загрузки & код приложения такой же

+0

это выглядит как комментарий, а не ответ. – LethalProgrammer