484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
1

Artery AT32F415, повисание при вызове прерывания когда BOOT0=1

01.02.2024, 23:42. Показов 1459. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В срочном порядке осваиваю этот аналог STM. Работая с бутлодером напоролся на странную проблему. Если подать 1 на ножку BOOT0, программа повисает на вызове прерывания. Когда BOOT0=0 программа работает нормально. Очевидно что сигнал на BOOT0 управляет адресом таблицы векторов прерываний. Что можно сделать чтоб вернуть таблицу туда где она находится штатно при старте из флеш памяти? Мне нужно, т.к. надо работать через бутлодер.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2024, 23:42
Ответы с готовыми решениями:

Сбрасывается ли регистр di при вызове программного прерывания?
Добрый вечер, нужна помощь по вопросу связанному с прерываниями. Выполнил лабораторную работу на...

Как ввести новые данные при повторном вызове системного прерывания read
Здравствуйте. Если хоть кто-нибудь здесь работал в среде sasm, прошу у вас помощи. Дело в...

Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает?
Написал резидентную программу, всё работает, но если моя или другие программы вызывают функцию 4ch...

Ошибка при загрузке ОС boot0: error
Ноутбук Asus: Core 2 Duo 2.0 Ггц 3Gb ОЗУ Видео: NVidia 9400M g Пользовался этой раздачей...

Повисание при установке
Добрый вечер, Пытаюсь установить Windows 7, образ с MSDN. При установке как только появляется...

6
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,878
02.02.2024, 13:13 2
Вы дергаете boot0 во время работы программы? А собственно зачем? Неужели boot0 совмещена с обычной ногой GPIO?
По-хорошему после старта boot0 должен бы "защелкнуться" и ничему не мешать. Но если производитель камня где-то накосячил, то изменение boot0 может и "перемапливать" нулевой адрес то на 0x0800 0000 то на загрузчик.
Если такое и правда происходит, попробуйте явно прописать адрес таблицы прерываний на 0x0800 0000, а не на 0x0000 0000 как может быть сделано по дефолту.
Какой командой адрес таблицы меняется в AT32F415 я не знаю, но в документации или примерах должно быть описано.
0
484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
04.02.2024, 23:25  [ТС] 3
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы дергаете boot0 во время работы программы? А собственно зачем?
Собственно для понимания проблемы. Я загружаю программу через бутлодер (boot0=1), даю команду запуска, и она работает до первого прерывания. Запускаю с boot0=0 - все работает. Тогда я пробую вот это.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
то изменение boot0 может и "перемапливать" нулевой адрес то на 0x0800 0000 то на загрузчик.
В том то и дело что сама программа не перемапливается! В режиме бутлодера я даю команду jump на 0x0800 0000, программа успешно работает до первого прерывания. То есть выходит как будто перемапливается одна только таблица прерываний, программа остается на месте. Вот как это побороть, я и спрашиваю.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,878
05.02.2024, 00:06 4
Лучший ответ Сообщение было отмечено paskal как решение

Решение

Цитата Сообщение от paskal Посмотреть сообщение
Я загружаю программу через бутлодер (boot0=1), даю команду запуска, и она работает до первого прерывания.
Без ребута? То есть контроллер замапил его адрес на ноль, там же таблица прерываний. Потом переходите в свой код, не меняете адрес таблицы (то есть используется все та же бутовая) и при вызове прерывания все ломается. Так?
Если так, хорошо. Значит, описанного мной бага нет, во время выполнения программы, можно дергать boot0 как угодно.
Но все же попробуйте прописать адрес таблицы прерываний жестко и так, как он реально расположен, с 0x0800 0000

Добавлено через 4 минуты
Если я правильно понял написанное вот здесь, достаточно просто записать в SCB->VTOR правильный адрес.
C
1
2
3
__disable_irq();
SCB->VTOR = 0x08000000;
__enable_irq();
0
484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
07.02.2024, 20:52  [ТС] 5
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
SCB->VTOR = 0x08000000;
После этой строчки проблема решилась, спасибо.
0
523 / 217 / 28
Регистрация: 22.09.2023
Сообщений: 577
08.02.2024, 12:00 6
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но если производитель камня где-то накосячил, то изменение boot0 может и "перемапливать" нулевой адрес
Или кто-то невнимательно читает документацию.
Artery AT32F415, повисание при вызове прерывания когда BOOT0=1

Аналогично происходит и в STM32
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,878
08.02.2024, 13:21 7
А что вы этой цитатой сказать-то хотели? Что Boot0, Boot1 защелкиваются при любом ресете, и дальше напряжение на них можно менять как угодно? Так все это и так знали.
Или что ресет может быть любой - по питанию, по ножке reset, по выходу из режима отключения, по сторожевой собаке? Так тут тоже никто не сомневался.
По описанию из первого поста ТСа я опасался, что состояние не защелкивается. Но оказалось, все нормально.
0
08.02.2024, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2024, 13:21
Помогаю со студенческими работами здесь

Обработать ошибку, возникающую при вызове функции GetObject в случае, когда нет доступных экземпляров объекта
на строке Set wa = GetObject(, "Word.Application") выдает ошибку Run-time error 429; ActiveX...

MPlayer и QWidget (повисание при заезде виджета за край экрана)
Добрый вечер. Сразу к делу: Платформа: Windows Описание: Есть QWidget поверх которого...

Файл cmd не выполняется при вызове из программы, но работает при ручном вызове
Стоит win server 2008 На нем установлен Visual SVN Server Требуется сделать и итеграцию с...

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора...

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу...

При первом вызове замыкается реле №1, а при втором вызове реле №2
Всем добрый день возникла такая проблема с sim800 нужно что бы при первом вызове замыкалось реле №1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru