OpenEdv-开源电子网

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

USART1 卡死在while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE) == RESET);

[复制链接]

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
发表于 2015-9-13 10:41:31 | 显示全部楼层 |阅读模式
5金钱

今天在做IIC的时候无疑又发现一个问题:

USART1在做了一个SendData() 后,在while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE) == RESET);这个语句里面卡死了,然后我看了USART1的寄存器,发现在配置完USART1后TXE置位(这个我可以理解,因为一开始数据寄存器为空),但是经过了SendData()后TXE被清零(这个我也可以理解,因为DR里面有数据了),但是之后TXE再也没有置起,导致while循环卡死,这是什么情况?

PS:我是在中断里面执行USART的发送的,会不会有什么影响,个人感觉没有什么关系啊?

PPS:不知道大家有没有遇到过相同的问题?

谢谢大家啦~~

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
 楼主| 发表于 2015-9-13 21:32:57 | 显示全部楼层
今天我改了改程序,似乎是终端的时间太短了,如果我把终端的时间改为3秒(也就是3秒发送一次数据)的话,就可以正常运行。
不知道大家还有什么看法??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-9-13 22:57:41 | 显示全部楼层
你的串口用中断发送?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
 楼主| 发表于 2015-9-13 23:09:27 | 显示全部楼层
是的,因为主程序是在不断地扫描按键,而发送太快的话在串口这边会看不清...
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-9-13 23:27:24 | 显示全部楼层
回复【4楼】Boooooosh:
---------------------------------
额,从来不用中断发送.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
 楼主| 发表于 2015-9-14 19:45:52 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
哦哦,是不是因为中断里面的程序要尽量少的缘故?
那么我还想请教一下原子哥:比如说我想要很快的扫描按键,然后又要每个1秒的样子去发送一次数据,要怎么实现会比较好?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-9-14 22:57:32 | 显示全部楼层
回复【6楼】Boooooosh:
---------------------------------
定时器
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
 楼主| 发表于 2015-9-15 15:24:04 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
就是用Systick或者中断做一个定时,然后置位一个Flag标示,只要Flag表示置位就发送数据?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-9-21 00:47:49 | 显示全部楼层
回复【8楼】Boooooosh:
---------------------------------
是可以这么做
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
 楼主| 发表于 2015-9-21 16:38:12 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
知道了,谢谢!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-6-12
在线时间
0 小时
发表于 2016-6-12 10:25:29 | 显示全部楼层
没有最后的解决办法
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-6-12
在线时间
0 小时
发表于 2016-6-12 10:28:36 | 显示全部楼层
最后是怎么解决这个问题的?
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2020-11-24
在线时间
38 小时
发表于 2021-2-9 20:06:35 | 显示全部楼层
正点原子 发表于 2015-9-13 22:57
你的串口用中断发送?

原子,你好,我的串口中断程序为:
  1. void USART3_IRQHandler(void)                        //串口3中断服务程序
  2. {
  3.         u8 Res;
  4.         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //
  5.         {
  6.                 Res = USART_ReceiveData(USART3);//(USART3->DR);        //读取USART_DR寄存器得到接收到的数据
  7.                                                                                 // 读USART_DR操作也会将RXNE位清零,避免反复进入中断
  8.                 USART_SendData(USART1,Res);
  9.                 while(USART_GetFlagStatus(USART1,USART_IT_TC) != SET); // 暂时不判断是否发送完成,因为会卡在这里
  10.         }
  11. }
复制代码

我的程序一直卡在while循环这里,你的意思是串口中断函数里面不宜发送数据?那在这里放一个标志位,在主程序去发?谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 15:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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