Не удаётся заставить правильно работать обработчик FIQ, если он написан на ассемблере.
Такое впечатление, что прерывание после работы не сбрасывается.
Тестировал так - на ногу FIQ подал меандр, с PA0 жду результата.
Если подключить сишный обработчик:
Код
void FIQ_handlerC( void )
{
AT91PS_PIO pPio;
int dummy;
pPio=AT91C_BASE_PIOA;
dummy =AT91C_BASE_PIOA->PIO_ISR;
dummy=dummy;
pPio->PIO_SODR = LED1;
pPio->PIO_CODR = LED1;
}
то всё работает (через 1мкС после спада меандра появляется короткий пик на PA0).
Если же я в файле Cstartup.S переписываю функцию fiqvec на свою(адрес 0x1C):
Код
fiqvec:
ldr r8, =0xFFFFF400 //AT91C_BASE_PIOA=0xFFFFF400
ldr r9, [r8, #0x4C] //PIO_ISR=0x4c
mov r9, #1
str r9, [r8, #0x30] //PIO_SODR=0x30
str r9, [r8, #0x34] //PIO_CODR=0x34
subs pc, lr, #4
то пики на PA0 появляются через каждые 0.7мкС.
Не пойму - то-ли я некорректно выхожу из обработчика, то-ли плохо сбрасываю прерывание?