STM32的USART发送数据时如何使用TXE和TC标志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的USART发送数据时如何使用TXE和TC标志相关的知识,希望对你有一定的参考价值。

TXE由硬件来管理。当 if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET) 时表明:
数据已经从TDR 移送到移位寄存器,数据发送已经开始;TDR 寄存器被清空;下一个数据可以被写进USART_DR 寄存器而不会覆盖先前的数据,如USART_SendData(USART1, Framewaitsndbuf[ptrshowfra][ptrusart1]),如果此时USART 正在发送数据,对USART_DR 寄存器的写操作把数据存进TDR 寄存器,并在当前传输结束时把该数据复制进移位寄存器。如果此时USART 没有在发送数据,处于空闲状态,对USART_DR 寄存器的写操作直接把数据放进移位寄存器,数据传输开始,TXE 位立即被置起。通常串口中断发送用这种方式。
当一帧发送完成时(停止位发送后),TC 位被置起,并且如果USART_CR1 寄存器中的
TCIE 位被置起时,中断产生。先读一下USART_SR 寄存器,再写一下USART_DR 寄存器,可以完成对TC 位的清零。
参考技术A 可以查看芯片的参考手册USART的那一章,里面说的很清楚 参考技术B 调用库函数

串口发送带有使能引脚的注意事项

多字节串口发送时,为提高发送速度,我们一般会去检测TXE: Transmit data register empty,当该位置1时,即发送下一个字符。

  for(i=0;i<len;i++)
  {
    USART_SendData(USART1,str[i]);
      while((USART_GetFlagStatus(USART1,USART_FLAG_TXE))==RESET);
  }

但是当存在读写使能端口时,最后一个while检测完毕即关闭使能端口,这样会存在最后一个数据在移位寄存器内但并没有发送出去的情况。

TXE置位仅表示the content of the USARTx_TDR register has been transferred into the shift register,所以为确保最后一个字符可以顺利发送,代码修正为

  for(i=0;i<len;i++)
  {
    USART_SendData(USART1,str[i]);
      while((USART_GetFlagStatus(USART1,USART_FLAG_TXE))==RESET);
  }
  while((USART_GetFlagStatus(USART1,USART_FLAG_TC))==RESET){};

最后再检测一次是否发送完成。

同样对于使用DMA发送也是如此,DMA的发送完成中断仅表示DMA已将数据全部搬运完毕,但不以为着数据从串口的移位寄存器中发送完毕,所以在DMA的发送完成中断里也要加检测串口发送完成的语句。

以上是关于STM32的USART发送数据时如何使用TXE和TC标志的主要内容,如果未能解决你的问题,请参考以下文章

stm32串口——标志位学习

stm32 串口发送字符串丢失第一个字节

stm32 串口 中断的问题

串口发送有几种写法?

STM32下多串口用法

STM32F407串口传输