[技术问答]

HC32F4A0基于DMA的串口高速循环接收数据丢包问题

[复制链接]
2004|9
手机看帖
扫描二维码
随时随地手机跟帖
eyesmall|  楼主 | 2025-4-3 11:12 | 显示全部楼层 |阅读模式
使用循环数组接收外部数据,串口波特率614400,单帧数据33个字节,数据频率200HZ。DMA配置为repeat模式,接收完成中断内执行重置DTCNT和使能通道操作,重置过程中频繁出现丢数据现象,统计中断内执行时间为800ns,离1个字节的传输时间还差很多,不清楚数据丢在哪个环节。
使用官方例程链表形式数据接收完整不会丢数,但链表的配置代码看的不是很明白,不过通过数据手册发现链表重置只能使用单一通道,单个DMA多通道无法同时使用。

使用特权

评论回复
caigang13| | 2025-4-5 11:20 | 显示全部楼层
DMA的读取时序逻辑很重要

使用特权

评论回复
chenjun89| | 2025-4-5 16:33 | 显示全部楼层
多半还是数据处理逻辑和时序没有配合好

使用特权

评论回复
丙丁先生| | 2025-4-6 05:20 | 显示全部楼层
根据你的描述和搜索结果,以下是可能的原因及解决建议:


1.DMA重置问题
在DMA接收完成中断中,重置`DTCNT`(DMA传输计数器)和使能通道操作可能导致数据丢失。虽然中断执行时间只有800ns,但这个操作可能会导致DMA在重置过程中错过新的数据接收。


解决方法:

• 使用双缓冲机制(乒乓缓存):可以使用两个缓冲区(`buf1`和`buf2`),DMA在`buf1`接收数据时,CPU处理`buf2`中的数据,反之亦然。这样可以避免在重置DMA时丢失数据。

• 优化中断处理:尽量减少中断处理函数中的操作,确保中断处理时间尽可能短。


2.链表模式的优势
链表模式可以避免在接收过程中频繁重置DMA,从而减少数据丢失的风险。链表模式允许DMA在接收完一个缓冲区后自动跳转到下一个缓冲区,而不需要CPU干预。


解决方法:

• 使用链表模式:如果硬件支持,建议使用链表模式。虽然链表模式的配置可能比较复杂,但它可以有效减少数据丢失。

• 参考官方例程:仔细研究官方提供的链表模式例程,理解其配置方法。虽然链表模式只能使用单一通道,但在高波特率下,单通道的性能已经足够。


3.硬件和时钟问题

• 时钟稳定性:确保系统时钟和串口时钟配置正确,时钟抖动可能导致数据丢失。

• 硬件连接:检查串口和DMA相关的硬件连接是否牢固,确保没有接触不良的问题。


4.调试和测试

• 使用示波器:检查串口信号的完整性,确保信号没有被干扰或损坏。

• 降低波特率:暂时降低波特率(如115200bps),观察是否仍然出现数据丢失,以排除波特率过高的影响。


5.其他建议

• 增加缓冲区大小:如果可能,增加DMA缓冲区的大小,以减少中断触发的频率。

• 检查电源稳定性:确保开发板的电源稳定,电源波动可能导致系统不稳定。

通过上述方法,可以有效减少或避免数据丢失的问题。如果问题仍然存在,建议进一步检查硬件和软件配置,或者联系硬件制造商的技术支持。

使用特权

评论回复
丙丁先生| | 2025-4-6 05:20 | 显示全部楼层
根据你的描述和搜索结果,以下是可能的原因及解决建议:


1.DMA重置问题
在DMA接收完成中断中,重置`DTCNT`(DMA传输计数器)和使能通道操作可能导致数据丢失。虽然中断执行时间只有800ns,但这个操作可能会导致DMA在重置过程中错过新的数据接收。


解决方法:

• 使用双缓冲机制(乒乓缓存):可以使用两个缓冲区(`buf1`和`buf2`),DMA在`buf1`接收数据时,CPU处理`buf2`中的数据,反之亦然。这样可以避免在重置DMA时丢失数据。

• 优化中断处理:尽量减少中断处理函数中的操作,确保中断处理时间尽可能短。


2.链表模式的优势
链表模式可以避免在接收过程中频繁重置DMA,从而减少数据丢失的风险。链表模式允许DMA在接收完一个缓冲区后自动跳转到下一个缓冲区,而不需要CPU干预。


解决方法:

• 使用链表模式:如果硬件支持,建议使用链表模式。虽然链表模式的配置可能比较复杂,但它可以有效减少数据丢失。

