STM32/STM8技术william hill官网
直播中

张丽娟

7年用户 206经验值
私信 关注
[问答]

STM32F030串口中断函数只能进入一次

void USART1_IRQHandler(void)
{
uint16_t Value;

if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
{
  Value = USART_ReceiveData(USART1);
  USART_SendData(USART1, Value);
  while(!USART_GetiTStatus(USART1, USART_IT_TC));
}
}
为什么这个串口中断函数只能进入一次呢?

回帖(17)

黄玫玫

2018-12-4 09:00:18
连上Jlink调试一下,标志位的问题?
举报

谭子薇

2018-12-4 09:07:41
你可以调试一下,程序是不是一直在while判断那里没有出来。
举报

张丽娟

2018-12-4 09:20:38
回复第 2 楼 于2014-02-18 08:54:21发表:
你可以调试一下,程序是不是一直在while判断那里没有出来。
 
 
好的,我回去试一下,谢谢
 
举报

张东群

2018-12-4 09:27:38
先赚分!
举报

王雷

2018-12-4 09:47:05
 
因为你在程序中,使用了
while(!USART_GetITStatus(USART1, USART_IT_TC));
如果你将这个TC标志,换成USART_FLAG_TXE,也就是
while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));   
那样就正常了。
 
USART_IT_TC和USART_FLAG_TXE是STM32中很容易出问题的标志,参考手册上讲的很明白
举报

张舒婷

2018-12-4 10:06:40
可能是while那句出错了
举报

王帅

2018-12-4 10:13:09
  while(!USART_GetITStatus(USART1, USART_IT_TC));
这里错了,,你回去试试好了吗?
举报

杨逊咏

2018-12-4 10:30:23
回复第 6 楼 于2014-02-19 21:16:45发表:
 
因为你在程序中,使用了
while(!USART_GetITStatus(USART1, USART_IT_TC));
如果你将这个TC标志,换成USART_FLAG_TXE,也就是
while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));   
那样就正常了。
 
USART_IT_TC和USART_FLAG_TXE是STM32中很容易出问题的标志,参考手册上讲的很明白
 

在这个while之前不是已经发送过数据了,等待TXE标志清除?
举报

李晓莉

2018-12-4 10:48:41
连上仿真器看看程序死在哪了,估计是在while循环里面
举报

阿瑟

2018-12-4 10:51:43
受教了受教了受教了
举报

阿瑟

2018-12-4 10:52:37
可能是while那句出错了
举报

崔琳

2018-12-4 11:00:13
1、使用仿真器是不能在中断的位置打断点的,如果想知道中断有没有进入,只能在中断中用全局变量计数,用仿真器将全局变量读出来。在中断处打断点会出现意想不到的问题
举报

李桂兰

2018-12-4 11:08:33
我来回答一下,USART_IT_TC发送完成中断标志位;USART_FLAG_TXE发送数据寄存器空标志位;显然你在中断里检测中断完成标志位肯定会进入死循环;
举报

杨叶

2018-12-4 11:20:52
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

宣苗

2018-12-4 11:29:53
需要在中断函数里面添加,USART_ClearITPendingBit(USART2,USART_IT_ORE);
举报

张桂芝

2018-12-4 11:46:56
可能是while那句出错了
举报

blust

2018-12-4 19:59:40
中断函数里面最好不要加可能出现锁死的循环语句。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分