Цитата(Alexey Belyaev @ Jan 8 2015, 11:58)

Всем првиеТ!
Экспериментирую с bootloader и пока сделал так: в самое начало Flash располагаю Bootloader, а с 0x0800400 первый попавшийся пример с USART из набора ChibiOS (ессестно с измененным .ld скриптом, чтобы начиналось всё с 0x0800400). Бутлоадер проверяет не нажата ли кнопочка при подаче питания на протяжении там 500ms и если нет, то перекидывает таблицу указателей и стек "на основное приложение", ежеле нажата кнопочка, то загружается сам и делает своё грязное дело. Ну всё примитивно просто и как обычно. Теперь захотелось странного - загрузить бутлоадер из приложения. Самое простое сделать SoftReset, но надо держать кнопочку. тогда я сделал ячейку в памяти куда пишу флаг и снова переношу таблицу векторов и вызываю ResetHandler бутлоадера. Но вот беда, всё падает и зависает.
Нет, переходить то оно переходит, но вызываются какие-то прерывания, видать которые были настроены в примере. Я пошёл в ЛОБ - перечислил перед переносом таблицы прерывания все регистры переферии, где можно было бы разрешить прерывание и запретил их наверняка. Отключил SysTick. Но ВСЁ РАВНО что-то происходит и bootloader зависает в Assert вызванный из заглушки на прерывание.
Есть способ выяснить что его вызывает? Дебагер не видит какое прерывание прыгнуло в этот указатель - back trace тупо начинается сразу с Assert().
Сижу вот и описываю все вектора в пустышки, дабы понять какая именно пустышка вызывается.
Чтото не так сделано, наверное.
В HardFaultHandlere можно поймать откуда что пришло.
Но: какая микросхема хоть?. А! СТМ32
А таблицу векторов зачем переносить? Просто SoftReset.
Код
void NVIC_GenerateSystemReset(void)
{
SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
}
Сообщение отредактировал A. Fig Lee - Jan 8 2015, 20:48
Верить нельзя никому, даже себе. Мне - можно.