执行完上述发送函数后,硬件发现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中的所有数据都已发完,关中断
- }
- }
- }
|