ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
10 ноября
16704
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 выбирает и запускает реальный обработчик работают аналогично (один раз) Кто-то что-то знает?