05.12.2011, 20:03
|
|
coma_nder
Гость
|
lpc2478 не работают прерывания
Использую lpc2478. Настраиваю прерывания. В регистры адреса и приоритета идет запись, прерывание срабатывает, а вот в VICAddress запись адреса обработчика прерывания не происходит. Что это может быть? Кто с таким сталкивался? Заранее благодарен.
|
|
|
|
06.12.2011, 11:46
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Прописали чтото типа:
VICVectAddr26 = (unsigned)T2COMP_vect;
VICVectPriority26 = 0x03;
VICVectCntl26=0x0f;
VICIntEnable|=_BV(26);
void T2COMP_vect (void) __irq
{
T2IR|=_BV(3);
VICVectAddr = 0;
return;
}
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
Сказали "Спасибо" serb-radio
|
|
|
06.12.2011, 15:01
|
|
coma_nder
Гость
|
Re: lpc2478 не работают прерывания
Проверяю под jtag. Вот код:
[HTML]#ifdef __lpc2478__
#include ‹nxp/iolpc2478.h›
#endif
__irq __arm void irq_handler (void);
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICADDRESS; // Get interrupt vector.
interrupt_function = (void(*)())vector;
if(interrupt_function != 0)
{
interrupt_function(); // Call vectored interrupt function.
}
VICADDRESS = 0; // Clear interrupt in VIC.
}
[/HTML]
в строчку vector = VICADDRESS; // Get interrupt vector он входит и считывает значение из VICADDRESS равное 0. В отладчике в поле отображения регистров VIC тоже значение VICADDRESS равно 0. Проверял на двух типах прерываниях - Timer0 и EXTINT0. Они разрешены и настроены правильно.
|
|
|
|
09.12.2011, 10:22
|
|
Прописка
Регистрация: 08.10.2009
Сообщений: 101
Сказал спасибо: 2
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: lpc2478 не работают прерывания
тут и будет 0
VICVectAddr26 = (unsigned)T2COMP_vect;
указатель нужен
|
|
|
Сказали "Спасибо" EugenPKH
|
|
|
12.12.2011, 07:01
|
|
coma_nder
Гость
|
Re: lpc2478 не работают прерывания
EugenPKH, а можно поподробнее, почему 0 будет? Этот кусок кода взят из примера NXP и в других программах работал.
|
|
|
|
12.12.2011, 19:49
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: lpc2478 не работают прерывания
А что за компилятор?
Обычно по-другому делают. Подгружается cstartup.s. И далее инициализируется как писал serb-radio. В прерывание автоматом влетать должно, если смещение верное задали в cstartup.s.
Для IAR и lpc2478:
ARM
__iar_init$$done: ; The vector table is not needed
; until after copy initialization is done
__vector:
; All default exception handlers (except reset) are
; defined as weak symbol definitions.
; If a handler is defined by the application it will take precedence.
LDR PC,Reset_Addr ; Reset
LDR PC,Undefined_Addr ; Undefined instructions
LDR PC,SWI_Addr ; Software interrupt (SWI/SVC)
LDR PC,Prefetch_Addr ; Prefetch abort
LDR PC,Abort_Addr ; Data abort
__vector_0x14:
DCD 0xFFFFFFFF ; RESERVED
;LDR PC,IRQ_Handler ; IRQ
LDR PC,[PC,#-0x120] ; IRQ
LDR PC,FIQ_Addr ; FIQ
видно что смещение 0x120.
В Keil аналогично. Можно найти файл.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
12.12.2011, 21:02
|
|
coma_nder
Гость
|
Re: lpc2478 не работают прерывания
Компилятор IAR, стартап подгружен. В том-то и дело, что все срабатывает, в прерывание входит. Вот только адрес он считывает 0, а не функции-обработчика.
|
|
|
|
13.12.2011, 17:02
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Чудес не бывает. Это простой регистр. Если вы туда занесли вектор, то считается вектор, ну а если ничего не заносили, то тогда понятно...
===
Только считывать оттуда ничего не надо. Там косвенный переход. Попробую вечером на пальцах объяснить. Приведу примеры.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
17.12.2011, 18:08
|
|
coma_nder
Гость
|
Re: lpc2478 не работают прерывания
SasaVitebsk, а как узнать, заношу ли я вектор или нет? где это можно проследить?
|
|
|
|
18.12.2011, 01:40
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Ну если есть JTAG, то остановился да посмотрел. Обычно вектор заносится во время инициализации. Да это и в симуляторе увидишь.
VICVectAddr26 = (unsigned)T2COMP_vect;
Это простое занесение в регистр вектора адреса п/п T2COMP_vect.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:02.
|
|