STM32的DMA简介
一、DMA概述
DMA(Direct Memory Access,直接存储器存取)是一种硬件机制,它允许外设和存储器之间或者存储器和存储器之间进行高速数据传输,而无需CPU的干预。这种机制可以极大地节省CPU资源,提高系统的整体效率。在STM32微控制器中,DMA功能被广泛应用于各种数据处理场景,如数据采集、存储和传输等。
二、STM32的DMA架构
STM32F103C8T6微控制器提供了DMA1,包含7个独立的通道。这些通道可以独立配置,支持软件触发和特定的硬件触发。每个通道都可以配置为不同的传输方向、数据宽度、地址自增等参数,以满足不同的数据传输需求。

三、存储器映像
STM32的存储器映像包括多个区域,每个区域都有其特定的用途:
-
**ROM(只读存储器)**:从0x0800 0000开始,用于存储程序代码。
-
**系统存储器**:从0x1FFF F000开始,用于存储BootLoader,支持串口下载功能。
-
**选项字节**:从0x1FFF F800开始,用于存储一些独立于程序代码的配置参数。
-
**RAM(随机存取存储器)**:从0x2000 0000开始,用于存储运行过程中的临时变量。
-
**外设寄存器**:从0x4000 0000开始,用于存储各个外设的配置参数。
-
**内核外设寄存器**:从0xE000 0000开始,用于存储内核各个外设的配置参数。

四、DMA基本结构
DMA的基本结构包括以下几个关键部分:
-
**方向**:可以设置为外设到存储器或存储器到存储器。
-
**起始地址**:外设和存储器的起始地址。
-
**数据宽度**:可以设置为字节、半字或字。
-
**地址是否自增**:根据传输需求,可以设置地址是否自增。
-
**外设寄存器**:与外设相关的寄存器。
-
**Flash和SRAM**:作为数据传输的源或目标。
-
**传输计数器和自动重装器**:用于控制数据传输的数量和自动重装功能。
-
**硬件触发和软件触发**:可以根据实际需求选择硬件触发或软件触发方式。

五、DMA请求
DMA请求是启动DMA传输的信号。在STM32中,DMA请求可以由硬件事件触发,也可以由软件指令触发。硬件触发通常用于与外设的同步操作,例如ADC(模数转换器)的转换完成信号可以触发DMA传输,将转换结果自动存储到指定的存储器地址。

六、数据宽度与对齐
在DMA传输中,数据宽度是一个重要的参数。STM32支持多种数据宽度,包括字节(8位)、半字(16位)和字(32位)。数据对齐是指数据在存储器中的存储方式,必须与数据宽度相匹配,以确保数据的正确传输和存储。

七、数据传输示例
数据转运 + DMA
假设我们有两个SRAM数组`DataA`和`DataB`,每个数组包含7个元素。通过DMA传输,可以将`DataA`中的数据复制到`DataB`中。DMA配置包括设置外设地址为`DataA`的地址,存储器地址为`DataB`的地址,数据宽度为字节,传输数量为7。通过软件触发DMA传输,数据将自动从`DataA`复制到`DataB`。

ADC扫描模式 + DMA
在ADC扫描模式下,DMA可以用于将ADC的转换结果存储到SRAM中。假设ADC配置为扫描16个通道,每个通道的转换结果将存储到一个SRAM数组`ADValue`中。DMA配置包括设置外设地址为ADC的数据寄存器`ADC_DR`,存储器地址为`ADValue`的地址,数据宽度为半字,传输数量为16。通过ADC的硬件触发信号,DMA将自动将每个通道的转换结果存储到`ADValue`数组中。

八、总结
STM32的DMA功能为数据传输提供了一种高效、灵活的解决方案。通过合理配置DMA通道和参数,可以实现外设与存储器之间或存储器与存储器之间的高速数据传输,从而提高系统的性能和响应速度。在实际应用中,DMA广泛应用于数据采集、存储和传输等场景,是STM32微控制器的一个重要特性。