paska (15.11.2004 15:06, просмотров: 1173)
прерывания в LPC2124 есть два прерывания (irq) EINT1 и EINT2, оба по заднему фронту.
вот так запрограммирован VIC
VICIntSelect = 0;
VICVectCntl0 = (1 << 5) | 15;
VICVectCntl1 = (1 << 5) | 16;
/*обработчики, адреса пока не используются, просто чтоб что-то было*/
VICVectAddr0 = (long)0x111;
VICVectAddr1 = (long)0x222;
VICIntEnable = 0x3 << 15;
вот такая штука лежит по 0x18
ldr pc, [pc, #irq_handler_address - . - 8]
.......
irq_handler_address:
.word irq_handler
вот собственно irq_handler
irq_handler:
ldr r1, =0xfffff030
ldr r0,[r1] /*читаем VICVectAddr*/
ldr r0, =0
str r0, [r1] /*пишем туда нуль*/
subs pc, lr, #4 /*всё.*/
Работает это все следующим образом (сужу по остановке на subs в отладчике):
из серии прерываний по EINT2 реагирует толлько на первое (остановка здесь на при чем); если потом дать несколько по EINT1, то поймает тоже только первое, после чего ни на какие прерывания не реагирует.
Если сначала дать EINT1, то тоже только один раз, а EINT2 не сработает после этого ни разу.
Впечатление такое, что VIC будто бы не реагирует на запись нуля, т.е. "запоминает" приоритет предыдущего прерывания и пропускает только то, что "выше".
плата OLIMEX в комбинации с CW 1.2 и wiggler
более сложные схемы, когда irq_handler выбирает и запускает реальный обработчик работают аналогично (один раз)
Кто-то что-то знает?