DMA
DMA (Direct Memory Access)** 的中文叫 “直接存储器访问”。
核心作用: 在不需要 CPU 干预的情况下,快速地把数据从一个地方搬到另一个地方。
2. DMA 在 STM32 里具体干什么?
结合你之前问的 ADC 和 RAM,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,想用数据的时候直接去读数组就行了。
- 你告诉 DMA:“只要
3. DMA 的三个关键要素
要想让这个“搬运工”干活,你必须在初始化代码里告诉它三件事(这也对应了你之前贴的代码):
- 从哪搬 (Source):
- 例如:
&ADC1->DR(ADC 数据寄存器的地址)。
- 例如:
- 搬到哪 (Destination):
- 例如:
AD_Value(你在 SRAM 里定义的数组地址)。
- 例如:
- 搬多少 (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。