打印
[技术问答]

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

[复制链接]
776|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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缓冲区的大小,以减少中断触发的频率。

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

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

使用特权

评论回复
5
丙丁先生| | 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缓冲区的大小,以减少中断触发的频率。

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

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

使用特权

评论回复
6
丙丁先生| | 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缓冲区的大小,以减少中断触发的频率。

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

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

使用特权

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

本版积分规则

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

16

主题

164

帖子

0

粉丝