DMA 是如何工作的? DMA 的工作流程是什么?

How does DMA work? What is the workflow of DMA?

我正在尝试学习 DMA 的基础知识。我在 YouTube 上观看了相同的某些视频。

我有几个问题:

  1. 我们可以使用 DMA set/reset 位寄存器吗?比如如果我想设置 GPIO_ODR 的第 4 位,我可以使用 DMA 来完成吗?

  2. DMA是采用轮询方式还是中断方式?

  3. 如果我想设置和重置 GPIO(通用输入输出)外设的寄存器位,那么 DMA 的工作流程是什么?

会不会是: CPU->DMA->外设->寄存器

然后返回

寄存器->外设->DMA->CPU

这个工作流程正确吗?

请帮我解决这个问题。另外,如果你能用简单的语言解释就更好了,因为我对这个话题完全陌生。 谢谢!

-Aditya Ubarhande

免责声明:我的回答是基于我对STM32微控制器DMA硬件的经验。

  1. 如果您使用的 DMA 可以访问硬件寄存器所在的内存区域(如 GPIO),那么是的,您可以将数据移动到这些寄存器并更改位。但请注意,这不会为您提供按位读-修改-写访问权限。 DMA 一次性写入(或读取)内存区域(可以是 8、16 或 32 位等)。在 STM32 上,定时器触发的 DMA 驱动的 GPIO 访问可用于同步并行端口实现。另一方面,DMA 通常用于事件触发的大容量内存传输,因此将其用于一次性操作硬件寄存器意义不大。

  2. 通常,您 arm DMA 并在其工作完成(或完成一半)或出现某些错误时生成中断。 DMA 有自己的控制和状态寄存器,因此您可以轮询它们而不是启用和使用中断。但大多数时候,使用中断是一个更好的主意。如果您不需要在传输完成时收到通知,这也是一个选择(可能是一个糟糕的选择)来解雇并忘记它。

  3. 一般来说,对于任何 DMA 传输,您都需要配置源地址、目标地址、数据长度和宽度以及触发条件(除非是内存到内存传输)。当然也可以有开启中断等额外的设置