Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FIQ на RM9200, не сбрасывается прерывание
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SSSK
Помогите разобраться !!! AIC не сбрасывает прерывание при считывании FVR.

В стартапе:

org 0x1c
ldr PC,[PC,#-0xF20]

В main.c:
__arm __fiq void f_handler( void ) ;

int main()
{
....
PIOB_PDR = (1 << 28); // PB28 - Perepheral control
PIOB_ASR = (1 << 28); // PB28 - PA (FIQ)
PIOB_ODR = 0x1000ffff; // As input
PMC_PCER = 8;
AT91C_BASE_AIC->AIC_SVR[0] = ( AT91_REG )f_handler ; /* set isr */
AT91C_BASE_AIC->AIC_SMR[0] = (3 << 5) ; /* Positive - edge triggered */
....
}

Тело обработчика:

__arm __fiq void f_handler( void )
{
AIC_EOICR = 0; // Здесь ставлю брейкпоинт и проверяю регистры
}

По теории AIC должен сбросить прерывание при считывании FVR, однако это не отслеживатеся в самом прерывании, да и в результате подачи единичного положительного фронта на PB28 программа зацикливается в обработчике. Если принудидельно очищать прерывание AIC_ICCR = 1, то все нормально работает (но такой способ ИМХО неверен). Подскажите плиз в чем проблема.
AlexBoy
У меня работает без записи в EOICR, для FIQ это не нужно, т.к. у FIQ один приоритет.

;------------------------------------------------------------------------------
EXPORT _SoftDMAHandler
_SoftDMAHandler
ldmia r12!, {r8,r9,r10}
stmia r13!, {r8,r9,r10}

ldmia r12!, {r8,r9,r10}
stmia r13!, {r8,r9,r10}

ldmia r12!, {r8,r9}
stmia r13!, {r8,r9}

subs r11, r11, #1
subnes pc, lr, #4

_SoftDMAHandler_empty
MRS r8, SPSR
orr r8, r8, #F_BIT
MSR SPSR_c, r8

LDR R8, =_SoftDMAHandler_empty
LDR R9, _AIC_SVR
STR R8, [R9]

subs pc, lr, #4
;------------------------------------------------------------------------------
void SoftDMAInit(void)
{
DWORD status;

status = AT91F_GetIntStatus();
AT91F_DisableIntCPSR();

// настраиваем сигнал FIQ
*AT91C_PMC_PCER = 1<<AT91C_ID_PIOB; // подаем частоту на PIOB
*AT91C_PIOB_PDR = AT91C_PIO_PB28; // выкл. режим PIO
*AT91C_PIOB_ASR = AT91C_PIO_PB28; // выбираем устройство A (вход FIQ)

// настраиваем прерывание FIQ
SoftDMASetHandler((void*)_SoftDMAHandler);
*AT91C_AIC_ICCR = (1 << AT91C_ID_FIQ); // Очистка прерывания FIQ
*AT91C_AIC_IECR = (1 << AT91C_ID_FIQ); // Разрешение прерывания FIQ

SoftDMASetRate(150000);

AT91F_PurgeInterrupts();

AT91F_SetIntStatus(status);
}

// ------------------------------------------------------------------------------
void SoftDMASetHandler(void *handler)
{
*AT91C_AIC_IDCR = (1 << AT91C_ID_FIQ); // Запрещение прерывания FIQ

// Установка вектора
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_FIQ] = (DWORD)handler;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_FIQ] = AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST;
}
SSSK
Спасибо за овет, но интересует почему не сбрасывается сразу при чтении AIC_FVR, может будут соображения по инициализации?
Есть ссылки на рабочий проект где используется FIQ?
Попытаюсь пока сделать как в вашем коде.
AlexBoy
Цитата(SSSK @ Dec 27 2006, 18:01) *
Спасибо за овет, но интересует почему не сбрасывается сразу при чтении AIC_FVR, может будут соображения по инициализации?
Есть ссылки на рабочий проект где используется FIQ?
Попытаюсь пока сделать как в вашем коде.


Это из рабочего проекта, пересылка блоков в памяти. У меня работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.