DMA(直接内存访问)通过不同的工作模式管理数据传输过程,以适应各种应用场景的需求。以下是其核心工作模式及特点:
1. 单次传输模式(Single Transfer Mode)
- 特点:
- 每次传输仅完成指定数据量的搬运(如1024字节),完成后自动停止。
- 需要CPU重新配置并启动下一次传输。
- 适用场景:
- 非连续或一次性数据传输(如文件单次读写、传感器单次采样)。
- 示例配置(STM32):
hdma.Init.Mode = DMA_NORMAL; // 设置为单次模式
2. 循环传输模式(Circular Mode/Continuous Mode)
- 特点:
- 传输完成后自动重置地址和计数器,循环使用同一缓冲区。
- 无需CPU干预,持续传输数据。
- 适用场景:
- 连续数据流处理(如音频播放、ADC实时采样、摄像头视频流)。
- 示例配置(STM32):
hdma.Init.Mode = DMA_CIRCULAR; // 设置为循环模式
3. 请求传输模式(Demand Transfer Mode)
- 特点:
- 由外设触发传输请求(DREQ),每次请求搬运部分数据。
- 支持分批次传输,直至完成全部数据量。
- 适用场景:
- 外设数据速率不固定时(如UART按需接收数据、外设流控)。
- 触发方式:
- 硬件触发(如外设的“数据就绪”信号)或软件触发。
4. 分散-聚集模式(Scatter-Gather Mode)
- 特点:
- 支持非连续内存块的传输,通过链表描述多个内存块地址及长度。
- DMA自动按链表顺序搬运数据,减少CPU配置开销。
- 适用场景:
- 多缓冲区管理(如网络数据包分片传输、图像多区域处理)。
- 实现方式:
- 高级DMA控制器(如PCIe DMA)通常内置此功能,需配置描述符链表。
5. 内存到内存模式(Memory-to-Memory Mode)
- 特点:
- 不涉及外设,直接在两个内存区域间复制数据。
- 传输效率高,避免CPU逐字节操作。
- 适用场景:
- 大块数据快速复制(如图像缓冲区拷贝、数据备份)。
- 示例配置(STM32):
hdma.Init.Direction = DMA_MEMORY_TO_MEMORY; // 方向设为内存到内存
6. 块传输模式(Block Transfer Mode)
- 特点:
- 以数据块为单位传输(如一次传输512字节的磁盘扇区)。
- 通常与单次或循环模式结合使用。
- 适用场景:
- 块设备操作(如SSD读写、SD卡数据传输)。
7. 双缓冲模式(Double Buffer Mode)
- 特点:
- 使用两个缓冲区交替工作:一个用于传输,另一个用于CPU处理。
- 传输完成时自动切换缓冲区,实现无延迟数据处理。
- 适用场景:
- 实时流处理(如音频播放、视频采集)。
- 实现方式:
- 在循环模式下配置两个缓冲区,利用半传输中断(Half-Transfer Interrupt)和完成中断管理切换。
模式对比与选择指南
模式 | 数据传输行为 | CPU介入频率 | 典型应用 |
---|---|---|---|
单次传输 | 传输后停止,需手动重启 | 高 | 非连续任务(单次文件读写) |
循环传输 | 自动循环缓冲区,持续传输 | 低 | 实时数据流(音频/视频) |
请求传输 | 按外设请求分批次传输 | 中 | 外设流控(UART/SPI) |
分散-聚集 | 处理非连续内存块 | 低 | 网络数据包、多缓冲区处理 |
内存到内存 | 内存间快速复制 | 低 | 大数据块拷贝 |
双缓冲 | 缓冲区交替传输与处理 | 低 | 无延迟实时处理(音频播放) |
配置要点
- 模式选择:根据数据连续性、实时性需求选择单次或循环模式。
- 触发源:配置硬件触发(外设请求)或软件触发(手动启动)。
- 中断管理:使能传输完成中断或半传输中断,实现缓冲区切换或状态同步。
- 缓存一致性:在带Cache的系统中,确保DMA操作的内存区域已刷新或禁用缓存。
总结
DMA的工作模式决定了数据传输的自动化程度和效率,合理选择模式可大幅优化系统性能。在嵌入式系统中,循环模式与双缓冲结合常用于实时应用,而分散-聚集模式则提升了复杂数据处理的灵活性。开发者需结合硬件特性(如DMA控制器功能)及实际需求,选择最佳模式以实现高效、稳定的数据传输。