在串口數據發送操作中,代碼一般是這樣寫的: 今天我們就來探討一下——while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); 到底有什麼作用 首先看一個標準庫文件:stm32l1xx_usart.c中對這個函數的描述: 暫且不管函數的內 ...
在串口數據發送操作中,代碼一般是這樣寫的:
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:發送完成標誌
如果你覺得不是很理解它們的區別,那我們來看張圖
由於我們今天只討論發送,所以我們只看紅框內的部分,大體講解一下串口發送的流程:
1)發送使能位置1,發送器先發送一個空閑幀
2)往數據寄存器(TDR)中寫入要發送的數據。
3)數據從數據寄存器轉入發送移位寄存器,併在最後一位數據轉入完成後,置USART_FLAG_TXE為1,表示數據寄存器為空,下一組數據可以進入了。
4)數據進入發送移位寄存器後,一位一位的通過Tx發送出去,當最後一位數據發送完成後,置USART_FLAG_TC為1,表示移位寄存器為空。