artur_off 0 5 января, 2010 Опубликовано 5 января, 2010 · Жалоба Нет. У вас вообще получается, что последняя команда MSR не выполнена. Честно говоря, не знаю, как такое может быть :( А что происходит с CPSR в реальном железе, без отладчика? Вот то и получается, что в CPSR оказывается 0xD3 Вопрос. Что надо сделать, чтобы после загрузки в контроллер, можно было начать отладку не с main, а с стартапа. Убирание галочки с Run to main() не помогает. А не может H-JTAG при отладке как то прерывания отключать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 5 января, 2010 Опубликовано 5 января, 2010 · Жалоба А не может H-JTAG при отладке как то прерывания отключать? А без отладчика не пробовали тот же CPSR прочитать? Под отладчиком, да еще при открытых окошках VIC'а/периферии может быть что угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artur_off 0 5 января, 2010 Опубликовано 5 января, 2010 · Жалоба А без отладчика не пробовали тот же CPSR прочитать? Под отладчиком, да еще при открытых окошках VIC'а/периферии может быть что угодно. Пробовал и без отладчика. НО все равно не срабатывает. Вот например поставил, чтобы нога меняла свое состояние по прерыванию. Отключил отладчик, но ничего не происходит. Судя по отладке, он остается в режиме Supervisor, но разрешение прерываний в этом режим ничего не меняет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 5 января, 2010 Опубликовано 5 января, 2010 · Жалоба Нужно внимательно просмотреть инициализацию переферии (контроллера VIC, Timer) и разрешение их работы (снять Reset), а также тактирование выбранной переферии. В библиотеках ST, действительно, трудно разбираться, потому в отладчике нужно просмотреть инициализацию и тактирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artur_off 0 5 января, 2010 Опубликовано 5 января, 2010 (изменено) · Жалоба Прерывания завелись, но прерывание происходит только один раз. Методом проб и ошибок выяснилось, что при выходе из прерывания он то ли виснет, то ли не может вернуться в main(); Изменено 5 января, 2010 пользователем artur_off Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 5 января, 2010 Опубликовано 5 января, 2010 · Жалоба h-jtag тут не причем. функция обработчик прерывания должна быть специально оформлена с помощью ключевого слова (в IAR "__irq __arm void interrupt_function(void)") или обвертку написать на асме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artur_off 0 5 января, 2010 Опубликовано 5 января, 2010 (изменено) · Жалоба h-jtag тут не причем. функция обработчик прерывания должна быть специально оформлена с помощью ключевого слова (в IAR "__irq __arm void interrupt_function(void)") или обвертку написать на асме. Дело в том, что в прерывание он уже заходит, но прерывание происходит один раз, хотя должно быть каждую секунду(прерывание таймера по совпадению), а потом то ли зависает, то ли чтото не то с стеком, так как дальше абсолютно никаких действий не происходит. По поводу H-JTAG. При отладке прерывания не работают вобще, то есть надо проверять без отладчика. Заливаю свежую прошивку, выхожу из отладки, ресет процу, одно прерывание и тишина. Компилятор у меня KEIL. C ИАРом не дружу. Изменено 5 января, 2010 пользователем artur_off Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artur_off 0 5 января, 2010 Опубликовано 5 января, 2010 (изменено) · Жалоба Методом тыка выяснил причину проблемы(спасибо MALLOY2) в файлах 91x_it.c и 91x_it.h функции для обработки прерываний объявлены так void TIM3_IRQHandler(void), а надо вот так __irq void TIM3_IRQHandler(void). Но в таком случае возникает вполне закономерный вопрос, неужели ребята из KEIL и ST могли так лопухнуться? Или все же я чтото натворил? Изменено 5 января, 2010 пользователем artur_off Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 5 января, 2010 Опубликовано 5 января, 2010 · Жалоба Но в таком случае возникает вполне закономерный вопрос, неужели ребята из KEIL и ST могли так лопухнуться? Или все же я чтото натворил? Ну так поделитесь с общественностью сначала, что вы натворили, и в результате чего прерывания заработали? В кейловских примерах для STR910 модификатора для процедур прерываний нет, а вектор из стартапа уводит в ST'шную "бибилиотеку", что наводит на мысль, что в ней уже все предусмотрено. Не думаю, что могли лопухнуться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artur_off 0 5 января, 2010 Опубликовано 5 января, 2010 (изменено) · Жалоба Дело было вот в чём, прерывание одно появлялось, но я не мог засечь его по одной простой причине, скорость счета таймера была очень высокая. Поставил делители на максимум, появилось одно прерывание и процессор уходил в неизвестность. Потом после выяснения истории с функциями-обработчиками, прерывания завелись нормально. Немного позже проверю на остальных прерываниях. О результатах обязательно отпишусь. Буду рад услышать замечания и рассуждения по этому поводу, так как сам сомневаюсь, что ошибка в библиотеках. Изменено 5 января, 2010 пользователем artur_off Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artur_off 0 13 января, 2010 Опубликовано 13 января, 2010 · Жалоба C остальными прерываниями точно такая же ситуация. Приходится в объявлении обработчика писать __irq void ......(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 18 сентября, 2012 Опубликовано 18 сентября, 2012 · Жалоба Здравствуйте! У меня возникла подобная проблема с STR912. Есть рабочий проект (был создан в старой версии keil v.3.53) Там прерывания работают. А если собрать новый проект в новом кейле (пробовала в keil v.4.13 и v.4.53) с этими же файлами проекта, файлами библиотеки, и с тем же стартапом, то прерывания не отрабатываются. Выполняется один раз и все. Прерывания глобально разрешены, настроены, но программа в прерывания больше не заходит. Хитрость с __irq не работает. Не могу понять в чем причина. У кого-нибудь было подобное? Помогите разобраться. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться