|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||||||
[Решено] bootloader, jump to application, hardfault08.08.2017, 14:09. Показов 17682. Ответов 18
Метки нет (Все метки)
Доброго времени суток.
Знаю, что подобное уже обсуждалось, однако то, что я вычитал, мне не помогло :( Есть stm32l151CBT6, там стоит загрузчик и, когда необходимо, прыгает в основную прошивку. Всё работало исправно, пока я не расширил функционал. Теперь же после прыжка попадаю в HordFault.
Гуглил что-то про регистры, характерные для данного ядра, которые могут подсказать причину ошибки, но понимания не достиг. В какую сторону лучше копать? Думаю, код основной прошивки тут не влияет. P.S. флаги FORCED и IBUSERR выставлены.
0
|
||||||
| 08.08.2017, 14:09 | |
|
Ответы с готовыми решениями:
18
stm32f0 bootloader - HardFault после __enable_irq [РЕШЕНО] STM32F4 HardFault и CooCox [Решено] HardFault при попытке настроить прерывание таймера |
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 08.08.2017, 14:18 | |
|
Перед прыжком отключаете всё, включая SysTick? Раз расширили функционал, значит включили где-то тактирование на периферийном устройстве, и после прыжка, возможно пытаетесь проинитить его заново.
0
|
|
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||||||||
| 08.08.2017, 14:32 | ||||||||
Если выпадает в ошибку в загрузчике, это не значит, что ошибка именно в загрузчике?
0
|
||||||||
|
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
|
|
| 08.08.2017, 14:38 | |
|
А что нагенерировал компилятор для этого кусочка?
0
|
|
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 08.08.2017, 14:42 | |
|
FriiRTOS в загрузчике нет?
0
|
|
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||
| 08.08.2017, 14:44 | ||
Hotd, FriiRTOS нет. Думаю совершить прыжок в другом месте, где ещё всякую периферию не инициализировал. Сейчас проверю.
0
|
||
|
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
|
||
| 08.08.2017, 14:52 | ||
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); Jump_To_Application(); Ассемблерный код какой получился?
0
|
||
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||
| 08.08.2017, 14:55 | ||
А ускоренный прыжок результатов не принёс, увы. Если после манипуляций со стеком (__set_MSP) ругается на выход за пределы стека, это же нормально? UPD: задумался, почему у меня JumpAddress сильно отличается от реального адреса, куда надо прыгнуть. Возможно, это мне и мешает.
0
|
||
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
||||||||||||||||
| 08.08.2017, 15:06 | ||||||||||||||||
|
Прыжок для F1:
0
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
|
| 08.08.2017, 15:16 | |
|
Перекидывать вектора обязательно и в загрузчике, и в основной программе?
JumpAddress - что это за значение должно быть? По map-файлу основной прошивки указывает на Riset_Homdler. Так и надо ведь?
0
|
|
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 08.08.2017, 15:32 | |
|
эмс, это адрес начала вашей основной проги, так-то, обычно адрес страницы. Вы основную прогу куда размещаете? Вот туда и должен указывать адрес прыжка.
0
|
|
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||
| 08.08.2017, 15:55 | ||
UPD: Гарантированно рабочий загрузчик не захотел совершать прыжок. Придётся искать причину в основной прошивке.
0
|
||
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||||||
| 08.08.2017, 18:16 | ||||||
|
О чём может свидетельствовать ситуация, когда прыжок выполняется в зависимости от прошивки в основной области программы? То есть если эта прошивка там была изначально, то прыжок выполняется. Если эту же прошивку закидываю во FLASH повторно, тоже выполняется. А вот если загружу другую прошивку, прыжок не выполняется. То есть экспериментировал с прошивкой 1 и 2. При залитой прошивке 1 не хочет прыгать к 2. Аналогично при залитой прошивке 2 не хочет прыгать к 1. Что я мог упустить в процессе записи прошивки? Складывал исключительно в область основной прошивки. Может быть надо что-то в другие участки памяти записать?
div, Сгенерировал файл *.s. код
0
|
||||||
|
-Otom-
|
||||||
| 09.08.2017, 13:55 | ||||||
|
У меня работает вот такая конструкция:
(Писалось для STM32F103 с некоторым количеством задействованой переферии. Перед собственно переходом - отключаем всё, что может вызвать прерывание. Без этого почти гарантировано оказываемся в похожем обработчике.
|
||||||
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
||
| 09.08.2017, 14:50 | ||
В ассемблерном коде что-то крутится в цикле (возможно, в бесконечном), потом выпадает в ошибку. Крутится где-то в __iar_program_stort, который идёт сразу после System_init.
0
|
||
|
-Otom-
|
||||||
| 09.08.2017, 16:09 | ||||||
|
Советую добавить пустые обработчики неописаных прерываний вида:
Если используете отладчик (лично я - arm-none-eabi-gdb + st-util) - то можно посмотреть стэк вызовов и хотя бы примерно определить причину произошедшего. Там же по адресам можно установить более детальную картину. |
||||||
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
|||
| 09.08.2017, 16:19 | |||
Чем больше адрес в Location, тем позже (глубже) вызывается функция?
0
|
|||
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
|
| 09.08.2017, 17:32 | |
|
CSTACK в IAR показывает кучу адресов, включая полностью состоящие из нулей. Далеко не все есть в map-файле. Последняя запись в момент повисания - это функция _call_main. В режиме отладки в ассемблерном коде у неё две инструкции: MOVS и BL main.
Похоже, даже чтобы немного понять причину, придётся изучать ассемблер. UPD: а скорее _call_main даже вызывалась первой, а не последней. Дальше идут непонятные адреса.
0
|
|
|
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 74
|
|
| 10.08.2017, 11:57 | |
|
Всем спасибо за поддержку. Проблема решена.
Получил новые знания. А причина банальна. Когда складывал новую прошивку, копировал данные не полностью. Поэтому запускаемая прошивка была нерабочей.
0
|
|
| 10.08.2017, 11:57 | |
|
Помогаю со студенческими работами здесь
19
FATFS и HardFault Отладка HardFault Ошибки HardFault STLink HardFault LR = 0xfffffff9 HardFault при запуске Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|