Знающие люди подскажите: В исходном коде прерывание от PIOA запускается только раз от кнопки SW2. Keil (RealView) + Simulator.
__irq void pio_c_irq_handler( void ) { if ( (AT91C_BASE_PIOA->PIO_PDSR & LED2 ) == LED2 ) AT91C_BASE_PIOA->PIO_CODR = LED2; else AT91C_BASE_PIOA->PIO_SODR = LED2; //AT91C_BASE_AIC->AIC_EOICR = 0; }
int main (void) { AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PIOA); AT91C_BASE_PIOA->PIO_PER = LED2; AT91C_BASE_PIOA->PIO_OER = LED2; //* LCD_CS_pin Output AT91C_BASE_PIOA->PIO_CODR = LED2; //* LCD_CS_pin = 0 AT91C_BASE_PIOA->PIO_ODR = SW_MASK; AT91C_BASE_PIOA->PIO_PER = SW_MASK; //* SIGNAL SW_MASK Input //AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_PIOA); AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = (AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL | PIO_INTERRUPT_LEVEL) ; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int) (pio_c_irq_handler) ; //AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_PIOA); AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_PIOA); //AT91C_BASE_PIOA->PIO_IMR = SW1; AT91C_BASE_PIOA->PIO_IER = SW2; while(1) ; }
Если разкоментировать строку в обработчике, обработчик выполныется все время и из него не выходим. Что не так?
Все разобрался, не хватало прочтения AT91C_BASE_PIOA->PIO_ISR;
Р.S. Два дня ковырял.
|