我的程序如下:
DMA1Channel6负责接收UART2收到的数据。这是DMA1Channel6的中断,INTFR 是这个中断的标志位:
进入中断后,读这个标志位,偶尔会发现这个标志位 = 0,进而导致接收失败。
图中的串口数据是正常的,但是在特定的位置发生了debug3.on()信号,对应程序中212行
取消中断,发现这个问题不是每次都发生:
发送相同的数据,有大约25%的概率会发生这一问题。
我的程序如下:
DMA1Channel6负责接收UART2收到的数据。这是DMA1Channel6的中断,INTFR 是这个中断的标志位:
进入中断后,读这个标志位,偶尔会发现这个标志位 = 0,进而导致接收失败。
图中的串口数据是正常的,但是在特定的位置发生了debug3.on()信号,对应程序中212行
取消中断,发现这个问题不是每次都发生:
发送相同的数据,有大约25%的概率会发生这一问题。
这一问题是偶尔发生的,多数情况可以正确接收。
降低uart波特率(目前是6M),错误率会改善,但不会解决。
主机接收时,经常发生此问题,但从机几乎不会发生此问题,交换硬件也是如此。也就是说此问题不依赖特定硬件,软件稍有差异时,此问题不会发生。
找到问题了,如果串口2中断优先级高于DMA中断,就会出现这个问题。
在串口中断中没有进行接收,只是使用了IDLE中断检测发送完成。
为什么串口中断和寄存器操作会影响DMA?
您好,若方便,可将你的代码具体发我邮箱(lzs@wch.cn)看一下,这边根据代码具体分析一下问题。此外使用中断时,以下几个点要注意一下:
1、中断函数执行时间不要过长,尤其高优先级中断,一般不建议中断函数中加打印延时等;
2、建议在初始化的时候清除一下对应的中断标志位;
3、在使用串口和DMA时,可以先使能DMA相关配置试一下,此外可以看一下是否出现串口ORE错误;
4、串口空闲中断标志位清除注意先读状态寄存器再读数据寄存器;
5、不建议DMA和串口收发同时在中断中进行;
谢谢,这个目前看应该是软件的问题,我试试按您说的,换一下接收的策略。