USART_FLAG_TXE和USART_FLAG_TC


在串口數據發送操作中,代碼一般是這樣寫的:

void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data)
{
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
    USART_SendData(USARTx,Data);
    
}

今天我們就來探討一下——while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); 到底有什么作用

首先看一個標准庫文件:stm32l1xx_usart.c中對這個函數的描述:

/**
  * @brief  Checks whether the specified USART flag is set or not.
  * @param  USARTx: Select the USART peripheral. 
  *   This parameter can be one of the following values:
  *   USART1, USART2, USART3, UART4 or UART5.
  * @param  USART_FLAG: specifies the flag to check.
  *   This parameter can be one of the following values:
  *     @arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5).
  *     @arg USART_FLAG_LBD:  LIN Break detection flag.
  *     @arg USART_FLAG_TXE:  Transmit data register empty flag.
  *     @arg USART_FLAG_TC:   Transmission Complete flag.
  *     @arg USART_FLAG_RXNE: Receive data register not empty flag.
  *     @arg USART_FLAG_IDLE: Idle Line detection flag.
  *     @arg USART_FLAG_ORE:  OverRun Error flag.
  *     @arg USART_FLAG_NE:   Noise Error flag.
  *     @arg USART_FLAG_FE:   Framing Error flag.
  *     @arg USART_FLAG_PE:   Parity Error flag.
  * @retval The new state of USART_FLAG (SET or RESET).
  */
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_FLAG(USART_FLAG));

  /* The CTS flag is not available for UART4 and UART5 */
  if (USART_FLAG == USART_FLAG_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  } 
    
  if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}

暫且不管函數的內部實現,函數的作用就是檢查USART特定的狀態位是否產生,第一個形參就是USART號,第二個形參是我們今天討論的重點!

我們今天就介紹和串口發送有關的兩個宏:USART_FLAG_TXE和USART_FLAG_TC

  USART_FLAG_TXE:發送緩沖區空標志

  USART_FLAG_TC:發送完成標志

如果你覺得不是很理解它們的區別,那我們來看張圖

源自STM32官方中文手冊

 

 由於我們今天只討論發送,所以我們只看紅框內的部分,大體講解一下串口發送的流程:

1)發送使能位置1,發送器先發送一個空閑幀

2)往數據寄存器(TDR)中寫入要發送的數據。

3)數據從數據寄存器轉入發送移位寄存器,並在最后一位數據轉入完成后,置USART_FLAG_TXE為1,表示數據寄存器為空,下一組數據可以進入了。

4)數據進入發送移位寄存器后,一位一位的通過Tx發送出去,當最后一位數據發送完成后,置USART_FLAG_TC為1,表示移位寄存器為空。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM