Запускаю УАРТ (9600, 8,1, без четности) (прерывание RXRDY), в обработчике прерывания заворачиваю данные.
Запускаю TESTCOM. Первые секунд десять все идет отлично (что отправили, то и получили), затем контроллер подвисает (причем, блок уарта продолжает работать, но раз в секунду теряя 1 символ). Такое ощущение, что где-то что-то переполняется...
код иницииализации уарта:
Код
void InitUart(void)
{
//отключаем пины USART0
AT91C_BASE_PIOA->PIO_PDR = PA1 | PA0;
AT91C_BASE_SYS->AIC_SVR[AT91C_ID_US0] = (INT32U) UartIrqHandler;
//растановка приоритета прерывания
AT91C_BASE_SYS->AIC_SMR[AT91C_ID_US0] = 0x63; // SRCTYPE=1, PRIOR=3. USART 0 interrupt positive edge-triggered at prio 3 //0x02;
//разрешение прерывания по Timer 1
AT91C_BASE_SYS->AIC_IECR = (1<<AT91C_ID_US0);
AT91C_BASE_SYS->AIC_ICCR = (1<<AT91C_ID_US0);
*AT91C_US0_BRGR = 625;
*AT91C_US0_MR = 0x000808C0; // Normal mode, 1 stop bit, no parity, async mode, 8 bits, MCK.
*AT91C_US0_IDR = 0xffffffff; // Disable all USART interrupts
*AT91C_US0_IER = AT91C_US_RXRDY;
*AT91C_US0_CR = AT91C_US_RXDIS | AT91C_US_TXDIS;
*AT91C_US0_CR = 0x0000010c; // Reset status bits, reset rx/tx.
*AT91C_US0_CR = AT91C_US_RXEN | AT91C_US_TXEN;
*AT91C_PMC_PCER = (1 << AT91C_ID_US0);
}
{
//отключаем пины USART0
AT91C_BASE_PIOA->PIO_PDR = PA1 | PA0;
AT91C_BASE_SYS->AIC_SVR[AT91C_ID_US0] = (INT32U) UartIrqHandler;
//растановка приоритета прерывания
AT91C_BASE_SYS->AIC_SMR[AT91C_ID_US0] = 0x63; // SRCTYPE=1, PRIOR=3. USART 0 interrupt positive edge-triggered at prio 3 //0x02;
//разрешение прерывания по Timer 1
AT91C_BASE_SYS->AIC_IECR = (1<<AT91C_ID_US0);
AT91C_BASE_SYS->AIC_ICCR = (1<<AT91C_ID_US0);
*AT91C_US0_BRGR = 625;
*AT91C_US0_MR = 0x000808C0; // Normal mode, 1 stop bit, no parity, async mode, 8 bits, MCK.
*AT91C_US0_IDR = 0xffffffff; // Disable all USART interrupts
*AT91C_US0_IER = AT91C_US_RXRDY;
*AT91C_US0_CR = AT91C_US_RXDIS | AT91C_US_TXDIS;
*AT91C_US0_CR = 0x0000010c; // Reset status bits, reset rx/tx.
*AT91C_US0_CR = AT91C_US_RXEN | AT91C_US_TXEN;
*AT91C_PMC_PCER = (1 << AT91C_ID_US0);
}
код обработчика прерывания:
Код
void UartIrqHandler(void)
{
INT8U Tmp = *AT91C_US0_CSR;
INT8U Data;
//AT91C_BASE_AIC->AIC_IVR = 0;
//AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_US0);
Data = *AT91C_US0_RHR;
do
{
Tmp = *AT91C_US0_CSR;
} while ((Tmp & 0x02) == 0);
*AT91C_US0_THR = Data;
Main.Led1Blink = 1;
AT91C_BASE_AIC->AIC_EOICR = 0; // Signal end of interrupt
}
{
INT8U Tmp = *AT91C_US0_CSR;
INT8U Data;
//AT91C_BASE_AIC->AIC_IVR = 0;
//AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_US0);
Data = *AT91C_US0_RHR;
do
{
Tmp = *AT91C_US0_CSR;
} while ((Tmp & 0x02) == 0);
*AT91C_US0_THR = Data;
Main.Led1Blink = 1;
AT91C_BASE_AIC->AIC_EOICR = 0; // Signal end of interrupt
}