Перейти к содержанию
    

Прерывания от УАРТ в AT91SAM7S256

здравствуйте, я начал зучать контроллер 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));

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может у меня дежавю, но недавно почти такая же тема была.

 

У вас запись в EOICR закоменнтирована. елси не записать контроллер не будет генерить следующее прерывание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда вы создаете сообщение, в форме ввода есть разные кнопочки. При наведении мыши на кнопку с символом # появляется подсказка, что эта кнопка вставляет теги для оформления кода. Если хотите, чтобы вам помогли - оформите свой код этими тегами. Сейчас он совершенно нечитаем, и тратить свое время на форматирование за вас нет никакого желания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если AT91C_BASE_AIC->AIC_EOICR=0 написать, то от 1 символа программа зацикливается на этой функции. с этим не знаю что делать.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если AT91C_BASE_AIC->AIC_EOICR=0 написать, то от 1 символа программа зацикливается на этой функции. с этим не знаю что делать.

 

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

Значит вы опять попадаете в прерывание. Скорее всего потому что не считываете данные ( регистр THR) или по ДМА, покрайней мере я не увидел у вас чтения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы правы! когда в обработчике прерываний начал считывать регистр приемника AT91C_BASE_US0->US_RHR, все заработало. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...