Инициализация
Код
AT91C_BASE_SYS->PIOA_IDR = 0xffffffff;
// AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;
//* Disable the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_IDCR = 1<<AT91C_ID_US0;
//* Save the interrupt handler routine pointer and the interrupt priority
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt;
//* Store the Source Mode Register
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 2 ;
//* Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = 1<<AT91C_ID_US0;
AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_US0;
// AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;
//* Disable the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_IDCR = 1<<AT91C_ID_US0;
//* Save the interrupt handler routine pointer and the interrupt priority
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int) RX_interrapt;
//* Store the Source Mode Register
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 2 ;
//* Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = 1<<AT91C_ID_US0;
AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_US0;
Обработчик
Код
void RX_interrapt (void)
{
status = AT91C_BASE_US0->US_CSR;
status = AT91C_BASE_US0->US_RHR;
AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_SYS->AIC_EOICR = 0;
}
{
status = AT91C_BASE_US0->US_CSR;
status = AT91C_BASE_US0->US_RHR;
AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_SYS->AIC_EOICR = 0;
}
Срабатывание прерывания проверял брекпоинтом, если убрать брекпоинт, нажать на паузу - продолжить то программа улетает в
Код
__data_handler:
ldr pc,[pc,#+24] ;; Data abort
ldr pc,[pc,#+24] ;; Data abort