Skip to content

DMA

DMA (Direct Memory Access)** 的中文叫 “直接存储器访问”

核心作用: 在不需要 CPU 干预的情况下,快速地把数据从一个地方搬到另一个地方。

2. DMA 在 STM32 里具体干什么?

结合你之前问的 ADCRAM,DMA 最常用的场景就是 “ADC 数据采集”

  • 场景: 你开启了 ADC 连续扫描模式,每秒钟产生 10,000 个电压数据。
  • 不用 DMA: CPU 每隔 0.1ms 就要被中断一次去读 ADC1->DR,CPU 会被频繁打断,根本没法去处理屏幕刷新或电机 PID 控制。
  • 用 DMA:
    • 你告诉 DMA:“只要 ADC1->DR 里有数据,你就把它搬到我的数组 AD_Value[] 里去。”
    • 设置成 “循环模式” (Circular Mode)
    • 效果: 你的数组 AD_Value 里的数值会自动实时更新,永远是最新的电压值。CPU 根本不需要管 ADC,想用数据的时候直接去读数组就行了。

3. DMA 的三个关键要素

要想让这个“搬运工”干活,你必须在初始化代码里告诉它三件事(这也对应了你之前贴的代码):

  1. 从哪搬 (Source):
    • 例如:&ADC1->DR (ADC 数据寄存器的地址)。
  2. 搬到哪 (Destination):
    • 例如:AD_Value (你在 SRAM 里定义的数组地址)。
  3. 搬多少 (Buffer Size):
    • 例如:4 (因为你有 4 个通道)。

4. DMA 的“特权”

你可能会问:“凭什么 DMA 能绕过 CPU 直接访问内存?”

因为在 STM32 的内部架构(总线矩阵 Bus Matrix)中,DMA 和 CPU 是平级的

  • 它们都有权去访问 SRAM 和外设。
  • 当然,如果它俩同时要去抢同一个地址,总线仲裁器会协调(通常 CPU 会稍微等一下下,但这比 CPU 亲自搬运快得多)。

总结

  • DMA 是 CPU 的解放者。
  • 它专门负责 “无脑、重复、大量” 的数据传输工作。
  • 最经典搭配: ADC + DMA(自动采集)、串口 + DMA(自动收发数据包)、DAC + DMA(自动输出波形)。

以后只要看到 “大量数据传输”“不需要 CPU 进行运算处理” 的场景,就要立刻想到用 DMA。