关于DMA的笔记

DMA(Direct Memory Access, 直接储存器访问),是部分总线架构提供的功能,DMA传输功能能将数据从一个地址空间复制到另一个地址空间,实现从附加设备/外设与储存器或储存器与储存器之间的高速传输。

我们结合案例解释DMA的功能:在我们的设备中,CPU是运算和控制和核心,有强大的运算、储/转存数据、控制程序转移等功能。CPU在运行过程中需要处理大量的任务,在这些任务的优先级中,不同的任务有着不同的优先级,有的重要的任务需要调用CPU“亲自”参与,有的则不一定需要调用CPU的计算,比如数据的复制和储存(尤其是大量数据的复制存储,比如将数据从外设A转存到外设B),那我们在分配任务的时候会让CPU去执行更重要的任务,让DMA去执行原来由CPU执行的数据复制、转存,来提高系统的运行效率。

关于DMA的笔记_第1张图片

总结下来,DMA就是接管CPU过负责的数据复制储存的任务,减少CPU的低效率消耗,来提高系统的整体效率。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

DMA可以实现外设(W)到内存(N)、W2W、N2N、N2W的数据存储。而DMA传输的4个关键数据是:1、数据源地址;2、数据传输的目标地址;3、数据量大小;4、数据传输的模式。
当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。

----------------------------------------------------------------------------------------------------------

DMA的主要特征:

1、在同一个DMA模块上,可以通过软件编程设置多个请求间的优先权(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(优先级数字越小优先级越高,请求0优先于请求1,依此类推);

2、DMA使内存既可被CPU访问,也可被快速外设直接访问。闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;

3、需要在内存中开辟一个专用的缓冲区,以及时提供和接收数据。在DMA数据传送开始前和结束后,CPU以中断方式对其进行预处理和后处理;

4、支持循环的缓冲器管理;

5、可编程的数据传输数目:最大为65535;

----------------------------------------------------------------------------------------------------------

对于大容量的STM32芯片有2个DMA控制器 两个DMA控制器,DMA1有7个通道,DMA2有5个通道。

开始DMA时,以内存—串口为例。首先串口向CPU发送请求,告诉DMA,把数据从内存搬到发送数据寄存器中。这个请求由其中的一方来产生(发送方),通道为传输数据的管道。

关于DMA的笔记_第2张图片

关于数据对齐的问题:在DMA传输中,通常要求发送方和接收方的数据长度要一致(数据对齐),但有些时候我们又会使用到不一致的情况(比如8位数据发送到定时器16位CCR寄存器),此时对于DMA对齐的数据,直接操作没有问题。而当DMA数据不对齐,比如8位传到16位时,如 DMA读到的8位数据为B0,实际写入的会是00B0,高8位用0补齐。当16位转8位数据时,如DMA读到B1B0,在写入时会把高8位丢弃,只写入B0位。这跟C语言的强制类型转换一致,会对数据进行扩写和裁剪。

通过之前的对于定时器通道重映射的了解,我们知道,对于某个单一定时器的某一通道,它在同一时间只能重映射到一个外设上,不能同时调用多个外设。对于DMA也是一样的,当有多个DMA请求一起来,就需要仲裁器来仲裁,到底哪个DMA请求先执行。

关于DMA的笔记_第3张图片

 在软件编译阶段,使用者会编写设备的优先级,其中共有如上图中的4个优先级。在程序运行中,DMA仲裁器先会比较软件上的优先级,决定执行顺序。如果有多个程序处于相同的优先级,则通过编号进行执行顺序的排序,一般数字编号偏小的通道拥有更高的优先级。其中需要注意的是,在大多数产品中DMA1的优先级往往比DMA2拥有更高的优先级。

接下来展示DMA1/2的部分优先级框图。

DMA1的通道图:

关于DMA的笔记_第4张图片

 DMA1的优先级框图:

关于DMA的笔记_第5张图片

DMA2的通道图:

关于DMA的笔记_第6张图片

  DMA2的优先级框图:

关于DMA的笔记_第7张图片

----------------------------------------------------------------------------------------------------------

DMA1不支持内存到内存,但支持内存到外设,外设到内存,DMA2支持内存到内存,也支持外设到内存,内存到外设。每个通道都相当于一个IO口,每个通道都有一段代码在里面,这个代码实现是不一样的,DMA1的通道就不支持内存到内存的工作模式,而DMA2的通道代码是支持内存到内存的,同时它是接在总线矩阵上的(BUS Matrix)。

对于总线矩阵:DMA的工作是比较单一的,它每次访问总线都需要仲裁器来申请总线控制权,如果从内存到外设,首先先申请内存的总线控制权,然后在拿到数据在申请外围设备的总线控制权,这里切换就很耗时,所以推出了BUS Matrix,由DMA仲裁先获取外围的控制权,然后通过交联矩阵总线去取SRAM的数据,取到以后在发给外围,这样就不需要仲裁切换,运行较快。

你可能感兴趣的:(stm32,笔记,stm32,嵌入式硬件,单片机,c语言)