Работаю с UART. Разрешил прерывание THRE. Данное прерывание должно наступать когда передающий буфер FIFO пуст.
Но мною было обнаружено что данное прерывание наступает немного раньше и из-за этого мне пришлось вставить задержку. Без задержки байты накладывались друг на друга.
Вот код обработчика прерываний UART:
Код
void UART_IRQHandler(void){
unsigned long valueIIR;
unsigned char buffer;
valueIIR = LPC_UART->IIR >> 1;
valueIIR &= 0x07;
switch (valueIIR){
case 1: // THRE Interrupt
UART_HandlerTXInterrupt();
break;
case 2: // Receive Data Available (RDA)
buffer = LPC_UART->RBR;
//UART_sendByte(0x11);
break;
case 6: // CTI
buffer = LPC_UART->RBR;
//UART_sendByte(0x22);
break;
default:
buffer = LPC_UART->RBR;
break;
}
}
void UART_HandlerTXInterrupt(void){
unsigned char valueLSR;
unsigned char delay = 5;
valueLSR = (unsigned char)LPC_UART->LSR;
if ((Uart.numberTX > 0) && (CHECKBIT(valueLSR, 5))){
while(delay--);
LPC_UART->THR = *Uart.ptrTXBuffer;
Uart.numberTX --;
if (Uart.numberTX > 0){
Uart.ptrTXBuffer ++;
}
}
}
unsigned long valueIIR;
unsigned char buffer;
valueIIR = LPC_UART->IIR >> 1;
valueIIR &= 0x07;
switch (valueIIR){
case 1: // THRE Interrupt
UART_HandlerTXInterrupt();
break;
case 2: // Receive Data Available (RDA)
buffer = LPC_UART->RBR;
//UART_sendByte(0x11);
break;
case 6: // CTI
buffer = LPC_UART->RBR;
//UART_sendByte(0x22);
break;
default:
buffer = LPC_UART->RBR;
break;
}
}
void UART_HandlerTXInterrupt(void){
unsigned char valueLSR;
unsigned char delay = 5;
valueLSR = (unsigned char)LPC_UART->LSR;
if ((Uart.numberTX > 0) && (CHECKBIT(valueLSR, 5))){
while(delay--);
LPC_UART->THR = *Uart.ptrTXBuffer;
Uart.numberTX --;
if (Uart.numberTX > 0){
Uart.ptrTXBuffer ++;
}
}
}
Это черновик кода. Критиковать не нужно.
Кто-нибудь сталкивался с такой проблемой?