STM32(九)DMA介绍
一、DMA简介
DMA(Direct Memory Access)--直接存储器存取,
- 单片机的一个外设
- 主要功能是用来搬数据
- 搬数据时不占用CPU
- 数据传输支持从外设到存储器或者存储器到存储器。这个里的存储器可以是SRAM或者Flash
- DMA控制器包含DMA1和DMA2。其中DMA1有7个通道,DMA2有5个通道。(通道可理解为传输数据的一种管道)
- DMA2只存在于大容量的单片机中。
- DMA控制器独立于内核
二、DMA功能结构
1、DMA请求
如果外设要想通过DMA来传输数据
(1)先给DMA控制器发送DMA请求,
(2)DMA收到请求信号之后,控制器会给外设一一个应答信号,
(3)当外设应答后且DMA控制器收到应答信号之后,就会启动DMA的传输,直到传输完毕。
DMA有DMA1和DMA2两个控制器,DMA1有7个通道,DMA2有5个通道,不同的DMA控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置,具体见DMA请求映像表。
2、通道
DMA具有12个独立可编程的通道,其中DMA1有7个通道,DMA2有5个通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收-一个,不能同时接收多个。
3、仲裁器
当发生多个DMA通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。仲裁器管理DMA通道请求分为两个阶段。
- 第一阶段属于软件阶段,可以在DMA_ CCRx寄存器中设置,有4个等级:非常高、高、中和低四个优先级。
- 第二阶段属于硬件阶段,如果两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道0高于通道1。 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。
三、DMA数据配置
配置要传输的数据,主要包含以下几个方面:
- 数据从哪里来,要去哪里。
- 传输数据的单位是什么
- 要传多少数据,是一次传输还是循环传输
1、从哪里来到哪里去
DMA传输数据的三个方向:外设-->存储器,存储器-->外设、存储器-->存储器
(1)外设-->存储器
以 ADC 采集为例。 DMA 外设寄存器的地址对应的就是 ADC 数据寄存器的地址, DMA 存储器的地址就是我们自定义的变量(用来接收存储 AD 采集的数据) 的地址。 方向我们设置外设为源地址。
(2)存储器-->外设
以串口向电脑端发送数据为例。 DMA 外设寄存器的地址对应的就是串口数据寄存器的地址, DMA 存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储通过串口发送到电脑的数据) 的地址。方向我们设置外设为目标地址 。
(3)存储器到存储器
以内部FLASH向内部SRAM复制数据为例。DMA外设寄存器的地址对应的就是内部FLASH (我们这里把内部FALSH当作一个外设来看)的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部FLASH的数据)的地址。方向我们设置外设(即内部FLASH)为源地址。跟上面两个不一样的是,这里需要把DMA_ CCR位14: MEM2MEM:存储器到存储器模式配置为1,启动M2M模式。
2、要传多少,单位是什么。
以串口向电脑发送数据为例,我们可以一次性给电脑发送很多数据,具体多少由DMA_CNDTR 配置,这是一个 32 位的寄存器,一次最多只能传输 65535 个数据。
在DMA控制器的控制下,数据要想有条不紊的从一个地方搬到另外-一个地方,还必须正确设置两边数据指针的增量模式。外设的地址指针由DMA _CCRx的PINC配置,存储器的地址指针由MINC配置。以串口向电脑发送数据为例,要发送的数据很多,每发送完一个,那么存储器的地址指针就应该加1, 而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据指针的增量模式由实际情况决定。
3、什么时候传输完成
数据什么时候传输完成,我们可以通过查询标志位或者通过中断的方式来鉴别。每个DMA通道在DMA传输过半、传输完成和传输错误时都会有相应的标志位,如果使能了该类型的中断后,则会产生中断。有关各个标志位的详细描述请参考DMA中断状态寄存器DMA_ISR的详细描述。
传输完成还分两种模式,是一次传输还是循环传输,一次传输很好理解,即是传输一次之后就停止,要想再传输的话,必须关断DMA使能后再重新配置后才能继续传输。循环传输则是--次传输完成之后又恢复第一-次传输时的配置循环传输,不断的重复。具体的由DMA_CCRx寄存器的CIRC循环模式位控制。