Цитата(aaarrr @ Sep 13 2007, 19:45)

Написали бы, в чем было дело, а то столько копий сломано было...
С удовольствием отвечу. Инициализировал UART0 так:
void MB_UARTInit( DWORD baudrate, DWORD IntrPriority )
{
DWORD Fdiv;
PINSEL0 = 0x00000050; /* RxD0 and TxD0 */
U0LCR = 0x83; // DLAB + 8 bits, no Parity, 1 Stop bit
Fdiv = ( Fpclk / 16 ) / baudrate ; /* baud rate */
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; // DLAB = 0
U0IER = 0x01; // Rx interrupt
U0FCR = (1 << 0)|(1 << 1);
VIC_SetVectoredIRQ(UART0Interrupt,IntrPriority,VIC_UART0);
VICINTENABLE |= 1UL << VIC_UART0;
}
Прерывания организовал так:
static void UART0Interrupt(void)
{
int status = U0IIR & 0xF;
int data = U0RBR;
if (status == 0x04)
{
MB_buf[MB_len+1] = data;
MB_len++;
}
else if (status == 0x0C)
{
}
VICADDRESS = 0;
}
Прикол в том, что при отладке этот код работает хорошо если не открывать вкладочку view->registers. Думаю, отладчик считывая состояния регистров UART0 "сбивает" логику алгоритма обработки прерывания... Но это лишь предположение, основанное на моем сугубо субъективном эмпирическом опыте.