STM32 DMA

张开发
2026/4/16 13:21:18 15 分钟阅读

分享文章

STM32 DMA
STM32的DMADirect Memory Access直接存储器访问是一种硬件模块用于在外设与存储器之间或存储器与存储器之间直接传输数据无需CPU干预从而显著提升系统效率和实时性。一、DMA 核心概念与工作原理DMA的核心思想是将数据搬运任务从CPU中剥离。传统方式下CPU需要亲自读取外设数据再写入内存这会占用大量计算资源。而DMA控制器作为独立的硬件模块在配置好后能在外设产生请求时直接通过系统总线完成数据的读取和写入整个过程CPU可以处理其他任务。一次完整的DMA传输包含三个基本操作1从源地址外设寄存器或存储器取数据2将数据存放到目标地址存储器或外设寄存器3递减传输数量计数器。只要传输计数器不为零且DMA通道已使能传输就会持续进行。二、STM32 DMA 的主要特性多通道与控制器STM32如F1系列通常有1到2个DMA控制器DMA1和DMA2。DMA1有7个通道DMA2有5个通道每个通道可连接到特定外设如ADC、USART、SPI等。传输方向支持外设到存储器、存储器到外设以及存储器到存储器部分模式限制三种方向。可编程数据宽度传输的数据单元可以是字节8位、半字16位或字32位源和目标的数据宽度可以独立设置。地址递增模式可以设置外设地址和存储器地址在每次传输后是否自动递增。通常外设如数据寄存器地址固定而存储器如数组地址需要递增以存放连续数据。传输模式单次模式 (Normal)传输指定数量的数据后停止需要重新配置才能再次启动。循环模式 (Circular)传输完成后自动重装计数器从初始地址开始新一轮传输适用于ADC连续采样等场景。优先级管理每个通道的优先级可通过软件设置非常高、高、中、低。当多个通道同时请求时先比较软件优先级若相同则通道编号小的拥有更高的硬件优先级。中断与事件每个通道可以产生三种事件标志半传输完成、传输完成和传输错误。这些标志可以触发中断方便CPU在传输关键节点进行处理。三、DMA 配置关键结构体成员以标准库为例配置DMA时需要初始化一个结构体DMA_InitTypeDef其核心成员与功能如下结构体成员功能描述对应寄存器/常见设置DMA_PeripheralBaseAddr外设数据寄存器地址。例如串口传输设为USART1-DRADC传输设为ADC1-DR。DMA_CPARxDMA_Memory0BaseAddr存储器基地址通常是自定义数组的首地址。DMA_CMARxDMA_DIR传输方向外设到存储器、存储器到外设等。DMA_CCRx 的 DIR 位DMA_BufferSize要传输的数据数量。DMA_CNDTRxDMA_PeripheralInc外设地址是否递增。通常设为Disable外设寄存器固定。DMA_CCRx 的 PINC 位DMA_MemoryInc存储器地址是否递增。通常设为Enable用于存储数据数组。DMA_CCRx 的 MINC 位DMA_PeripheralDataSize外设数据宽度字节、半字或字。DMA_CCRx 的 PSIZE 位DMA_MemoryDataSize存储器数据宽度字节、半字或字。DMA_CCRx 的 MSIZE 位DMA_Mode传输模式单次模式 (Normal) 或循环模式 (Circular)。DMA_CCRx 的 CIRC 位DMA_Priority通道优先级低、中、高、非常高。DMA_CCRx 的 PL 位DMA_M2M是否使能存储器到存储器模式。DMA_CCRx 的 MEM2MEM 位四、DMA 配置与使用的一般步骤使能时钟首先开启DMA控制器的时钟通常在AHB总线上。初始化DMA通道使用上述结构体参数配置DMA通道包括地址、方向、数据量等。使能外设的DMA功能在对应外设如ADC、USART的配置中开启其DMA请求输出。配置中断可选如果需要使能DMA传输完成等中断并配置NVIC。使能DMA通道最后启动DMA通道使其等待外设请求或软件触发。触发传输对于外设触发模式如ADC启动外设即可对于存储器到存储器模式使能通道即开始传输。查询状态或处理中断通过查询标志位或在中段服务函数中判断传输是否完成并进行后续处理。五、典型应用示例ADC 使用 DMA 搬运数据这是一个非常常见的应用用于高效地连续采集模拟信号。关键步骤如下初始化ADC配置ADC为定时器触发等连续转换模式并关键一步调用ADC_DMACmd(ADC1, ENABLE);使能ADC的DMA输出。初始化DMA以ADC1对应DMA1通道1为例进行配置。源地址 (PeripheralBaseAddr)(u32)(ADC1-DR)(ADC数据寄存器地址)。目标地址 (MemoryBaseAddr)自定义数组如u16 adcValue[128]的首地址。方向外设到存储器 (DMA_DIR_PeripheralSRC)。存储器地址递增使能。数据宽度半字16位匹配ADC的12位结果。模式循环模式 (Circular)实现连续采集。使能传输完成中断以便在数组填满时进行处理。启动启动ADC转换随后ADC每完成一次转换就会触发DMA请求DMA自动将数据搬运到指定数组中。CPU只需在DMA传输完成中断中处理这批数据即可期间完全自由。六、DMA 与 CPU 的关系在STM32的Cortex-M架构中DMA和CPU通过总线矩阵共享系统总线。当DMA和CPU同时访问同一目标如SRAM时总线仲裁器会协调访问通常采用轮转调度以保证双方都能获得带宽因此DMA的使用不会完全阻塞CPU但可能会在总线争用时轻微影响CPU的访问速度。这与一些其他架构如x86不同在STM32上合理使用DMA能显著降低CPU负载提高系统整体性能。总之STM32的DMA是提升数据吞吐量和系统实时性的强大工具熟练掌握其原理和配置方法对于开发高性能嵌入式应用至关重要。

更多文章