STM32中关于串口中断的调试(不断进入发送中断的原因)

说来惭愧,前日在调试stm32f10系列的单片机的时候,想做一个关于串口发送的状态机,每隔100毫秒发送一次命令。没有用DMA,就是想单纯的使用发送中断来数据,结果在调试的时候一直死在了串口中断那里,然后查看sr寄存器,发现是TC位只要打开发送中断就会被置位,看到这里我嘴角微微上扬,轻蔑一笑,(ˉ▽ ̄~) 切~~清掉标志位就好啦。

事实证明,我是愚蠢的,我在中断那里TC位清零后,再次仿真,呃,怎么还不出去?_?

好吧,我在使能发送中断之前清一下好吧。~~(╯﹏╰)b,还不走……

三板斧耍完了,(~ ̄▽ ̄)~ ,度娘,你在哪?

百度关键字“STM32发送中断”,哈,一堆的人有和我一样的问题。问题总该迎刃而解了吧。

度娘出来的答案好多,总结一下有这么几个原因。

1、发送中断打开就会一直进入中断啊,要用的时候再打开就好了。

我的想法:好像很有道理的样子,但是,(╯‵□′)╯︵┻━┻这不是我要的答案啊。

2、打开发送中断前将标志位清零啊,不然会一直进入的,在中断里面也要将标志位清零。

我的想法:(╯‵□′)╯︵┻━┻我不就是这么做的吗,不行啊。

3、用DMA啊,为什么一定要用发送中断,DMA只要进两次中断就好了,占用的cpu时间更少。

我的想法:(╯‵□′)╯︵┻━┻,老子就是要用发送中断

4、用轮询啊,为什么一定要……巴拉巴拉

我的想法:(  ̄ ▽ ̄)o╭╯☆#╰ _─﹏─)╯


第一个原因的论调比较多人支持,我个人猜测是第二原因,然后到处去把标志位清除,在开启中断前清除,不信;在开启中断后清除,不行;在中断里面清除,不行;

……深受打击,这明明很简单的问题,为什么就是解决不了呢?

痛腚思痛,我去找大神,datasheet

看完后,我真想说一句,ヾ(。`Д´。)shit。

老子打开了发送寄存器空检测中断,不是打开发送完成检测中断,寄存器一直就是空的,当然就会一直进入中断啊。

STM32中关于串口中断的调试(不断进入发送中断的原因)_第1张图片

对比英文版的,我发现讲的其实不够透彻,起码“空”这个字眼我就没看到。

STM32中关于串口中断的调试(不断进入发送中断的原因)_第2张图片

我打开串口调试窗口看一下,╮(╯▽╰)╭,就是这货“TXEIE”被使能了,导致程序一直进入中断, 我需要的是发送完成中断,不是发送缓冲区中断。MCU是没错的,错的是我。

STM32中关于串口中断的调试(不断进入发送中断的原因)_第3张图片

人家说的很明白,寄存器空了就进去中断,而这个碗一直就是空的,怎么会不进呢。

以后第一时间还是看看手册,百度不一定找得到,找到的不一定对,对的不一定看得懂,看得懂的不一定是我要的。


写于2016年10月8日夜

你可能感兴趣的:(STM32)