您好!
我正在使用 UDMA 从 UART RX 线路接收数据包(约50字节)。 我在 UART 上启用了 FIFO 模式。 了解 DMA 数据传输已开始的最有效方法是什么?
谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我正在使用 UDMA 从 UART RX 线路接收数据包(约50字节)。 我在 UART 上启用了 FIFO 模式。 了解 DMA 数据传输已开始的最有效方法是什么?
谢谢
Sina、
这是一个有趣的问题... 我将此帖子添加为评论、而不是尝试直接回复。
当我们使用 DMA 时、应用程序不再看到"正常"外设中断(我确定至少使用计时器)。 相反、仅当整个配置的 DMA 传输完成时才会标记中断。
在您的情况下、这将是50字节(或您配置的 DMA 传输的任何固定大小)... 您能否进行一个快速程序来确认、如果您将 DMA 配置为48字节、并且仅发送24字节的突发、您将不会获得任何中断? 如果您没有这样做、那么唯一的方法就是直接在 DMA 控制阵列内部轮询-您必须了解该阵列的组织方式(有相关文档)、 并读取包含当前传输字节数的字节(显然效率不高)。
我们花了很多时间来建立一个可靠的接收/传输 UART 库、然后我们确定了 DMA 的目标-只是为了确定它不是满足我们需求的最高效的解决方案。 您确实有一个16字节 FIFO 可用、并且使用常规中断在 RX 和 RT 上进行标记的效果非常好。
-当达到 FIFO 缓冲器的"特定级别"时、RX 将中断。 如果您将其配置为50%、它将在接收到8个字节后触发、在这种情况下、您"已经有8个字节需要处理、同时仍可能需要尽可能多的时间来读取接下来的8个字节所需的时间"。 这个50%级别是您的选择、具体取决于您希望为传入字节提供服务的频率以及您知道为这些字节提供服务的速度。
-当未达到上述"RX 电平"时、RT 将中断、但 UART 中的输入信号的时间更长、即"一个字节应到达连续传输"-换句话说、传输突发可能已经完成。
希望这对您来说很有意义:不要尝试在中断例程内处理传入字节。 只需快速将接收到的字节复制到缓冲区、并设置一个标志、告知程序"接收缓冲区中有新的东西"。 程序必须在"在 ISR 外部、在主程序流中"之后对它们进行处理。
布鲁诺
您好、Bruno、
请注意您的(上面)帖子中的"伟大和关心"详细信息。 做得好-显然是本论坛的"精神"。 (尤其是在"vender-lite"白天...)
我是否说我们喜欢您的详细信息? (但对于"- RT 将在未达到该电平时中断") 、而"该电平"(可理解)、则"确实"引入了不确定性因素。 (简洁-据说是"智慧的灵魂"-(不经常)被称为"理解的灵魂"- Mais oui?) Mercï……