STM32F407VG使用cubemx LL库,波特率115200,一位停止位,无校验
单片机初始化串口一,PA8高速推挽输出,使用逻辑分析仪100M采样捕获各类串口中断触发时的波形
首先是喜闻乐见的RXNE,理论是只要串口成功接收一byte数据就触发
![](https://img-blog.csdnimg.cn/c39655bbb3394cf2bd9e3e6a04fc902c.png)
![](https://img-blog.csdnimg.cn/b82384b29a324937bf14e8d2471d5af1.jpeg)
可以看到,每接收一个字节之后PA8都会立刻翻转一下,中断是在多个字节发送的间隔触发的
接下来是IDLE,理论是在串口"接收到数据后的一个byte的时间里没有接收到数据"触发
![](https://img-blog.csdnimg.cn/51b777ba0d3c4f5e8e7e39abf2e9e0a6.jpeg)
![](https://img-blog.csdnimg.cn/91c32e18820c4fe38ff912032e91d8d3.png)
在接收完两个字节后,又等待了一个字节没有数据才触发,实验符合理论
还有ORE,这个可能用得不多,因为这是ERROR的一种,在RXNE和IDLE正常工作得情况下不会出现这种情况。大部分人遇到的最常见的情况是,外部串口不断给单片机发送数据的项目,单步调试单片机串口DR寄存器会卡死在进入断点时最后的一个数据。这其实就是因为触发了溢出错误,因为内核在调试断点处会卡住不去处理RXNE,导致新的数据来了上一个数据还没有处理,也就出现了Overrun error(ORE)。所以这个中断会在RXNE没有正常工作的时候触发,这里故意把RXNE里的代码注释掉,模拟出"收到新数据但没有处理旧数据的情况"
![](https://img-blog.csdnimg.cn/31979908a705431d96c9c3c268ec39c9.jpeg)
![](https://img-blog.csdnimg.cn/9a4757e7722e4ea0a4e57e0797e72a7d.jpeg)
可以看到,每接收到两个byte会触发一次ORE,因为第二个byte才符合ORE的溢出错误判断条件
正确处理ORE可以显著提升带串口的项目的调试体验,虽然正常运行时基本不会遇到,但还是有必要学习一下。
需要注意的是,在LL库里ORE和PE,NF三个错误中断的使能都合并在ERROR这一个中断使能函数里了
![](https://img-blog.csdnimg.cn/0345820b050244808b51b52ec190d994.png)
但清除标志位函数是独立的
![](https://img-blog.csdnimg.cn/c018474046a24d08b37775f96f7f5c9e.png)
ClearFlag函数同理就不放图了
既然说了ORE,那其他的错误中断也该说一说吧
很不幸,除了ORE之外的错误中断我都没能成功触发,首先是Frame Error(FE),理论是数据接收异常的时候,比如一个字节发送一半断了,或者波特率不匹配就会触发,但实际并没有。
PE和FE的触发条件应该是有重合的,PE是校验错误,如果波特率不匹配自然校验也是错误的
我把PE,FE和NF都判断上,然后使用错误的波特率发送数据,可是一个也没有触发
![](https://img-blog.csdnimg.cn/6d0bd23868ed4fc5b7ec9339ac52744c.jpeg)
![](https://img-blog.csdnimg.cn/61116a4da72146e08b99c37ef948638f.jpeg)
串口波特率115200,我是用256000发送,但PA8没有翻转,也就是说三个中断的条件没有一个触发的,很奇怪。但是因为从来也没用过三种中断也就没有探究下去,有了解的希望评论区给解释一下。