执行完上述发送函数后,硬件发现DR寄存器中没有数据,会立即进入TXE中断,接下来我们写TXE中断的服务函数:
//串口1的所有中断服务
void USART1_IRQHandler(void) //串口1中断服务程序
{
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //数据寄存器DR空中断TXE
{
if(get_fifo_used_size(&uart1TxFifo) > 0)//main调用链中操作uart1TxFifo的地方必须禁掉本中断(或全局中断)
{
uint8_t sendCh;
//从FIFO中取出一个字节并发送,这个字节一旦被从DR移入移位寄存器,就会再次进入本中断
gfifo_get(&uart1TxFifo, &sendCh, 1);
USART1->DR = sendCh;
}
else
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//FIFO中的所有数据都已发完,关中断
}
}
}
|