vovanse
Oct 11 2006, 09:48
Пытаюсь разобраться с AT91SAM7S64 и никак не могу добиться прерывания от PIOA - насколько я понял можно вызвать прерывание по изменению состояния вывода. Сделал так, используя примеры от Atmel
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, (SW1|SW2|SW3|SW4|AT91C_PA8_CTS0));
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA, 6, T91C_AIC_SRCTYPE_INT_HIGH_LEVEL, IntHandler);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW1|SW2|SW3|SW4);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
обработчик прерываия
__ramfunc void IntHandler(void)
{
gtmp=12;
};
меняю состояние портов и ничего... Что то еще не включил? Может у кого есть пример?
Сергей Борщ
Oct 11 2006, 10:13
Цитата(vovanse @ Oct 11 2006, 12:48)

Пытаюсь разобраться с AT91SAM7S64 и никак не могу добиться прерывания от PIOA - насколько я понял можно вызвать прерывание по изменению состояния вывода. Сделал так, используя примеры от Atmel
меняю состояние портов и ничего... Что то еще не включил? Может у кого есть пример?
Код
AT91C_BASE_PIOA->PIO_IER = (1UL<<19); // FFSK_CLK
AT91C_BASE_PIOA->PIO_IFER = (1UL<<19);
AT91C_BASE_PIOA->PIO_ODR = (1UL<<19);
AT91C_BASE_PIOA->PIO_PER = (1UL<<19);
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PIOA);
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_LOWEST;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (uint32_t)FFSK_Buffer::Int_Handler;
AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic done in c-spy .mac
AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_PIOA); // enable ints
namespace FFSK_Buffer {
__irq __arm void Int_Handler() {
if((AT91C_BASE_PIOA->PIO_ISR & (1<<19)) && signal (FFSK_CLK))
RxBit();
AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic
}
}