串口通信时的问题
1、串口发送数据帧时,尽量不要被长时间的其他中断打断
串口发送:CPU将待发送数据写入串口TDR,数据被转移到移位寄存器后,即使此刻出现其它中断,发送数据也不会出错,因为已经到硬件底层了。
在多个字节数据被写入TDR进行传输时,这个过程可能被其它中断打断,如果中断执行时间较长(超过串口当前波特率传输2个字节时间),则会出现帧字节间延时较长,**接收方则可能出现所谓断帧数据收不全的情况(尤其是采用DMA+空闲中断)。**所以传输时要注意这个环节!!!最好是采用示波器抓波形看看。
串口接收:因移位寄存器将RX线采集数据写入串口接收数据寄存器RDR,因为底层硬件将数据写入RDR,所以即使接收数据过程中出现其它中断,也不会导致接收数据本身错误,而只会稍微晚点接收,但如果晚的时间较长,则出现溢出错误ORE。
同理SPI发送接收也类似,发送过程中不能被中断太久!!!
2、ORE错误
我们在MCU系统负载较重(串口收发频率高、多个中断存在(定时器中断、外部中断、DMA中断、串口接收中断等)),很容易出现串口溢出错误(ORE),这种错误的表现形式是:莫名其妙卡死在串口中断中。
接收方空闲中断:不可被高优先级中断长时间打断,否则会被认为是空闲中断;中断不可避免时,一定要缩短高优先级中断处理时间
(处理不同中断标志)。