1. DMA内存到内存传输的工程实现原理与实践
DMA(Direct Memory Access)在嵌入式系统中承担着卸载CPU数据搬运任务的关键角色。当涉及内存到内存(Memory-to-Memory,M2M)的数据复制时,其价值并非体现在性能提升的绝对优势上——毕竟C语言的memcpy()在小规模数据下已足够高效——而在于它完整呈现了DMA控制器的核心工作机制:地址生成、数据宽度对齐、传输计数、模式切换与状态反馈。理解M2M传输,是掌握DMA在串口收发、ADC采样、SPI Flash读写等真实场景中可靠运行的基础。本节将基于STM32F103系列(Cortex-M3内核)与HAL库v1.8.5,从寄存器级逻辑出发,剖析一个可验证、可调试、符合工业规范的M2M传输工程实现。
1.1 DMA控制器架构与通道资源分配
STM32F103配备两组DMA控制器:DMA1与DMA2。其中DMA1拥有7个通道(Channel 1–7),DMA2拥有5个通道(Channel 1–5)。每个通道均具备独立的配置寄存器(CCR)、传输数量寄存器(CNDTR)、外设地址寄存器(CPAR)与存储器地址寄存器(CMAR)。关键点在于:DMA1与DMA2服务于不同的总线矩阵(AHB)分支。DMA1主要连接APB2(如USART1、TIM1)、APB1(如USART2/3、TIM2/3/4)及部分SRAM;DMA2则专用于连接高速外设(如SDIO、FSMC)与Core Coupled Memory(CCM)。对于纯内存操作,DMA1的任意通道均可胜任,因其访问目标均为AHB总线上的SRAM区域,不存在外设地址映射约束。
在M2M模