Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7S64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
_4afc_
Не удаётся заставить правильно работать обработчик 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мкС.

Не пойму - то-ли я некорректно выхожу из обработчика, то-ли плохо сбрасываю прерывание?
_4afc_
Ошибку нашёл.Вот рабочий вариант.
Код
fiqvec:  
ldr           r8, =0xFFFFF000    //AT91C_BASE_AIC=0xFFFFF000
ldr           r9,[r8, #AIC_FVR]
                                         
ldr    r8, =0xFFFFF400    //AT91C_BASE_PIOA=0xFFFFF400
mov    r9, #1        
str    r9, [r8, #0x30]    //PIO_SODR=0x30    
str    r9, [r8, #0x34]    //PIO_CODR=0x34
subs    pc, lr, #4
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.