CH32V203 DMA进入中断,但是读中断标志位为全0。1/4概率出现


我的程序如下:image.png

image.png

DMA1Channel6负责接收UART2收到的数据。这是DMA1Channel6的中断,INTFR 是这个中断的标志位:

image.png

进入中断后,读这个标志位,偶尔会发现这个标志位 = 0,进而导致接收失败。

image.png

图中的串口数据是正常的,但是在特定的位置发生了debug3.on()信号,对应程序中212行image.png

取消中断,发现这个问题不是每次都发生:image.png

发送相同的数据,有大约25%的概率会发生这一问题。

这一问题是偶尔发生的,多数情况可以正确接收。


降低uart波特率(目前是6M),错误率会改善,但不会解决。


主机接收时,经常发生此问题,但从机几乎不会发生此问题,交换硬件也是如此。也就是说此问题不依赖特定硬件,软件稍有差异时,此问题不会发生。


找到问题了,如果串口2中断优先级高于DMA中断,就会出现这个问题。

在串口中断中没有进行接收,只是使用了IDLE中断检测发送完成。



为什么串口中断和寄存器操作会影响DMA?


您好,若方便,可将你的代码具体发我邮箱(lzs@wch.cn)看一下,这边根据代码具体分析一下问题。此外使用中断时,以下几个点要注意一下:

1、中断函数执行时间不要过长,尤其高优先级中断,一般不建议中断函数中加打印延时等;

2、建议在初始化的时候清除一下对应的中断标志位;

3、在使用串口和DMA时,可以先使能DMA相关配置试一下,此外可以看一下是否出现串口ORE错误;

4、串口空闲中断标志位清除注意先读状态寄存器再读数据寄存器;

5、不建议DMA和串口收发同时在中断中进行;



谢谢,这个目前看应该是软件的问题,我试试按您说的,换一下接收的策略。


只有登录才能回复,可以选择微信账号登录