AT32F415串口DMA接收问题?
求助AT32F415串口DMA接收问题:我软件是采用串口空闲中断和串口DMA接收相配合,接收串口不定长数据,串口DMA接收中断采用的是传输完成中断,具体使用时发现如下情况:内存中开辟两个接收缓存区,每个缓存区大小256个字节,当每次接收数据小于256个字节时,利用串口接收空闲中断来切换接收缓存区并配置接收缓存区的DMA接收配置,重新开启DMA接收功能,这样接收完全没有问题,如果一次接收超过256个字节时,也没有问题,数据会放在两个接收缓存区中,这证明串口接收空闲中断和串口DMA传输完成中断都配置的都没问题。但如果接收的数据长度刚好是256个字节,问题就出现了:DMA传输完成中断会正常响应,但在DMA中断响应中切换接收缓存区,重新配置DMA参数后(和串口空闲中断中切换接收缓存区,配置DMA传输方式完全相同),此后,串口再也无法接收数据了。不知道是我的软件有问题,还是芯片本身的一个bug,希望高手能解答一下。有几个关键点再强调一下:1、串口每次接收的数据小于接收缓存或者大于接收缓存256个字节时,接收完全都是正常的。
2、串口DMA中断采用的是传输完成中断,传输次数设置的是256个字节,当接收满256个字节时,DMA中断确实也能进入,DMA中设有断点,能够确定这一点。
3、DMA中断程序中,对接收缓存的切换、DMA传输参数的重新配置方法,和串口空闲中断中的处理方式完全一样。@ArteryMCU 请问有借鉴下面SC0076吗? muyichuan2012 发表于 2023-3-27 11:49
请问有借鉴下面SC0076吗?
这例子我有看过,我和上面的写法也差不多,例子上只有串口接收空闲中断,并未涉及到我说的这种当接收的数据长度刚好等于DMA传输次数,发生DMA中断的这种情况。 muyichuan2012 发表于 2023-3-27 11:49
请问有借鉴下面SC0076吗?
试了很多办法,只要接收的数据长度刚好等于DMA传输设定的次数,发生DMA中断响应,串口就再也不能接收工作了。如果接收的数据长度小于或者大于DMA传输设定的次数,那通过串口空闲中断配合DMA传输接收不定长数据就一点问题都没有。 可能“同时” 响应两个中断服务冲突了,两中断之间隔着一个字节就正常 xch 发表于 2023-3-28 10:32
可能“同时” 响应两个中断服务冲突了,两中断之间隔着一个字节就正常
相对中断处理时间,一个字节的时候还是很长的,DMA接收满中断先响应,这时串口接收空闲中断还要接收一个字符时间的高电平才会判断为空闲中断,这一个字符的时候足够处理中断响应了。主要是发生这种情况的时候,串口就再也没反应了,不能再接收了,相当于死机一样。 一般是缓冲设大一些,不用DMA中断,你这种情况是DMA中断执行后,马上又执行了 串口空闲中断,DMA又被重新配置了,可能还是你代码的问题 tzd_311 发表于 2023-3-28 10:38
相对中断处理时间,一个字节的时候还是很长的,DMA接收满中断先响应,这时串口接收空闲中断还要接收一个 ...
我说的“同时”不是时间概念,是两中断之间没有收到一个字节。
你可以试一下DMA 中断服务之后立即调用 空闲中断服务函数,这样你的串口就立刻死了。
串口用dma发送还是接收好 串口的DMA串口传输完成中断怎么理解 用串口中断接收一帧数据,还是用DMA接收一帧数据,哪个效率 串口中断和DMA中断一起使用行么 dma串口频繁发送会死机吗 怎样将数据放入一个缓冲区 dma串口发送和接收怎么配置 DMA传输数据的速度由什么决定? 问题解决没有, 有没有试过在DMA中断里,关闭串口中断使能,清空串口标志位,在打开串口相关中断,最后配置DMA 问题解决了吗?
页:
[1]