код из похожей оперы --> https://github.com/duff2013/LowPower_Teensy3/blob/master/utility/module.c
https://tfc-twr.googlecode.com/svn-history/r4/trunk/SRC/TFC_BringUp/Sources/TFC/TFC_UART.c
и зачем-то включение делают bitband-ом по первой ссылке при отправке блока просто проверяют наличие данных для передачи и разрешают прерывание, но не пихают символ на отправку. и уже в обработчике выгребают и отправляют, а после последнего байта отрубают разрешение прерывания
void TFC_UART_Process()
{
if(BytesInQueue(&TFC_TWR_UART0_OUTGOING_QUEUE)>0 && (UART4_S1 & UART_S1_TDRE_MASK))
UART4_C2 |= UART_C2_TIE_MASK; //Enable Transmitter Interrupts
if(BytesInQueue(&TFC_TWR_UART1_OUTGOING_QUEUE)>0 && (UART3_S1 & UART_S1_TDRE_MASK))
UART3_C2 |= UART_C2_TIE_MASK; //Enable Transmitter Interrupts
}
void UART3_ISR()
{
uint8_t Temp;
if(UART3_S1 & UART_S1_RDRF_MASK)
{
ByteEnqueue(&TFC_TWR_UART1_INCOMING_QUEUE,UART3_D);
}
if(UART3_S1 & UART_S1_TDRE_MASK)
{
if(BytesInQueue(&TFC_TWR_UART1_OUTGOING_QUEUE)>0)
{
ByteDequeue(&TFC_TWR_UART1_OUTGOING_QUEUE,&Temp);
UART3_D = Temp;
}
else
{
//if there is nothing left in the queue then disable interrupts
UART3_C2 &= ~UART_C2_TIE_MASK; //Disable the Interrupts
}
}
}
https://tfc-twr.googlecode.com/svn-history/r4/trunk/SRC/TFC_BringUp/Sources/TFC/TFC_UART.c
и зачем-то включение делают bitband-ом по первой ссылке при отправке блока просто проверяют наличие данных для передачи и разрешают прерывание, но не пихают символ на отправку. и уже в обработчике выгребают и отправляют, а после последнего байта отрубают разрешение прерывания