Перейти к содержанию
    

Не генерируются прерывания в STR912

Нет. У вас вообще получается, что последняя команда MSR не выполнена. Честно говоря, не знаю, как такое может быть :(

А что происходит с CPSR в реальном железе, без отладчика?

 

Вот то и получается, что в CPSR оказывается 0xD3

 

Вопрос. Что надо сделать, чтобы после загрузки в контроллер, можно было начать отладку не с main, а с стартапа.

 

Убирание галочки с Run to main() не помогает.

 

 

 

А не может H-JTAG при отладке как то прерывания отключать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не может H-JTAG при отладке как то прерывания отключать?

А без отладчика не пробовали тот же CPSR прочитать? Под отладчиком, да еще при открытых окошках VIC'а/периферии может быть что угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А без отладчика не пробовали тот же CPSR прочитать? Под отладчиком, да еще при открытых окошках VIC'а/периферии может быть что угодно.

 

Пробовал и без отладчика. НО все равно не срабатывает.

 

Вот например поставил, чтобы нога меняла свое состояние по прерыванию. Отключил отладчик, но ничего не происходит.

 

Судя по отладке, он остается в режиме Supervisor, но разрешение прерываний в этом режим ничего не меняет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно внимательно просмотреть инициализацию переферии (контроллера VIC, Timer) и разрешение их работы (снять Reset), а также тактирование выбранной переферии. В библиотеках ST, действительно, трудно разбираться, потому в отладчике нужно просмотреть инициализацию и тактирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 Прерывания завелись, но прерывание происходит только один раз. Методом проб и ошибок выяснилось, что при выходе из прерывания он то ли виснет, то ли не может вернуться в main();

Изменено пользователем artur_off

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2

h-jtag тут не причем.

 

функция обработчик прерывания должна быть специально оформлена с помощью ключевого слова (в IAR "__irq __arm void interrupt_function(void)") или обвертку написать на асме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

h-jtag тут не причем.

 

функция обработчик прерывания должна быть специально оформлена с помощью ключевого слова (в IAR "__irq __arm void interrupt_function(void)") или обвертку написать на асме.

 

Дело в том, что в прерывание он уже заходит, но прерывание происходит один раз, хотя должно быть каждую секунду(прерывание таймера по совпадению), а потом то ли зависает, то ли чтото не то с стеком, так как дальше абсолютно никаких действий не происходит.

По поводу H-JTAG. При отладке прерывания не работают вобще, то есть надо проверять без отладчика.

 

Заливаю свежую прошивку, выхожу из отладки, ресет процу, одно прерывание и тишина.

 

 

 

Компилятор у меня KEIL. C ИАРом не дружу.

Изменено пользователем artur_off

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Методом тыка выяснил причину проблемы(спасибо MALLOY2)

в файлах 91x_it.c и 91x_it.h функции для обработки прерываний объявлены так void TIM3_IRQHandler(void),

а надо вот так __irq void TIM3_IRQHandler(void).

Но в таком случае возникает вполне закономерный вопрос, неужели ребята из KEIL и ST могли так лопухнуться?

Или все же я чтото натворил?

Изменено пользователем artur_off

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но в таком случае возникает вполне закономерный вопрос, неужели ребята из KEIL и ST могли так лопухнуться?

Или все же я чтото натворил?

Ну так поделитесь с общественностью сначала, что вы натворили, и в результате чего прерывания заработали?

 

В кейловских примерах для STR910 модификатора для процедур прерываний нет, а вектор из стартапа уводит в ST'шную "бибилиотеку", что наводит на мысль, что в ней уже все предусмотрено. Не думаю, что могли лопухнуться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело было вот в чём, прерывание одно появлялось, но я не мог засечь его по одной простой причине, скорость счета таймера была очень высокая. Поставил делители на максимум, появилось одно прерывание и процессор уходил в неизвестность.

Потом после выяснения истории с функциями-обработчиками, прерывания завелись нормально.

Немного позже проверю на остальных прерываниях.

О результатах обязательно отпишусь.

Буду рад услышать замечания и рассуждения по этому поводу, так как сам сомневаюсь, что ошибка в библиотеках. 

Изменено пользователем artur_off

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C остальными прерываниями точно такая же ситуация. Приходится в объявлении обработчика писать __irq void ......().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! У меня возникла подобная проблема с STR912. Есть рабочий проект (был создан в старой версии keil v.3.53) Там прерывания работают. А если собрать новый проект в новом кейле (пробовала в keil v.4.13 и v.4.53) с этими же файлами проекта, файлами библиотеки, и с тем же стартапом, то прерывания не отрабатываются. Выполняется один раз и все. Прерывания глобально разрешены, настроены, но программа в прерывания больше не заходит. Хитрость с __irq не работает. Не могу понять в чем причина. У кого-нибудь было подобное? Помогите разобраться. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...