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.
这是基本流程。
1) 1)设置 UART 以使用 FIFO 并在接收4个字符后中断。 还应将 UDMA 设置为执行基本传输、但尚未启用 UDMA 通道。
2) 2)在 UART 中断例程中、从 FIFO 读取前三个字符。 从第二个和第三个字符中、确定剩余字符数。 禁用 UART RX 中断、完成 UDMA 初始化设置传输大小、启用 UDMA 通道并启用 UART RX DMA 中断。
3) 3)第二次进入 UART 中断例程时、整个数据包应该已经被接收。 现在、您可以重新启用 UART RX 中断以准备接收下一条命令。 您可以使用静态枚举来跟踪 中断是用于接收命令还是用于完成数据包。
基本上、为每个接收到的数据包执行 UART RX 中断例程两次。 使用 RTS 和 CTS 控制数据流应该不会影响中断延迟。 如果中断的执行时间必须保持在绝对的最小值、您可以嵌入来自 TivaWare 函数的源代码、而不是调用它们。 通常、您可以优化应用程序的代码、从而节省呼叫/返回时间。
尊敬的 Dennis:
为了处理外设接收到的数据少于 UDMA 预期的情况、您需要使用一个计时器、该计时器将根据预期的数据量中断。 如果定时器在 DMA 事务完成之前超时、则必须假定数据包无效。 您可以通过禁用通道来中止 UDMA 传输。 然后、您将重新初始化 UDMA 传输、并且您必须有一些机制来告知源重新传输数据包。
在第一个 UART 中断例程中、您设置并启动 UDMA、然后设置并启动计时器。 如果第二个 UART 中断首先发生、(接收到正确数量的数据)您将禁用计时器。 如果定时器中断首先发生(接收到的数据不够)、则禁用 UDMA 通道、然后通知源重新启动数据包传输。
超时周期的精确度取决于传输源的可预测性。 如果您轮询 UART 或仅使用 UART 中断、您实际上会遇到相同的问题。 正是由于 DMA、您在数据包时间上超时、而不是单个字节。