但是群友提出,不能只等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);
- }
|