【STM32】DMA(直接存储器访问)

一、DMA本质

【STM32】DMA(直接存储器访问)_第1张图片

在ADC中使用FIFO(先进先出),当FIFO快满的时候,产生一个中断。在中断的时候将数据传输到SRAM,但是此时还是需要CPU的参与,但是CPU就不会一直在等待。【但是这个方法还是不能完全解决问题】

【STM32】DMA(直接存储器访问)_第2张图片

此时ADC不将数据存储到寄存器中,直接给DMA

1)适用与需要大量的数据传输,减轻CPU的负担

2)DMA实际上是一块电路,一个内部外设

3)DMA就是建立数据的传输通道【不需要CPU参与】

【STM32】DMA(直接存储器访问)_第3张图片

二、DMA框图

DMA一般都是连接内存和外设。

【STM32】DMA(直接存储器访问)_第4张图片

1.DMA请求

DMA传输数据,先向DMA控制器发送请求

【STM32】DMA(直接存储器访问)_第5张图片

2.DMA通道

不同外设向DMA的不同通道发送请求

DMA1有7个通道,DMA2有5个通道

DMA2仅存在于大容量产品和互联型产品。

【STM32】DMA(直接存储器访问)_第6张图片

3.DMA优先级

多个DMA通道同时发送请求时,就有先后响应处理的顺序问题,这个由仲裁器管理(优先级分为:软件阶段 && 硬件阶段

【STM32】DMA(直接存储器访问)_第7张图片

4.DMA的应用场景

【STM32】DMA(直接存储器访问)_第8张图片

三、DMA处理过程

【STM32】DMA(直接存储器访问)_第9张图片

1.各个通道的DMA1请求

1)在F1系列中外设对应的DMA通道是固定都

2)每一个通道用来管理来自于一个或者多个外设对寄存器访问的请求,并且有一个仲裁器,用于处理DMA优先级。

【STM32】DMA(直接存储器访问)_第10张图片

2.DMA优先级:软件VS硬件

在同一个时刻,只有一个请求是有效的

【STM32】DMA(直接存储器访问)_第11张图片

【STM32】DMA(直接存储器访问)_第12张图片

四、可编程的数据传输宽度、对齐方式和数据大小端

1)当PSIZE和MSIZE不相同时,DMA模块按照下表进行数据对齐。

2)关键看源端宽度和目标宽度是否一致,如果不一致存储数据时可能要跳着存储。要跳几位,具体看几倍关系。

【STM32】DMA(直接存储器访问)_第13张图片

五、DMA寄存器

【STM32】DMA(直接存储器访问)_第14张图片

1.DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)

1)数据传输方向

2)通道优先级

3)循环模式

4)外设/存储器增量模式

5)外设/存储器数据宽度(如果不一致,前面有表格可以进行修改)

6)中断使能

增量模式:表示不用手动将指针指向下一个要进行发送/接收所在的位置,而是会自动的移动。(如果我们使用数组对数据进行存储,则需要使用增量模式)

【STM32】DMA(直接存储器访问)_第15张图片

【STM32】DMA(直接存储器访问)_第16张图片

【STM32】DMA(直接存储器访问)_第17张图片

【STM32】DMA(直接存储器访问)_第18张图片

【STM32】DMA(直接存储器访问)_第19张图片

2.DMA中断状态寄存器(DMA_ISR)

查看当前DMA传输状态

当设置了允许中断时,将会产生中断

【STM32】DMA(直接存储器访问)_第20张图片

3.DMA中断标志清除寄存器(DMA_IFCR)

【STM32】DMA(直接存储器访问)_第21张图片

4.DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)

1)最大数据传输数目:65535

2)非循环模式下传输结束后,要开始新的DMA传输,需要在关闭DMA通道的情况下,在该寄存器中重新写入传输数值

【STM32】DMA(直接存储器访问)_第22张图片

5.存放地址

源地址VS目的地址

【STM32】DMA(直接存储器访问)_第23张图片

六、相关HAL库驱动介绍

【STM32】DMA(直接存储器访问)_第24张图片

0.DMA是否中断

判断DMA是否需要中断??

比如:

1)我们从ADC(人脸)将数据传输到SRAM(人脸识别),则直接通过DMA传输就可以。不需要CPU的其他操作就可以完成任务。

2)如果我们从ADC读取到温度,但是此时温度需要CPU去处理,则DMA就需要进行中断,将从ADC获取到的数据传输给CPU进行处理。

1.DMA外设相关结构体

【STM32】DMA(直接存储器访问)_第25张图片

七、DMA配置步骤

【STM32】DMA(直接存储器访问)_第26张图片

八、编程实战

1.条件

按下按键key0,实现内部RAM中内存到内存的数据传输

2.代码编写

1.dma_init

1)使能DAM时钟

2)初始化相关DMA配置

【STM32】DMA(直接存储器访问)_第27张图片

2.dma_enable_transmit

【STM32】DMA(直接存储器访问)_第28张图片

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机)