搞明白USART_FLAG_TC 与 USART_FLAG_TXE之间的 区别

最近看到有不少人问USART_FLAG_TC 与 USART_FLAG_TXE的区别是什么,我今天就抽时间详谈此事。

先说串口收发过程:

对于CPU来说,只需要将数据填入发送数据寄存器中就可以启动串口发送了,因为数据寄存器中的数据会由硬件自动打入发送移位寄存器中;同理,接收移位寄存器中一旦接收到一字节的数据后,移位寄存器中的数据会被硬件自动打入接收数据寄存器中,CPU就可以从接收数据寄存器中取数据了。也就是如下图所示的原理:

USART_FLAG_TC是干嘛用的呢?

当发送移位寄存器中的1字节数据已经通过TX脚一位一位的移出去后,该标志位就会被置1,从而引发该事件的中断。所以,其实USART_FLAG_TC就是用来标志“发送移位寄存器中的数据有没有全部发送出去”这件事的。

USART_FLAG_TXE是干嘛用的呢?

当发送数据寄存器中的数据已经取完了,该标志位就会被置1,从而引发该事件的中断。所以,其实USART_FLAG_TXE就是用来标志一个事件的,通过它的值可以知道该事件有没有发生(即发送数据寄存器中的数据有没有被取走)。

两者分别在何种情况下被应用?

1、有不少刚入门的开发人员总是认为USART_FLAG_TC 与 USART_FLAG_TXE所代表的意义似乎没有区别,两者没有必要都存在。甚至有人认为这两个标志位都为1的时候都代表数据已经发送完成了。这肯定是错误的,那么多单片机厂家不可能犯同一个错误,而且芯片设计都是些顶尖的专家,更不可能犯这种简单的逻辑错误。

2、那么该如何看待这两个标志位的应用场景呢?其实仔细看我上面关于这两个标志位的说明就可以找到答案。显然,对于USART_FLAG_TXE来说,只是说明数据寄存器中的数据已经被发送移位寄存器取走了(但发送移位寄存器中可能还没有启动发送过程),通过中断就可以提醒CPU可以往数据寄存器中填充数据了,发送移位寄存器中的数据往外发送的过程其实还是比较耗时的,相对于C语言代码执行时间来说,这个过程的耗时完全算得上是一个宏观的数据,所以每次发送数据寄存器中的数据被发送移位寄存器取走后,都应该产生中断来提醒CPU对该寄存器更新数据;而对于USART_FLAG_TC来说,没必要每次当发送移位寄存器中的数据发送完成后都发生中断,而应该是整个串口数据帧全部发送完毕,包括最后一个字节也发送出去之后才应该开中断,这代表的就是一个数据帧发送完成事件了。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值