Цитата
Функция обработчика объявлена как обычная функция, не содержащая необходимых действий по сохранению/восстановлению контекста. Именно поэтому прерывание только один раз и вызывается.
Функция (обработчик прерывания) должна выплюнуть последовательный код на ножку PB7. Восстановление контекста - какое именно, в pdf написано что возврат в прерванную функцию производится самостоятельно, ничего дописывать не надо, или я что-то не так понял. У меня поганится один из массивов - такое ощущение, что нормального выхода из прерывания нет и контроллер дальше выполняет инструкции, следующие за кодом прерывания (неизвестно какие -

).
Цитата
то где оформление функции как прерывания?
Код
static void PIOA_Handler( void )
В void IntInit(void):
...
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_IRQ2, 7, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,
PIOA_Handler);
...
Вообще void IntInit(void) брал из книги по ARM7, там AIC такой-же.
Вырезка из lib_AT91RM9200.h:
Код
__inline unsigned int AT91F_AIC_ConfigureIt (
AT91PS_AIC pAic, // \arg pointer to the AIC registers
unsigned int irq_id, // \arg interrupt number to initialize
unsigned int priority, // \arg priority to give to the interrupt
unsigned int src_type, // \arg activation and sense of activation
void (*newHandler) (void) ) // \arg address of the interrupt handler
{ unsigned int oldHandler;
unsigned int mask;
oldHandler = pAic->AIC_SVR[irq_id];
mask = 0x1 << irq_id;
//* Disable the interrupt on the interrupt controller
pAic->AIC_IDCR = mask;
//* Save the interrupt handler routine pointer and the interrupt priority
pAic->AIC_SVR[irq_id] = (unsigned int) newHandler;
//* Store the Source Mode Register
pAic->AIC_SMR[irq_id] = src_type | priority;
//* Clear the interrupt on the interrupt controller
pAic->AIC_ICCR = mask;
return oldHandler;
}
Сообщение отредактировал Antokha - Apr 22 2009, 19:15