здравствуйте, я начал зучать контроллер AT91sam7s256 и у меня появилась такая проблема при работе с прерываниями. прерывания от УАРТ происходят только 1 раз. по моей задумке они должны возникать при получении каждого символа с порта. что я сделал не так?
привожу текст функций(компилятор IAR).
//инициализация
void InitUART(void)
{
// AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,((unsigned int) AT91C_PA5_RXD0) | ((unsigned int) AT91C_PA6_TXD0 ),0); // Peripheral B
AT91C_BASE_PMC->PMC_PCER = 1<<AT91C_ID_US0;
AT91C_BASE_US0->US_IDR = (unsigned int) -1;
//* Reset receiver and transmitter
AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;
//* Define the baud rate divisor register
AT91F_US_SetBaudrate(AT91C_BASE_US0, MCK, COM0_BAUD);
//* Write the Timeguard Register
AT91F_US_SetTimeguard(AT91C_BASE_US0, 0);
AT91C_BASE_US0->US_MR = 0x08c0;
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,(void (*)(void))irq_handler0);
//AT91C_BASE_AIC->AIC_FFER=(1 << AT91C_ID_US0);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;
AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN ;
}
//обработчик прерывания
__ramfunc void irq_handler0()
{
unsigned int inter;
char informstroka[10];
AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)|0x08;
writeStr("irq_handler0\n\r");
if(((AT91C_BASE_US0->US_IMR) & AT91C_US_RXRDY)!=0)
{
//printf("asdas");
writeStr("?????????? ?? AT91C_US_RXRDY\n\r");
}
inter=AT91C_BASE_AIC->AIC_IVR;
writeStr("\n\AT91C_BASE_AIC->AIC_IVR=0x");
writeStr(LWordToHex(informstroka,inter));
writeStr("\n\r");
inter=AT91C_BASE_AIC->AIC_FVR;
writeStr("\n\AT91C_BASE_AIC->AIC_FVR=0x");
writeStr(LWordToHex(informstroka,inter));
writeStr("\n\r");
// AT91C_BASE_AIC->AIC_ICCR=(1 << AT91C_ID_US0);
AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA;
//AT91C_BASE_AIC->AIC_EOICR = 0;
}
//главная функция
void main(void)
{
unsigned char ii;
unsigned int x;
a=0;
//AT91C_BASE_AIC->AIC_EOICR = 0;
InitPIO();
InitUART();
InitSPI();
AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)|0x04;
writeStr("\n\r?????? ???\n\r");
writeStr("\n\rwhile...\n\r");
ii=0;
while(1)
{
//while(1) PutChar(GetChar());
if((((AT91C_BASE_PIOA->PIO_PDSR)&SW1_MASK)!=0))AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)|0x01;
else AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)&0xfffffffE;
if((((AT91C_BASE_PIOA->PIO_PDSR)&SW2_MASK)!=0))
{
ii=1;
}
else
{
ii=0;
info();
}
}
}
//вывод информации
void info(void)
{
char informstroka[15];
unsigned int inf,jj;
inf=AT91C_BASE_AIC->AIC_IECR;
writeStr("\n\rAT91C_BASE_AIC->AIC_IECR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_IDCR;
writeStr("\n\rAT91C_BASE_AIC->AIC_IDCR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=(unsigned int)irq_handler0;
writeStr("\n\r(unsigned int)irq_handler0=0x");
writeStr(LWordToHex(informstroka,inf));
/*inf=(unsigned int)AT91F_Default_IRQ_handler;
writeStr("\n\r(unsigned int)AT91F_Default_IRQ_handler=0x");
writeStr(LWordToHex(informstroka,inf));
inf=(unsigned int)AT91F_Default_FIQ_handler;
writeStr("\n\r(unsigned int)AT91F_Default_FIQ_handler=0x");
writeStr(LWordToHex(informstroka,inf));*/
inf=AT91C_BASE_US0->US_IMR;
writeStr("\n\rAT91C_BASE_US0->US_IMR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_IMR;
writeStr("\n\rAT91C_BASE_AIC->AIC_IMR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_IPR;
writeStr("\n\rAT91C_BASE_AIC->AIC_IPR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_ISR;
writeStr("\n\rAT91C_BASE_AIC->AIC_ISR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0];
writeStr("\n\rAT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0]=0x");
writeStr(LWordToHex(informstroka,inf));
for(jj=0;jj<31;jj++)
{
inf=AT91C_BASE_AIC->AIC_SMR[jj];
writeStr("\n\rAT91C_BASE_AIC->AIC_SMR[");
writeStr(ByteToHex(informstroka,jj));
writeStr("]=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_SVR[jj];
writeStr("\n\rAT91C_BASE_AIC->AIC_SVR[");
writeStr(ByteToHex(informstroka,jj));
writeStr("]=0x");
writeStr(LWordToHex(informstroka,inf));
}
inf=AT91C_ID_US0;
writeStr("\n\rAT91C_ID_US0=0x");
writeStr(LWordToHex(informstroka,inf));
inf=(1<<AT91C_ID_US0);
writeStr("\n\r(1<<AT91C_ID_US0)=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_SPU;
writeStr("\n\rAT91C_BASE_AIC->AIC_SPU=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_FFSR;
writeStr("\n\rAT91C_BASE_AIC->AIC_FFSR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_IVR;
writeStr("\n\rAT91C_BASE_AIC->AIC_IVR=0x");
writeStr(LWordToHex(informstroka,inf));
inf=AT91C_BASE_AIC->AIC_FVR;
writeStr("\n\rAT91C_BASE_AIC->AIC_FVR=0x");
writeStr(LWordToHex(informstroka,inf));
}