在串口数据发送操作中,代码一般是这样写的:

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,表示移位寄存器为空。

最新文章

  1. PYTHON lambda表达式
  2. Integer.valueof(null)报错
  3. rsync安装配置及故障解决完全教程[window, 文件同步]
  4. Java中的IO流系统详解(转载)
  5. Football(POJ3071)
  6. 关于IE8中使用Jquery load方法无法正常加载页面
  7. Python本地化例子 - gettext 模块
  8. PHP表单验证内容是否为空
  9. add-apt-repository
  10. c++第五周学习小结
  11. python-day19 Django模板,路由分发,ORM
  12. python中join()函数的使用方法
  13. 22状态模式State
  14. 自学Aruba5.1.2-带宽限制
  15. [C++]指针与引用(应用辨析)
  16. python-and和 or用法
  17. oracle数据库使用小结
  18. 12. ajax、datagrid请求传参实例
  19. MacaW Baby Learns Computer
  20. Pro Git读书笔记 - 分支

热门文章

  1. BeanCopier类
  2. Winform中使用DevExpress时给控件添加子控件的方法
  3. NOIP2009 1.多项式输出
  4. java架构之路-(12)JVM垃圾回收算法和垃圾回收器
  5. Java定时发送邮件
  6. Servlet接口的实现
  7. charles 编辑菜单总结
  8. 39 (OC) 瀑布流、不规则UI
  9. preg_relace_callback不起作用匿名函数不启作用替换字符串中的所有图片
  10. Pytorch的基础数据类型