STM32(5)-DMA概念详细解析

当遇到大量数据传输时,DMA是一个很重要的技术,可以提高传输效率,减轻CPU负担。


一、DMA是什么?

DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。
STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有 7 个通道。DMA2 有 5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个 DMA 请求的优先权。
STM32 的 DMA 有以下一些特性:
●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能
通过软件来配置。
●在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如
在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。
●独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和
目标地址必须按数据传输宽度对齐。
●支持循环的缓冲器管理
●每个通道都有 3 个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错),这 3 个
事件标志逻辑或成为一个单独的中断请求。
●存储器和存储器间的传输
●外设和存储器,存储器和外设的传输
●闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。
●可编程的数据传输数目:最大为 65536

二、DMA的作用

首先看这句话:DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,而无需CPU干预

1.存储器映像

我们知道,单片机的存储器包括ROM和RAM。
ROM(Read Only Memory)是只读存储器,一旦存储了数据就不能被修改。在单片机中,ROM常用于存储程序代码和常量数据。
RAM(Random Access Memory)是随机存取存储器,可以读写数据。在单片机中,RAM通常用于存储程序执行时需要的缓存数据和变量。
以STM32F103C8T6为例:
在这里插入图片描述
这里主要说一下flash、SRAM和外设寄存器。

(1)Flash存储器

是一种可编程的非易失性存储器,它的特点是存储容量大,且可以长期保存数据,即使没有电源供应。在单片机中,Flash存储器通常用于存储程序代码和常量数据。程序代码和常量数据一旦存储在Flash中,就可以长期保存,不需要再次加载。

(2)SRAM(Static Random Access Memory)

是一种静态随机存储器,它通常用于暂存数据。它的特点是读写速度快,但存储容量相对较小,且需要持续的电源供应以保持数据的存储。在单片机中,SRAM通常用于存储程序执行时需要的缓存数据和变量。比如定义的变量、数组、结构体等。

(3)单片机的外设寄存器

是用于控制和配置外设的寄存器,它们通常位于单片机内部,可以通过特定的地址和操作方式访问。
外设寄存器的数量和类型取决于单片机的型号和制造商。常见的外设寄存器包括:
GPIO寄存器:用于控制通用输入输出口的状态和配置。
定时器寄存器:用于控制和配置定时器的工作模式、计数器值和中断。
UART寄存器:用于控制和配置串口通信的参数,如波特率、数据位、停止位。
SPI寄存器:用于控制和配置SPI通信的参数,如时钟速率、数据位数等。
ADC寄存器:用于控制和配置模拟数字转换器的参数,如采样率、参考电压等。
PWM寄存器:用于控制和配置PWM输出信号的频率、占空比等参数。
外部中断寄存器:用于配置和控制外部中断的触发方式、优先级等。

2.DMA框图

