Цитата
AIC_IVR читается дважды. Огласите название книжки.
Это моя отсебятина, начитался pdf-ника. Там сказано регистр считать, а cstartup.s не доглядел.
Про ошибку:
При использовании функции AT91F_AIC_ConfigureIt объявляя функцию static __arm __irq void PIOA_Handler( void ), получаю ошибку:
Error[Pe167]: argument of type "void (__arm __irq *)()" is incompatible with parameter of type "void (*)()"
На данный момент сделал так:
Инит:
Код
AT91C_BASE_PIOA->PIO_PPUDR |= ( DataInput );
AT91C_BASE_PIOA->PIO_ODR = ( DataInput );
AT91C_BASE_PIOA->PIO_BSR = ( DataInput );
AT91C_BASE_AIC->AIC_IDCR = ( 1UL<<AT91C_ID_IRQ2 );//disable interrupt IRQ2
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_IRQ2] |= ( AT91_REG )PIOA_Handler; // set isr
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ2] |= ( AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL ) | ( 7 ); // prio 7
AT91C_BASE_AIC->AIC_ICCR = ( 1UL<<AT91C_ID_IRQ2 );//clear interrupt
AT91C_BASE_AIC->AIC_IECR = ( 1UL<<AT91C_ID_IRQ2 );//enable interrupt
Обработка:
Код
static __irq __arm void PIOA_Handler( void )
{AT91C_BASE_PIOB->PIO_SODR = ( DDS_P2_MODULATION ); /* PB7 - выв 87 AT91RM9200 */
AT91C_BASE_PIOB->PIO_CODR = ( DDS_P2_MODULATION ); /* PB7 are output */
AT91C_BASE_AIC->AIC_EOICR = 0;
}
виснет после команды __enable_interrupt();
P.S. Имя обработчика прерывания осталось от нужного когда-то прерывания, извините уж.
А книжка - Это Редькин П.П. "32/16-битные микроконтроллеры ARM7 семейства AT91SAM7 Руководство пользователя"
Сообщение отредактировал Antokha - Apr 23 2009, 05:07