主要观点总结
本文主要介绍了MCU在使用串口时可能出现的问题,特别是串口死掉的现象,以及这种现象背后的原因——串口Overrun(溢出)。文章详细解释了何为串口Overrun,以及如何产生以及如何检测这个问题。最后,文章给出了解决此问题的方法,以及在处理过程中需要注意的事项。
关键观点总结
关键观点1: MCU在使用串口时可能出现的问题及背景
串口是MCU最常用的外设之一,但使用过中可能会遇到各种问题,如串口死掉等。文章提到的串口死掉现象实际上是MCU不断进入串口中断,导致其他代码无法正常执行。
关键观点2: 串口Overrun(溢出)问题的解释
串口Overrun是串口数据接收时的一个问题,当数据不断进入移位寄存器而未被及时读取时,就会发生溢出。以STM32F030为例,其他MCU也存在类似问题。
关键观点3: 串口Overrun问题的产生和检测
通过串口调试助手发送数据过快,或者在串口中断服务函数开始处设置断点,都可能导致Overrun问题的产生。问题可以通过查看USART_ISR寄存器中的Overrun错误标志位来检测。
关键观点4: 解决串口Overrun问题的方法
解决问题的方法包括在中断服务函数中清除Overrun标志位,或者在串口初始化中关闭溢出功能。但需要注意,关闭溢出功能可能会导致数据丢失。
关键观点5: 实际应用中应注意的事项
如果MCU开启了Overrun功能,一定要在中断服务函数里加入清溢出标志的操作。否则,一旦溢出就可能导致严重的问题。另外,虽然关闭溢出功能在某些情况下可能可行,但在应用层上加上数据帧的校验仍然是保证串口数据通信正确性的好方法。
文章预览
串口是MCU最经常使用的外设之一,我遇到过多起串口在使用过程中出现死掉的实际案例。 这种问题在测试阶段如果发现了还好,一旦批量出去在现场发生就更加麻烦了。今天说的死掉,其实真实现象是MCU一直在不停的进串口中断,导致其他代码无法正常执行。 遇到该问题的罪魁祸首是串口Overrun,即溢出所致。Overrun其实很好理解,串口在接收数据的时候,每一字节数据经移位寄存器到数据寄存器,所谓溢出就是指,上一个字节的数据在数据寄存器还没有被读取走,新的1字节数据又已经被移入到移位寄存器的现象。 以STM32F030为例,其他家的MCU也类似,Overrun错误标志位位于USART_ISR寄存器中 Overrun现象我们可以这么产生:在串口中断服务函数刚开始处加一个断点,debug全速运行,通过串口调试助手一下发送2个字节的数据,这时就会出现Overrun,原因就是
………………………………