设为首页 加入收藏

TOP

USART_FLAG_TXE和USART_FLAG_TC
2019-09-30 16:44:17 】 浏览:23
Tags: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,表示移位寄存器为空。

 

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux-3.14.12内存管理笔记【建立.. 下一篇Linux-3.14.12内存管理笔记【建立..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目