OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2362|回复: 3

关于原子usart实验的TXE和TC标志位替换的问题

[复制链接]

8

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-6-10
在线时间
22 小时
发表于 2018-6-10 01:03:08 | 显示全部楼层 |阅读模式
原子官方提供的SYSTEM文件夹里的usart实验,main函数里面,有这么一段程序:
******************************************************
  while(1)
{
  if(USART_RX_STA&0x8000)
  {        
   len=USART_RX_STA&0x3fff;
   printf("\r\n您发送的消息为:\r\n");
   for(t=0;t<len;t++)
   {
    USART_SendData(USART1, USART_RX_BUF[t]);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
   }
   printf("\r\n\r\n");
   USART_RX_STA=0;
  }
***************************************************
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);这句函数的主要目的是等待TC置1后(数据从移位寄存器发送出去后)再发送下一节数据

但是用while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET);替换上面那一句,即,将标志位TC替换成TXE,数据发送就出现了问题,出现了乱码。


请问大神们~~TXE=1,表示USART->DR(TDR)的值转移到移位寄存器了,准备发送,但是不一定已经发送出去了,不过此时由于TDR寄存器的数据已经搬走,说明你可以写新的数据岛USART->DR里面了,但是为什么会出现乱码??是不是用TC标志位来判断数据发送成功没有是最为稳妥的?假如为了提高发送效率,用TXE作为判断标志位,该怎么改???

微信图片_20180610005446.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-7-13 16:34:03 | 显示全部楼层
关注,我也正需要解答这个问题。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-14 12:59:40 | 显示全部楼层
不是大神,但探讨一下。
看文档有一句,TXE推荐是在单缓冲传输才使用,
只有一个缓存器,数据是发走一个再送一个进缓存,再进DR。
而这里有一串的数据源源不断地发送,相当于多缓冲传输了。
我想:这种情况下用TXE是不是速度太快了,
你可以在while语句之后,加一个小延时验证一下。

话说,在这种环境下,本人不觉得用TXE会效率高多少,
串口主要耗时的是移位寄存器的移位送出时间,
而数据由DR写进移位寄存器的时间可能只需要一个机器周期,
即使你这样改动后可以很完美地用,也就省了这一个机器周期吧?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-7-14 13:35:28 | 显示全部楼层
我在我的精英板上测试,使用TXE,没有发现问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 15:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表