二十、DMA原理介绍
1.数据的传输方式
一般情况下实现存储器和外设之间的数据传输,有三种常用的方法:
轮询法(polling)
:在主循环中,CPU不断检查外设的相关标志位,来判断其是否需要进行数据的传输,如果需要,则CPU将数据在外设和内存之间搬运,实现数据传输。当数据传输服务请求频繁或者传输的数据量很大时,会影响其他任务的实时性。
中断法(interrupt)
:当外设需要传输数据时,会触发中断,CPU会暂停正在处理的任务,转而去执行中断服务函数,接着处理外设的数据传输任务。CPU无需反复检查外设的标志位,中断机制会指示CPU何时去处理外设数据,但是依然需要CPU去完成数据搬运和传输过程。当外设数据传输服务不频繁且数据量不大时,中断法也是不错的选择。当中断连续不断且频繁发生时,中断法变得不再高效,因为在恢复主流程的执行和中断相应的上下文切换会占用大量的CPU时间。
DMA
:DMA控制器是单片机中的硬件单元,它在存储器和外设之间有专用的通道,允许外设和存储器之间高效传输数据,且传输过程无需CPU参与。 综上可见DMA是一种高效的数据传输方式。
2. 什么是DMA
直接存储器访问(DMA)是一种高效的数据传输方式,它允许外设或内存直接与存储器进行数据交换,而无需CPU的介入。这样可以显著提高数据处理的效率,减轻CPU的负担。
3. STM32的DMA介绍
STM32F103C8T6有两个DMA控制器(DMA1,DMA2),DMA(DMA1上有7个通道, DMA2上有5个通道)可以管理存储器到存储器、设备到存储器和存储器到设备的数据传输; 2个DMA控制器支持环形缓冲区的管理,避免了控制器传输到达缓冲区结尾时所产生的中断。
每个通道都有专门的硬件DMA请求逻辑,同时可以由软件触发每个通道;传输的长度、传输的源地址和目标地址都可以通过软件单独设置。
关于DMA的主要特性在中文参考手册的第142页,如图所示(部分截图):
4. DMA的主要特性
- 独立的可配置通道
DMA通常包含多个独立的通道,每个通道可以被配置为执行特定的数据传输任务。在你提到的情况中,DMA1有7个通道,而DMA2有5个通道,共计12个独立的通道。这些通道可以根据需要独立配置和使用。
- 硬件和软件触发
每个DMA通道都可以通过专用的硬件请求或软件触发来启动数据传输。这提供了灵活性,允许根据外设的信号或程序的需求来启动传输。
- 优先级设置
DMA支持通过软件编程设置通道之间的优先级,共有四个等级:很高、高、中等和低。当多个通道同时请求DMA服务时,优先级高的通道会先被服务。如果优先级相同,则根据通道编号的先后顺序(较小的编号具有较高的优先级)来决定服务顺序。
- 数据传输宽度和地址对齐
DMA支持不同的数据传输宽度,包括字节、半字和全字。这意味着可以根据需要选择最适合的数据大小进行传输。同时,源和目标地址必须根据数据传输宽度进行对齐,以确保数据的正确传输。
- 循环缓冲器管理
DMA支持循环缓冲器管理,这对于需要连续传输数据的应用(如音频或视频流)非常有用。在循环模式下,DMA可以在到达缓冲区末尾时自动返回到开始位置,无需CPU干预。
- 事件标志和中断
每个DMA通道都有三个事件标志:半传输、传输完成和传输出错。这些事件可以触发中断,允许软件响应DMA传输的不同阶段或错误情况。
- 存储器到存储器的传输
DMA支持存储器到存储器的传输,这意味着可以直接在两个存储器地址之间传输数据,无需外设介入。
- 外设和存储器之间的传输
DMA支持从外设到存储器以及从存储器到外设的数据传输。这对于处理外设数据(如ADC转换结果或UART接收的数据)非常有用。
- 支持的存储器和外设
DMA可以访问多种类型的存储器和外设,包括闪存、SRAM、外设的SRAM以及通过APB1、APB2和AHB总线连接的外设。
- 可编程的数据传输数目
DMA传输的数据量可以通过软件编程设置,最大支持65535个单位的数据传输。
相关截图:
5. DMA外设请求映射
DMA1和DMA2的外设请求映射分别如下图所示:
6. 仲裁
每个DMA控制器有两个分别对应于外设和存储器的仲裁器。当DMA控制器在同一时间接收到多个外设请求时,仲裁器将根据外设请求的优先级来决定响应哪一个外设请求。
优先权管理分2个阶段:
软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
最高优先级
高优先级
中等优先级
低优先级
硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。
举个例子,通道2优先于通道4。
7. 地址生成算法
STM32F103C8T6的DMA(直接存储器访问)控制器允许在外设和内存之间进行高效的数据传输,而无需CPU的介入。DMA传输过程中的地址生成是根据预设的配置自动进行的,这包括源地址、目标地址以及它们的增量设置。
7.1 源地址和目标地址
源地址(Source Address):这是数据传输开始的地址。根据传输的类型,它可以是内存地址或外设寄存器的地址。
目标地址(Destination Address):这是数据传输结束的地址,同样可以是内存地址或外设寄存器的地址。
7.2 地址增量设置
在DMA传输过程中,每次数据传输后,源地址和目标地址可以根据配置自动增加或保持不变。这主要通过以下两个设置控制:
源地址增量(Source Address Increment):在每次数据传输后,如果启用了源地址增量,源地址将根据设置的增量大小(通常是数据宽度,如8位、16位或32位)自动增加。如果未启用,源地址将保持不变,这在从单一外设寄存器连续读取数据时很有用。
目标地址增量(Destination Address Increment):与源地址增量类似,目标地址在每次数据传输后也可以根据设置的增量大小自动增加,或者保持不变。
7.3 地址生成算法
基于上述设置,DMA的地址生成算法可以概括为:
初始化:在DMA传输开始前,源地址和目标地址被初始化为预设的起始地址。
数据传输:每次传输一个数据单元(根据配置的数据宽度,可以是8位、16位或32位)。
地址更新:
如果启用了源地址增量,源地址将根据数据宽度自动增加。
如果启用了目标地址增量,目标地址将根据数据宽度自动增加。
重复步骤2和3,直到完成预设数量的数据传输。
8. 循环模式
循环模式是STM32F103C8T6等STM32系列微控制器的DMA(直接存储器访问)功能中的一个重要特性,它特别适用于需要连续数据传输的场景,如ADC连续采样、定时器产生的周期性事件等。在循环模式下,DMA传输完成一轮设定的数据量后,会自动重新开始,无需CPU介入重新配置DMA,从而实现了数据的连续传输。
CIRC位:在DMA通道的控制寄存器(DMA_CCRx)中,有一个名为CIRC(循环模式)的位。当这个位被设置(即CIRC=1)时,循环模式被激活。
自动重置:在循环模式下,当DMA完成一次预设数量的数据传输后,不会停止工作。相反,它会自动将数据计数器重置为初始配置的值,然后继续进行下一轮的数据传输。
连续传输:这意味着DMA会不断地循环传输数据,直到CIRC位被清除(即CIRC=0),或者DMA被显式停止。这对于需要连续监测或更新的应用场景非常有用,如连续读取ADC值或向某个外设不断发送数据。
9. 中断
每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。
发生异常事件时,正在进行的DMA传输不会被停止,仍将继续传输。发生错误事件时,正在进行的DMA传输会被停止。
10. 串口DMA发送和接收实验思路
DMA支持很多个外设,这里就以串口DMA接收进行介绍。
一般进行串口接收也有以下几种方式:
通过轮询接收数据
通过中断接收数据
通过DMA接收数据
一般使用情况可能是中断方式用的比较多,但是使用中断在数据量不大的时候使用效率是高的,但数据量一旦很大,这个效率就很低了。数据量很大的传输推荐使用DMA进行传输。
在串口检测到有数据输入的时候,直接让DMA往准备好的存储器中搬运接收到的数据,在这个过程中,CPU还是在处理自己的事,在一帧数据传输完成后,通过空闲中断告诉主任务一帧数据已经传输完毕,主任务再对接收到的数据进行响应处理。整个过程中,程序代码只会触发一次中断,就是DMA搬移完数据后通知CPU的那一次中断,这种方法无论一帧数据的数据量有多大,都只会触发一次中断,且在传输过程中不占用CPU的时间,大大节省效率。