在这里插入图片描述
①ICode和DCode:
ICode指的是指令存储器(Instruction Memory),用于存放CPU指令的存储器。它通常是一种只读存储器(ROM)或闪存(Flash),存储着程序的指令代码。当CPU需要执行指令时,会从ICode中读取指令进行执行。
DCODE指的是数据存储器(Data Memory),也称为数据存储器或数据存储区,是用于存储程序中所使用的变量和数据的存储器。它通常是一种随机访问存储器(RAM),可以进行读写操作。在程序运行时,CPU会将变量和数据存储在DCODE中,当需要读取或修改变量和数据时,CPU会从DCODE中进行读取和写入操作。
在这里插入图片描述
②总线:这幅图里大量涉及了关于总线的使用,这里介绍一下:总线矩阵通过连接CPU核、存储器和外设,实现了内部总线的连接和交换。
STM32的总线矩阵通常包括以下几个部分:
AHB总线矩阵:用于连接CPU核、系统总线矩阵和存储器等高速存储器,提供高带宽和低延迟的数据传输。连接着CPU、DMA、SRAM等重要的系统资源。
APB总线矩阵:用于连接外设,提供低带宽和高延迟的数据传输。其中APB1总线连接GPIO、UART、SPI等。它的主频通常是AHB总线的一半,用于低速数据传输和较低性能的操作。
APB2总线针对一些特殊外设的高速总线,如USB OTG、SDIO、CAN等。它的主频通常是AHB总线的一半或一四分之一,用于高速数据传输和高性能操作。
DMA总线矩阵:用于连接DMA控制器和内部总线,实现高速数据传输和复制。
③DMA控制器
(1)DMA1控制器
从外设(TIMx[x=1、2 、3、4] 、ADC1 、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。
外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。
在这里插入图片描述
(2)DMA2控制器
从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。参见下图的DMA2请求映像。
外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭。
在这里插入图片描述

3.DMA数据转运思路

比如我举一个例子:当我使用温湿度传感器测得温湿度值时,这个数值实际上是经过CPU的处理后被保存到SRAM的一块地址空间中去,而这时我用常规的串口配置,使得这个数据可以被串口打印到PC上去,这个过程实际是CPU再次寻找到指定的保存好的这块地址空间,读取了里面的数值,并通过总线传输数据到串口缓冲区,由串口硬件模块自动从缓冲区中读取数据并进行发送。那么,在我读取温湿度,并把数据用串口发送这个过程,用到了两次CPU的处理,CPU担任了SRAM和串口数据寄存器的中间人的角色。
但是这样无疑增加了CPU的负担,同时数据传输的速度也不快,所以才要用到DMA,使得SRAM和寄存器之间的数据交换不用CPU插手,直接了当。

二、DMA基本结构及相关参数

借用江科大的图:
在这里插入图片描述
可以看到,DMA结构中,核心部分是外设寄存器与存储器之间的数据交流,其中涉及了这些参数:方向、起始地址、数据宽度、地址是否自增、计数器、重装、M2M等,DMA可以由硬件或者软件触发,当M2M=1时是软件触发,反之为硬件触发。接下来借助DMA的结构体来分析:

typedef struct 
{
    
     
	u32 DMA_PeripheralBaseAddr; 
	u32 DMA_MemoryBaseAddr; 
	u32 DMA_DIR; 
	u32 DMA_BufferSize; 
	u32 DMA_PeripheralInc; 
	u32 DMA_MemoryInc; 
	u32 DMA_PeripheralDataSize; 
	u32 DMA_MemoryDataSize; 
	u32 DMA_Mode; 
	u32 DMA_Priority; 
	u32 DMA_M2M; 
} DMA_InitTypeDef;

DMA_PeripheralBaseAddr:该参数用以定义 DMA 外设基地址
DMA_MemoryBaseAddr:该参数用以定义 DMA 内存基地址
DMA_DIR:规定外设是作为数据传输的目的地还是来源(数据传输方向),该参数的取值范围如下表。
在这里插入图片描述
DMA_BufferSize:用以定义指定 DMA 通道的 DMA 缓存的大小,单位为数据单位。根据传输方向,数据单位等于结构中参数 DMA_PeripheralDataSize 或者参数 DMA_MemoryDataSize 的值。
DMA_PeripheralInc:用来设定外设地址寄存器递增与否
DMA_MemoryInc:用来设定内存地址寄存器递增与否
DMA_PeripheralDataSize:设定了外设数据宽度。该参数的取值范围如下表。
在这里插入图片描述
DMA_MemoryDataSize:设定了外设数据宽度。该参数的取值范围如下表。
DMA_Mode:设置了 DMA 的工作模式。该参数的取值范围如下表。
在这里插入图片描述
注意:当指定 DMA 通道数据传输配置为内存到内存时,不能使用循环缓存模式。
DMA_Priority:设定 DMA 通道 x 的软件优先级。该参数的取值范围如下表。
在这里插入图片描述
DMA_M2M:使能 DMA 通道的内存到内存传输。该参数的取值范围如下表。
在这里插入图片描述
这就是DMA的结构体变量的配置信息。

总结

DMA只是一种技术,还要把他和具体的外设结合起来,才能发挥其最大的作用,下一篇我将利用DMA和串口进行数据的收发。

猜你喜欢

转载自blog.csdn.net/qq_53092944/article/details/130666790