Thread 中讨论的其他器件:MSPM0G3507
工具/软件:
您好:
首先、我想声明我正在使用 DriverLib 尝试获得下面列出的功能。
我正在尝试编写一个驱动程序、该驱动程序将允许我的程序通过 UART 外设发送和接收数据。 当然、我需要发送和接收的数据量会有所不同。 考虑到我需要发送的数据量超过了 FIFO 的大小(4 字节)、因此轮询将不起作用、我必须使用 DMA。 要了解两个外设之间的交互如何工作、我参考了以下示例工程:
- uart_rx_multibyte_fifo_DMA_interrupts_LP_MSPM0G3507_nortos_gcc
- uart_tx_console_multibyte_repeed_fifo_dma
DMA 和 UART 的配置方式与示例工程中的配置方式不同。
让我们从 RX 开始
我的目标是创建一个读取函数、我的应用程序可以调用该函数来从 IC 读取数据。 示例工程展示了在仅执行 1 次读取时如何设置外设。 在测试代码时、这似乎可以正常工作。 但当我把它移动到一个函数中并在无限循环中调用它时,我开始得到奇怪的行为。 未正确接收数据。 例如、当我使用示例项目向程序发送以下字符 ('12345') 时、我会得到:

但是、当我将逻辑移动到函数中并发送相同的字符时、我会得到以下两个实例。 如您所见、该行为不符合预期。

下面是函数的嗅探。

我的问题是:
- 为了能够通过 UART 读取数据而不出现任何问题、我需要执行哪些正确的事件序列?
- 为什么我的数据没有按顺序显示?
- 如果我期望在 DMA 中有 5 个字节、并且我的 Rx 触发条件设置为“RX FIFO 包含>= 1 个条目“、则 DMA 和 UART 之间的事件序列是什么。
- 我知道 DMA 在收到完整的 5 个字节时将触发中断。
现在是 TX
示例工程是有意义的、因为它已经将 UART 写入功能移动到应用程序可以定期调用的函数中。 我想我可以顺利地把这个问题转嫁到我的计划中。 但我不确定的是、当我引入读取数据的功能时、此示例代码的行为方式。 我来解释一下。
在示例程序中、在配置 DMA((src、Dest、Size 等)之前启用 UART 中断、并在程序的整个生命周期内保持启用状态。 而在读取示例中、中断在配置 DMA 后启用。
TX 示例程序

Rx 示例程序

我不确定何时需要启用 UART 中断、如果在前后启用(取决于写入或读取)、我会遇到任何问题。
我的问题是:
- 当需要在同一应用中进行写入和读取时、正确的事件序列是什么?
我之所以将“写入“和“读取“逻辑混淆、可能是因为没有完全了解 DMA 在生成中断、使用触发器触发、以及此行为中的事件序列方面如何与 UART 进行交互。 我不想让这篇文章比它现在试图传达我目前对它的理解更长,但如果需要的话,我可以。 很抱歉、发布了一个长帖子。 我正在尝试充分了解 UART 外设如何与 DMA 配合使用、以防止稍后可能发生的任何问题。
提前感谢您所需的帮助、希望我能充分表达自己的想法、让您理解。
谢谢、
Adan Pantoja.