但是群友提出,不能只等TC标志,原因是在串口DMA发送过程中,可能有比串口发送DMA优先级更高的其他通道开启传输过程,这样就会怠慢串口发送过程,使得TC标志置位,但是实际上发送过程还没有完成。于是增加对传输完成的检查,如下代码。
void USART0_printf(const char*format , ...)
{
int tx_len;
va_list args;
//将要发送的数据写入到DMA发送缓冲区USART0_tx_dma_buf
va_start(args,format);
tx_len = vsnprintf((char*)USART0_tx_dma_buf,USART0_TX_DMA_BUF_SIZE,format,args);
va_end(args);
if(tx_len>0)
{
dma_channel_disable(USART0_TX_DMA_CH); //关闭DMA通道,这样才能设置传输长度
dma_transfer_number_config(USART0_TX_DMA_CH,tx_len); //设置本次DMA传输长度
dma_channel_enable(USART0_TX_DMA_CH); //使能USART0_TX使用的DMA通道,开始DMA传输
}
//等待DMA传输完成
while(!dma_flag_get(USART0_TX_DMA_CH,DMA_FLAG_FTF));
dma_flag_clear(USART0_TX_DMA_CH,DMA_FLAG_FTF);
//等待传输完成TC
while(!usart_flag_get(USART0,USART_FLAG_TC));
usart_flag_clear(USART_FLAG_TC);
}
|