从字面意思上看,DMA即为“直接内存读取”的意思,换句话说DMA就是用来传输数据的,它也属于一个外设。只是在传输数据时,无需占用CPU。
DMA请求
某个外设在通过DMA传输数据前,必须先给DMA控制器发送请求,控制器会返回一个应答信号给外设,外设应答后并且DMA控制器收到外设应答信号后,便会启动DMA传输。这个过程类似于TCP的“三次握手”。
DMA有DMA1和DMA2两个控制器,每个控制器都有不同的通道,每个通道对应不同的外设请求。如图12-1为DMA1的通道请求、图12-2为DMA2的通道请求。
图12-1
图12-2
如以上两图所示,DMA1有7个通道,DMA2有5个通道,每个通道都对应着不同的外设请求。既然这样,就很有可能出现多个外设同时请求同一通道的情况。这响应先后顺序该如何处理是好?那么,这就涉及到仲裁器管理了,用仲裁器来处理请求响应先后的问题。需要分两个阶段,第一阶段是在DMA_CCRx寄存器中设置通道优先级,第二阶段则需要判断其通道编号,编号越低优先级越高。还有一点,DMA1优先级要高于DMA2。
DMA传输方向
DMA传输方向有三个:外设到内存,内存到外设,内存到内存。
外设到内存。即从外设读取数据到内存。例如ADC采集数据到内存,ADC寄存器地址为源地址,内存地址为目标地址。
内存到外设。即从内存读取数据到外设。例如串口向电脑发送数据,内存地址为源地址,串口数据寄存器地址为目标地址。此时内存存储了需要发送的变量数据。
内存到内存。以内部flash向内部sram传输数据为例,此时内部flash地址即为源地址,内部sram地址即为目标地址。同时,需要将DMA_CCRx寄存器的MEM2MEM置位。
传输配置
我们需要确定数据每次传输的量,这个参数由DMA_CNDTRx寄存器配置。
再者,还有一个源地址和目标地址数据宽度的参数配置。由DMA_CCRx的PSIZE位和MSIZE位配置。可配置为8位、16位、32位。源地址和目标地址的数据宽度需要一致才可传输。
此外,数据想有序地传输,还需要配置源和目标数据指针的增量模式。由DMA_CCRx寄存器的PINC位和MINC位配置。例如串口向电脑发送数据,内存中的地址指针应该递增的发送数据,而串口外设只有一个,所以外设的地址指针不变,无递增。
传输状态标识
可以通过查询DMA_ISR寄存器的相应位的值来判断传输状态。如果在DMA_CCRx寄存器的相应位使能了相应中断,则会产生中断。
另外,传输完成还分成一次传输完成和循环传输完成。DMA在传输完成后,需要失能DMA后重新配置才能继续传输。具体配置由DMA_CCRx寄存器的CIRC位完成。
|