本文将介绍STM32的DMA功能;
①DMA介绍
②STM32F4-DMA功能框图及详解
③DMA的增量设置、模式、中断
①DMA介绍
DMA是direct memory access的缩写,即直接存储器访问;DMA是通过硬件在RAM和IO设备之间开辟一条通道,使得采集到的数据直接存到RAM,使得数据的传输不需要经过CPU读数据再将数据放入RAM、这样极大提高了CPU的效率。
②STM32F4-DMA功能框图及详解
外设通道:
STM32F4具有2个DMA控制器,每个DMA控制器有8个数据流,每个数据流可以从8个外设请求中选择一个作为该数据流的外设通道;外设通道就是数据流的源地址或者目标地址;外设通道的选择可以通过DMA数据流x的配置寄存器DMA_SxCR的CHSEL[2:0]位配置;
以下是DMA1的外设通道表:
数据流仲裁:当同时存在多个数据流在工作时,需要数据流仲裁器管理判断数据流的优先传输;数据流传输的优先级可以通过配置控制寄存器DMA_SxCR的PL[1:0]位,来选择优先级为非常高、高、中、低;当多个数据流的优先级相同时,数据流的编号越低、优先级越高;
数据FIFO:
每个数据流都有一个4字(16字节、4个32位寄存器)FIFO(先进先出存储器缓冲区),DMA的传输具有FIFO模式和直接模式;
直接模式:当出现DMA请求时,会进行数据的传输到存储器;若DMA的请求配置设置为存储器到外设模式传输数据时,DMA会将数据从存储器预加载到FIFO中、当外设触发DMA请求时数据立即传输给外设;
FIFO模式:当数据量达到一定数量时,进行数据的传输;可以通过配置DMA_SxFCR的FTH[1:0]位来设置FIFO的阈值级别为FIFO的1/4 、2/4 、3/4。如果数据量达到阈值则FIFO中的数据将被传输到目标地址;
4-5、外设端口、存储器端口:
DMA1的控制器的存储器端口接在AHB总线上,外设端口接在APB1外设上;所以DMA1可以控制数据在外设与存储器之间传输,但不能实现数据在存储器与存储器之间传输;
DMA2的控制器的存储器端口和外设端口都有接到AHB总线上说以与DMA1相比,DMA2比DMA1多一个数据在存储器与存储器之间传输的模式;
③DMA的增量设置、模式、中断
DMA的传输模式:DMA的传输模式有外设与外设之间的传输、外设与存储器之间的传输、存储器与存储器之间的传输;模式的选择可以通过DMA_SxCR寄存器的DIR[1:0]位控制;
DMA传输的源、目的、长度:
外设寄存器地址在DMA_SxPA寄存器中设置;
存储器地址在DMA_SxM0AR寄存器中设置;
数据的传输量在寄存器DMA_CNDTRx中设置
传输数据的位宽在DMA_SxCR寄存器的PSIZE MSIZE位设置(尽量设置为一致)
DMA的增量设置:
通过设置DMA_SxCR寄存器中的PINC MINC位的状态,可以使得外设和存储器在每次数据传输后地址递增或地址不变;当选择为递增模式后,地址的增量就是数据的位宽
循环模式:循环模式用于循环处理缓存区和连续的数据传输(ADC的扫描模式),可以通过DMA_SxCR寄存器中的CIRC位来选择为循环模式;循环模式下当一轮数据传输完成后,下一次开始的地址和上一次的数据传输地址一样;
DMA的单次传输和突发传输:
DMA有单次传输和突发传输,DMA控制器可以产生4、8、16个节拍的增量突发传输(原本一次传输一个数据位宽,4个节拍就是4个数据位宽一次性一起传输);突发传输的大小通过DMA_SxCR寄存器中的MBURST[1:0]和PBURST[1:0]位对两个AHB端口独立配置;
在突发传输下、AHB的总线仲裁器会一直授权给DMA主总线AHB的传输会锁定其它总线暂时使用不了,使得突发传输不可被打断从而保证了数据的一致性;
每个DMA数据流在传输的时候可以触发以下中断:
在DMA_xISR中可以设置、查看状态;