• 参考官方例程:仔细研究官方提供的链表模式例程,理解其配置方法。虽然链表模式只能使用单一通道,但在高波特率下,单通道的性能已经足够。


3.硬件和时钟问题

• 时钟稳定性:确保系统时钟和串口时钟配置正确,时钟抖动可能导致数据丢失。

• 硬件连接:检查串口和DMA相关的硬件连接是否牢固,确保没有接触不良的问题。


4.调试和测试

• 使用示波器:检查串口信号的完整性,确保信号没有被干扰或损坏。

• 降低波特率:暂时降低波特率(如115200bps),观察是否仍然出现数据丢失,以排除波特率过高的影响。


5.其他建议

• 增加缓冲区大小:如果可能,增加DMA缓冲区的大小,以减少中断触发的频率。

• 检查电源稳定性:确保开发板的电源稳定,电源波动可能导致系统不稳定。

通过上述方法,可以有效减少或避免数据丢失的问题。如果问题仍然存在,建议进一步检查硬件和软件配置,或者联系硬件制造商的技术支持。

使用特权

评论回复
丙丁先生| | 2025-4-6 05:20 | 显示全部楼层
根据你的描述和搜索结果,以下是可能的原因及解决建议:


1.DMA重置问题
在DMA接收完成中断中,重置`DTCNT`(DMA传输计数器)和使能通道操作可能导致数据丢失。虽然中断执行时间只有800ns,但这个操作可能会导致DMA在重置过程中错过新的数据接收。


解决方法:

• 使用双缓冲机制(乒乓缓存):可以使用两个缓冲区(`buf1`和`buf2`),DMA在`buf1`接收数据时,CPU处理`buf2`中的数据,反之亦然。这样可以避免在重置DMA时丢失数据。

• 优化中断处理:尽量减少中断处理函数中的操作,确保中断处理时间尽可能短。


2.链表模式的优势
链表模式可以避免在接收过程中频繁重置DMA,从而减少数据丢失的风险。链表模式允许DMA在接收完一个缓冲区后自动跳转到下一个缓冲区,而不需要CPU干预。


解决方法:

• 使用链表模式:如果硬件支持,建议使用链表模式。虽然链表模式的配置可能比较复杂,但它可以有效减少数据丢失。

• 参考官方例程:仔细研究官方提供的链表模式例程,理解其配置方法。虽然链表模式只能使用单一通道,但在高波特率下,单通道的性能已经足够。


3.硬件和时钟问题

• 时钟稳定性:确保系统时钟和串口时钟配置正确,时钟抖动可能导致数据丢失。

• 硬件连接:检查串口和DMA相关的硬件连接是否牢固,确保没有接触不良的问题。


4.调试和测试

• 使用示波器:检查串口信号的完整性,确保信号没有被干扰或损坏。

• 降低波特率:暂时降低波特率(如115200bps),观察是否仍然出现数据丢失,以排除波特率过高的影响。


5.其他建议

• 增加缓冲区大小:如果可能,增加DMA缓冲区的大小,以减少中断触发的频率。

• 检查电源稳定性:确保开发板的电源稳定,电源波动可能导致系统不稳定。

通过上述方法,可以有效减少或避免数据丢失的问题。如果问题仍然存在,建议进一步检查硬件和软件配置,或者联系硬件制造商的技术支持。

使用特权

评论回复
eyesmall|  楼主 | 2025-4-15 16:44 | 显示全部楼层
丙丁先生 发表于 2025-4-6 05:20
根据你的描述和搜索结果,以下是可能的原因及解决建议:

多谢大佬回复
程序本身就使用了多缓冲机制,并不能解决这个问题,因为数据在重置后就已经不对了,因为哪怕我数据不做处理也会丢

链表确实复杂,但使用链表重置方式却还是比较简单的,虽然一个DMA只能有一个链表重置,但也只能忍了,目前也没有好办法不是吗,起码解决了两个串口接收的问题

降低波特率没有实质性效果,但是理论上速率低触发概率也低

制造商无法给与足够支持

使用特权

评论回复
huquanz711| | 2025-4-16 08:12 | 显示全部楼层
可能是CPU处理不过来,丢数据了。

使用特权

评论回复
绝影孤狼| | 2025-4-20 19:49 | 显示全部楼层
看起来像是DMA配置的问题。你可以尝试调整DMA的优先级,或者检查一下DMA的源地址和目标地址是否正确配置。

使用特权

评论回复
Amazingxixixi| | 2025-4-24 15:22 | 显示全部楼层
学习一下啊!感觉有点知识慌了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:新手一个,干嘛嘛不行

17

主题

167

帖子

0

粉丝