реклама на сайте
подробности

 
 
> Помогите выгрузить ОС и перейти в Bootloader, STM32, ChibiOS
Spider
сообщение Jan 8 2015, 16:58
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Всем првиеТ!

Экспериментирую с bootloader и пока сделал так: в самое начало Flash располагаю Bootloader, а с 0x0800400 первый попавшийся пример с USART из набора ChibiOS (ессестно с измененным .ld скриптом, чтобы начиналось всё с 0x0800400). Бутлоадер проверяет не нажата ли кнопочка при подаче питания на протяжении там 500ms и если нет, то перекидывает таблицу указателей и стек "на основное приложение", ежеле нажата кнопочка, то загружается сам и делает своё грязное дело. Ну всё примитивно просто и как обычно. Теперь захотелось странного - загрузить бутлоадер из приложения. Самое простое сделать SoftReset, но надо держать кнопочку. тогда я сделал ячейку в памяти куда пишу флаг и снова переношу таблицу векторов и вызываю ResetHandler бутлоадера. Но вот беда, всё падает и зависает.
Нет, переходить то оно переходит, но вызываются какие-то прерывания, видать которые были настроены в примере. Я пошёл в ЛОБ - перечислил перед переносом таблицы прерывания все регистры переферии, где можно было бы разрешить прерывание и запретил их наверняка. Отключил SysTick. Но ВСЁ РАВНО что-то происходит и bootloader зависает в Assert вызванный из заглушки на прерывание.
Есть способ выяснить что его вызывает? Дебагер не видит какое прерывание прыгнуло в этот указатель - back trace тупо начинается сразу с Assert().
Сижу вот и описываю все вектора в пустышки, дабы понять какая именно пустышка вызывается.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Spider
сообщение Jan 9 2015, 17:41
Сообщение #2


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



А как поймать?
Яж написал, что не хочу ресет, ибо придётся деражать кнопочку. Хочется перейти в бутлоадер, да так, чтобы дать ему понять, что это произошло не по ресету, а именно его вызвали "на сцену".
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 9 2015, 18:09
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Alexey Belyaev @ Jan 9 2015, 12:41) *
А как поймать?
Яж написал, что не хочу ресет, ибо придётся деражать кнопочку. Хочется перейти в бутлоадер, да так, чтобы дать ему понять, что это произошло не по ресету, а именно его вызвали "на сцену".

1.Я в JLink/IAR ставлю брейкпоинт на HardFaultHandler.

2. Легче использовать ресет, но передавать флаг.
Флаг может быть разный. У меня есть внешняя EEPROM, там флаг.
Работает так:
На ресет (в том числе и ресет/принудительный переход в бутлоадер) или питание:
а) проверяется состояние кнопки, если она нажата, стоим в бутлоадере
б) если она не нажата, читаем флаг, если он 0xFF, значит программы нет или она недействительна (или был принудительный переход в бутлоадер),
стоим в бутлоадере
в) если там 0хFE, значит мы записали правильную программу, и прыгаем туда
д) если мы все еще в бутлоадере, ждем команды. В гланую программу прыгаем по определенной команде

В программе:
а) делаем какуюто инициализацию
б) проверяем наш флажок, если там 0xFF, пишем туда 0xFE, чтобы бутлоадер нас загружал
в) если поступила команда в бутлоадер, пишем в флажок 0хFF, делаем ресет

В качестве флажка можно использовать:
а) внешнюю EEPROM
cool.gif внутренюю flash
c) battery backed RAM (RTC)
d) обычную RAM память. Только надо одну ячейку в определенном для бутлоадера и программе месте назначить __no_init в IAR и проверять ее на каой нибудь ключ, типа
0х3FDEADEB..



--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 20:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016