一、概述
DMA(Direct Memory Access)直接存储器存取
- DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
- 12个独立可配置的通道:DMA1(7个通道),DMA2(5个通道)
- 每个通道都支持软件触发和特定的硬件触发
STM32F103C8T6 DMA资源:DMA1(7个通道)
存储器映像
DMA框图,如下:
DCode总线是专门访问Flash的,系统总线是访问其他东西的,由于DMA要转运数据,所以DMA也必须要有访问的主动权。
虽然DMA有多个通道可以独立转运数据,但DMA总线只有一个,仲裁器会根据通道的优先级来决定谁先用,谁后用。在总线矩阵这里也有个仲裁器,当CPU和DMA同时访问同一个目标,那么DMA就会暂停CPU的访问,以防止冲突,不过总线仲裁器,仍然会保证CPU得到一半的总线带宽,使CPU也能正常工作。
DMA请求就是DMA的硬件触发源,比如ADC转换数据,需要转运数据就需要通过这条线路,向DMA发出硬件触发信号,之后DMA就可以执行转运的动作了,数据寄存器都是可以正常读写
DMA基本结构,如下:
外设寄存器其实就是外设与存储器用于连接的通道,也就是转换机构。外设寄存器也能写Flash 、SRAM的地址,存储器也能写外设寄存器的地址。
传输计数器是用来指定总共需要转运几次的,这个传输寄存器是一个自减寄存器,比如给它指定5次,没转运一次就会减1,如果不使用自动重装器,减为0时就是转运结束。使用这个自动重装器,当传输计数器减为0时会立即重装到初始值为5。如果不重装,就单次模式转运,重装就是循环模式转运。修改传输计数器时,要使DMA_Cmd先使能。
接着就是触发源,有软件触发源和硬件触发源,具体是哪个由M2M(memory to memory)参数决定,当我们给这个M2M为1时,就会进行软件触发,它这个软件触发的逻辑是以最快的速度,连续不断地触发DMA,争取早日把传输计数器清零,完成这一轮的转换。自动重装器和软件触发不能同时使用。软件触发一般就是应用存储器到存储器的转运。硬件(这里硬件可以理解为外设)触发一般与外设有关的转运,比如ADC转换完成,来触发DMA转运。
这开关控制就是用DMA_Cmd()进行使能。
DMA请求映像
EN位决定这个寄存器工作不工作。EN位为0表示不工作,EN位为1表示工作。
固定的硬件优先级进行优先级判断,通道号越小,优先级越高。
数据宽度与对齐:
源端宽度小于目标宽度时,数据的高位补零,也就是右对齐; 源端宽度小大于目标宽度时,数据的高位丢弃掉,
数据转运+DMA:
DMA外设地址可以自增,DMA存储器地址也可以自增,