Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания от УАРТ в AT91SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
gitgit
здравствуйте, я начал зучать контроллер 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));
}
KRS
Может у меня дежавю, но недавно почти такая же тема была.

У вас запись в EOICR закоменнтирована. елси не записать контроллер не будет генерить следующее прерывание.
Сергей Борщ
Цитата(gitgit @ Jan 22 2008, 11:34) *
Когда вы создаете сообщение, в форме ввода есть разные кнопочки. При наведении мыши на кнопку с символом # появляется подсказка, что эта кнопка вставляет теги для оформления кода. Если хотите, чтобы вам помогли - оформите свой код этими тегами. Сейчас он совершенно нечитаем, и тратить свое время на форматирование за вас нет никакого желания.
gitgit
если AT91C_BASE_AIC->AIC_EOICR=0 написать, то от 1 символа программа зацикливается на этой функции. с этим не знаю что делать.

про вставление тэгов: попробую так делать. пока у меня браузер их не показывает. другой поставлю
KRS
Цитата(gitgit @ Jan 22 2008, 16:09) *
если AT91C_BASE_AIC->AIC_EOICR=0 написать, то от 1 символа программа зацикливается на этой функции. с этим не знаю что делать.

про вставление тэгов: попробую так делать. пока у меня браузер их не показывает. другой поставлю

Значит вы опять попадаете в прерывание. Скорее всего потому что не считываете данные ( регистр THR) или по ДМА, покрайней мере я не увидел у вас чтения.
gitgit
Вы правы! когда в обработчике прерываний начал считывать регистр приемника AT91C_BASE_US0->US_RHR, все заработало. Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.