USART_FLAG_TC与 USART_FLAG_TXE之间的区别,各自的用途 - 附举例代码及说明

USART_FLAG_TC与 USART_FLAG_TXE之间的联系,各自的用途

  • 名词解释(STM32固件库使用手册)

    • USART_FLAG_TXE发送数据寄存器空标志位
    • USART_FLAG_TC发送移位寄存器发送完成标志位USART_FLAG_TC与 USART_FLAG_TXE之间的区别,各自的用途 - 附举例代码及说明_第1张图片
  • 串口发送数据过程介绍

转入数据 - 软件操作
转入数据 - 硬件自动操作
发送数据 - 硬件自动操作
CPU
发送数据寄存器 TRD
发送移位寄存器
TX
  • USART_FLAG_TXE的用途:

    • 发送数据寄存器里的数据被全部取完时,该寄存器是空的,那么该标志位就会被置1。通过这个标志位的值可以判断发送数据寄存器中的数据有没有完全被取走,当该寄存器是空的时候,可以提醒CPU继续往该寄存器里存入新的数据;

  • USART_FLAG_TC的用途:

    • 发送移位寄存器里的每个字节通过TX脚一位一位发送出去之后,该标志位值就会被置1。通过这个标志位的值可以判断发送移位寄存器里的数据有没有被全部发送出去;

  • USART_FLAG_TXE和USART_FLAG_TC之间的联系:

    • 结合上面流程图来进行说明,实际上发送移位寄存器通过TX脚发送数据这个过程是比较耗时的,所以在此过程进行时,可通过判断当USART_FLAG_TXE = 1,即发送数据寄存器里的数据已被全部转入发送移位寄存器时,就让CPU往发送数据寄存器转入新的数据。
    • 发送移位寄存器把数据帧全部发送出去之后,可通过判断USART_FLAG_TC = 1,证明数据帧的最后一个字节都已经通过TX脚发送完了。

  • 代码举例

    
    /******************  发送一个字节  *****************************/
    void UART4_SendByte(uint8_t byte )
    {
    	/* CPU 将一个字节转入到 发送数据寄存器(TDR) */
    	USART_SendData(UART4, byte );
    		
    	/* 等待 发送数据寄存器(TDR)  将该字节全部转入到 发送移位寄存器 */
    	while (USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET);	
    }
    
    
    /***************  发送指定长度的数据帧 *************************/
    void UART4_SendArray(uint8_t *array, uint32_t length)
    {
    	uint32_t  k = 0;
    
    	/* CPU 将数据帧里的每个字节按顺序转入 发送移位寄存器*/
        do 
        {
           UART4_SendByte( *(array + k) );
           k++;
        } while(k < length);
    		
    	/* 等待 发送移位寄存器  将数据帧的最后一个字节的最后一位发送出去,整个数据帧发送完毕  */
    	while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
    }
    

  • 欢迎纠正,(づ ̄3 ̄)づ╭❤~
    如果有帮助到你,能点个赞吗?ღ( ´・ᴗ・` ) 比心

你可能感兴趣的:(STM32开发笔记,stm32,串口通信)