Использую DBGU как UART. AT91SAMS7. В общем настроил прерывание и PDC. Но проблема в том, что прерывание срабатывает постоянно и из-за этого программа просто зависает. Код использую такой же как для US0. Но здесь почему-то прерывания срабатывают непрерывным потоком.
Код
Иннициализаци
AT91C_BASE_DBGU->DBGU_MR = DBGU_MODE;
AT91C_BASE_DBGU->DBGU_BRGR = (unsigned short)(FREQ / RATE / 16);
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS);
AT91C_BASE_PIOA->PIO_ASR = ((unsigned int) AT91C_PA10_DTXD)|((unsigned int) AT91C_PA9_DRXD);
AT91C_BASE_PIOA->PIO_BSR = 0;
AT91C_BASE_PIOA->PIO_PDR = (((unsigned int) AT91C_PA10_DTXD)|((unsigned int) AT91C_PA9_DRXD) | 0);
AT91C_BASE_DBGU->DBGU_RPR = 0;
AT91C_BASE_DBGU->DBGU_RCR = 0;
AT91C_BASE_DBGU->DBGU_RNPR = 0;
AT91C_BASE_DBGU->DBGU_RNCR = 0;
AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_SYS);
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGUHandler;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_SYS);
AT91C_BASE_DBGU->DBGU_IER = AT91C_US_ENDRX | AT91C_US_ENDTX;
AT91C_BASE_DBGU->DBGU_IDR = ~(AT91C_US_ENDRX | AT91C_US_ENDTX);
AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN // Enable the receiver
| AT91C_US_TXEN | AT91C_US_RSTSTA; // Enable the transmitter
Код
Отправка данных:
AT91C_BASE_DBGU->DBGU_CSR;
BASE_DBGU_PDC->PDC_TPR = (unsigned int)(unsigned char*)data;
BASE_DBGU_PDC->PDC_TCR = count;
AT91C_BASE_DBGU->DBGU_IER = (AT91C_US_ENDTX);
BASE_DBGU_PDC->PDC_PTCR = AT91C_PDC_TXTEN;
OSSemPend(Semaphore, 0, &error);
AT91C_BASE_DBGU->DBGU_IDR = (AT91C_US_ENDTX);
(unsigned long)AT91C_BASE_DBGU->DBGU_CSR;
BASE_DBGU_PDC->PDC_PTCR = AT91C_PDC_TXTDIS;
Код
Обработчик:
unsigned long S = AT91C_BASE_DBGU->DBGU_CSR;
S &= AT91C_BASE_DBGU->DBGU_IMR;
if (S & AT91C_US_ENDTX)
{
AT91C_BASE_DBGU->DBGU_IDR = (AT91C_US_ENDTX);
OSSemPost(Semaphore);
}
AT91C_BASE_AIC->AIC_IVR = 0;
AT91C_BASE_AIC->AIC_ICCR = 1 << _DBGUports->DBGU_ID;
AT91C_BASE_AIC->AIC_EOICR = 0;
В чем причина: для любой другой переферии такая тактика приводит к успеху, а вот с DBGU, прерывания вызываються непрерывано, что приводит к огромной загрузке процессора. В чем причина? помогите разобраться.
Сообщение отредактировал piz2383 - Jun 30 2009, 22:32