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:发送完成标志
如果你觉得不是很理解它们的区别,那我们来看张图
由于我们今天只讨论发送,所以我们只看红框内的部分,大体讲解一下串口发送的流程:
1)发送使能位置1,发送器先发送一个空闲帧
2)往数据寄存器(TDR)中写入要发送的数据。
3)数据从数据寄存器转入发送移位寄存器,并在最后一位数据转入完成后,置USART_FLAG_TXE为1,表示数据寄存器为空,下一组数据可以进入了。
4)数据进入发送移位寄存器后,一位一位的通过Tx发送出去,当最后一位数据发送完成后,置USART_FLAG_TC为1,表示移位寄存器为空。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」