微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32f101c8t6 匪夷所思的串口难题啊啊

stm32f101c8t6 匪夷所思的串口难题啊啊

时间:10-02 整理:3721RD 点击:
我写的一个程序,只开了接收中断,没开发送中断,但是函数在调用USART3发送程序的时候进了中断,并且出了后,又进去,不停的进进出出啊,想不通啊。USART3配置代码看图:时钟开启


GPIO配置


USART配置


NVIC配置


USART3中断服务函数


详细问题是这样的,USART3连接的是条形码扫描模块,初始化时需要通过串口发送命令。调用串口发送函数的时候一直进串口中断,初始化函数:


在用USART_PutString函数的时候就会进串口3中断,USART_PutString函数:


但是我没有开发送中断啊,只开了接收中断啊,单步发现进了中断后判断if,因为没有触发接收中断,不进入if,退出中断,然后又进入中断,出中断,进中断。这是为啥啊?






自顶防沉自顶防沉自顶防沉自顶防沉自顶防沉

进中断的第一件事情不是应该先把中断标志清零么?
如果中断标志一直不清零,程序就一直进入中断。
没用过这个单片机,但是我用的单片机都是这样的。

是这样的,上面也有清中断标志(虽然放在了后面),只不过切断点单步显示没有进if所以和这个语句应该没关系,也就是没有触发接收中断,必然是其它中断源进的中断,在usart_putstring中while语句进的中断,可是我没有开其它中断,搞不清楚中断源哦,想了老长时间。

我看你中断服务函数只有一个if语句而已啊,你把清标志位放进去了?是if语句的第二个函数中么?
如果是这样?你进入中断,if语句没有执行,当然也没有清标志位。

是啊,中断服务函数里的if语句就是判断有没有发生串口接收中断,我只开了这一个中断哦,但是不知道什么原因,在调用usart_putstring时运行到while后也会进入中断,不知道是什么中断,也不知道清哪个标志位哟。按理讲,我只开了串口接收中断,为什么还有其它中断源触发串口中断呢?

我不太明白你讲的什么意思。总之,你在if语句之前清中断标志位试试看。
中断服务函数中应该放发生中断之后该干的事,不知道你为啥还要判断?
如果只有一个中断,程序思路:
**************************************
main(){  
  始化系统;
  开中断标志位;
  。
}
interrupt service(){
清中断位;
串口接收准备,接收数据;
}
********************************************

你讲的很有道理~不过中断可能由好几种中断源触发产生,如果我开了好几个中断源,进了同一个中断服务函数,我怎么知道是哪个中断源引起的呢?这时候就需要用if来判断了。虽然我这里只开了串口接收中断,加不加if无所谓,但是如果发生了串口接收中断有if也没什么影响吧?何况现在这还不是重点,重点是我只开了串口接收中断,但是有其它中断源触发了中断进入了中断函数,不进入if,说明产生的不是串口接收中断,但是我只开了这个。我也想清标志位啊,但是清哪个标志位之前是不是应该搞清楚触发的是哪个中断啊。我啰嗦了

那我只能说你得仔细排查你到底是不是只开了这一个中断

非常感谢路飞同学~

中断配置函数里清除一下USART3的中断标志

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top