【DMA】DMA外设讲解-STM32

1、DMA简介        

        DMA(Direct Memory Access,直接存储区访问)为实现数据高速在外设寄存器与存储器之间或者存储器与存储器之间传输提供了高效的方法。 之所以称之为高效,是因为DMA传输实现高速数据移动过程无需任何CPU操作控制。从硬件层次上来说, DMA控制器是独立于Cortex-M4内核的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。

        STM32F4xx系列的DMA功能齐全,工作模式众多,适合不同编程环境要求。STM32F4xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等等。

  • 外设到存储器传输就是把外设数据寄存器内容转移到指定的内存空间。比如进行ADC采集时我们可以利用DMA传输把AD转换数据转移到我们定义的存储区中,这样对于多通道采集、采样频率高、连续输出数据的AD采集是非常高效的处理方法。
  • 存储区到外设传输就是把特定存储区内容转移至外设的数据寄存器中,这种多用于外设的发送通信。
  • 存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于C语言内存拷贝函数memcpy,利用DMA传输可以达到更高的传输效率,特别是DMA传输是不占用CPU的,可以节省很多CPU资源。

2、DMA功能框图

        STM32F4xx系列的DMA可以实现外设寄存器与存储器之间或者存储器与存储器之间传输三种模式,这要得益于DMA控制器是采样AHB主总线的, 可以控制AHB总线矩阵来启动AHB事务。功能框图如下所示:

2.1、通道选择-1

        STM32F4xx系列资源丰富,具有两个DMA控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个DMA控制器具有8个数据流, 每个数据流对应8个外设请求。在实现DMA传输之前,DMA控制器会通过DMA数据流x配置寄存器DMA_SxCR(x为0~7,对应8个DMA数据流) 的CHSEL[2:0]位选择对应的通道作为该数据流的目标外设。

        外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。

        DMA请求映射情况参考下表。

        1、我们可以明显的看到相同的外设请求可以占用不同的数据流通道,这样设计是尽可能提供多个数据流同时使用情况选择。

        2、每个数据流只能有一个请求,比如DMA1的数据流0使用了SPI3_RX请求后,该数据流的其他请求不能使用。

2.2、仲裁器-2

        仲裁器对8个DMA数据流的传输请求优先级进行管理。

        优先级管理分为两个阶段:

        ● 软件:每个数据流优先级都可以在DMA_SxCR(x=0~7)寄存器中配置,分为四个级别:

                --- 非常高优先级

                --- 高优先级

                --- 中有限级

                --- 低优先级

        ● 硬件:如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据
。例如,数据流 2 的优先级高于数据流 4。

2.3、FIFO-3

        FIFO用于在源数据传输到目标之前临时存储这些数据。每个数据流都独立拥有一个4字FIFO(先进先出存储器缓冲区),可通过DMA_SxFCR FTH[1:0]将阈值级别配置为1/4、1/2、3/4或满。

        FIFO的结构随源与目标数据宽度而不同,如下图所示:

        可以通过DMA_SxFCR DMDIS 位来配置是否使用FIFO,=1为直接模式,=0为FIFO模式。

直接模式

        默认情况下,FIFO是直接模式操作,不使用FIFO阈值级别。在直接模式下,如果DMA配置为存储器到外设传输那DMA会见一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。

        为了避免FIFO饱和,建议使用高优先级配置相应的数据流。

        直接模式仅限一下方式的传输:

  • 源和目标传输宽度一致,并均由DMA_SxCR 中的 PSIZE[1:0] 位定义,MSIZE[1:0] 位的
    状态是“无关”)
  • 不可能进行突发传输(DMA_SxCR 中的 PBURST[1:0] 和 MBURST[1:0] 位的状态是“无
    关”)
  • 当实现存储器到存储器传输时不得使用直接模式

2.4、存储器端口-4、外设端口-5

        DMA控制器实现双AHB主接口,更好利用总线矩阵和并行传输。DMA控制器通过存储器端口和外设端口与存储器和外设进行数据传输, 关系见下图。DMA控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口。

        DMA2(DMA控制器2)的存储器端口和外设端口都是连接到AHB总线矩阵,可以使用AHB总线矩阵功能。DMA2存储器和外设端口可以访问相关的内存地址,包括有内部Flash、内部SRAM、AHB1外设、AHB2外设、APB2外设和外部存储器空间。

        DMA1的存储区端口相比DMA2的要减少AHB2外设的访问权,同时DMA1外设端口是没有连接至总线矩阵的,只有连接到APB1外设,所以DMA1不能实现存储器到存储器传输

3、DMA配置

        DMA具有多种多样的工作模式,具体的各种配置如下:

3.1、DMA传输模式、源地址和目标地址

        传输模式使用DMA_SxCR DIR[1:0]来进行配置,由三种可能的传输方向:存储器到外设、外设到存储器、存储器到存储器

(DMA1只支持外设到存储器和存储器到外设,DMA2全部支持)

        源传输和目标传输在整个 4 GB 区域(地址在 0x0000 0000 和 0xFFFF FFFF 之间)都可以寻址外设和存储器,通过DMA_SxPAR(x为0~7)或者DMA_SxM0AR/DMA_SxM1AR(x为0~7)来配置外设地址和存储器地址,其中DMA_SxM1AR​​​​​只用于双缓冲模式,这些寄存器都是32位数据有效的。
 

        在DMA_SxCR PSIZE[1:0]和MSIZE[1:0]位分别指定外设和存储器数据宽度大小,可以指定为字节(8位)、半字(16位)和字(32位),我们可以根据实际情况设置。直接模式要求外设和存储器数据宽度大小一样,实际上在这种模式下DMA数据流直接使用PSIZE,MSIZE不被使用。      

        注意:当数据宽度(在 DMA_SxCR 寄存器的 PSIZE 或 MSIZE 位中编程)分别是半字或字时,写入 DMA_SxPAR 或 DMA_SxM0AR/M1AR 寄存器的外设或存储器地址必须分别在字或半字地址的边界对齐

3.2、流控制器

        控制要传输的数据数量的实体称为流控制器,主要涉及到一个控制DMA传输停止问题。流控制器分为:

  • DMA控制器:在这种情况下,要传输的数据数目在DMA_SxCR EN位置1前写入DMA_SxNDTR(16位数据有效寄存器)。DMA_SxCR EN位置1后就进入准备传输状态。当DMA_SxNDTR值随着传输次数增加而递减,递减到0时DMA控制器就可以自动控制DMA停止传输
  • 外设源目标:当要传输的数据量未知时属于这种情况。当所传输的是最后的数据时,外设通过硬件向DMA控制器发出停止信号来结束数据传输。目前支持发出传输结束信号的外设只有SDIO。

3.3、循环模式

        循环模式相对应于一次模式。一次模式就是传输一次就停止传输,下一次传输需要手动控制,而循环模式在传输一次后会自动按照相同配置重新传输,周而复始直至被控制停止或传输发生错误。

        通过DMA_SxCR  CIRC位可以使能循环模式。

3.4、传输类型

        DMA传输类型有单次(Single)传输突发(Burst)传输。突然传输就是用非常短时间结合非常高数据信号率传输数据,相对正常传输速度,突然传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效果。为确保数据一致性,形成突发的每一组传输都不可分割:在突发传输序列期间, AHB 传输会锁定,并且 AHB 总线矩阵的仲裁器不解除对 DMA 主总线的授权。
        DMA通过DMA_SxCR MBURST[1:0]和PBURST[1:0]来独立配置外设和存储器不同节拍数的突发传输,支持4/8/16个节拍的增量突发传输。PINC位和MINC位是寄存器DMA_SxCR寄存器的第9和第10位,如果位被置1则在每次数据传输后数据地址指针自动递增, 其增量由PSIZE和MSIZE值决定,比如,设置PSIZE为半字大小,那么下一次传输地址将是前一次地址递增2。

        注意:所谓的节拍指的是每次请求时DMA传输一次字节/半字/字数据,4节拍表示每次传输4*字节/半字/字数据。

       突发传输是基于FIFO实现的,所以需要结合FIFo使用,具体要求FIFO阈值一定要是内存突发传输数据量的整数倍,如下图所示:

3.5、直接模式

        默认情况下,DMA工作在直接模式,不使能FIFO阈值级别。

        直接模式在每个外设请求都立即启动对存储器传输的单次传输。直接模式要求源地址和目标地址的数据宽度必须一致,所以只有PSIZE控制,而MSIZE值被忽略。突发传输是基于FIFO的所以直接模式不被支持。另外直接模式不能用于存储器到存储器传输。

        在直接模式下,如果DMA配置为存储器到外设传输那DMA会见一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。

3.6、双缓冲模式

        设置DMA_SxCR DBM位为1可启动双缓冲传输模式,并自动激活循环模式。双缓冲不应用与存储器到存储器的传输。双缓冲模式下,两个存储器地址指针都有效,即DMA_SxM1AR寄存器将被激活使用。开始传输使用DMA_SxM0AR寄存器的地址指针所对应的存储区,当这个存储区数据传输完DMA控制器会自动切换至DMA_SxM1AR寄存器的地址指针所对应的另一块存储区,如果这一块也传输完成就再切换至DMA_SxM0AR寄存器的地址指针所对应的存储区,这样循环调用。

        当其中一个存储区传输完成时都会把传输完成中断标志TCIF位置1,如果我们使能了DMA_SxCR寄存器的传输完成中断,则可以产生中断信号,这个对我们编程非常有用。另外一个非常有用的信息是DMA_SxCR寄存器的CT位,当DMA控制器是在访问使用DMA_SxM0AR时CT=0,此时CPU不能访问DMA_SxM0AR,但可以向DMA_SxM1AR填充或者读取数据;当DMA控制器是在访问使用DMA_SxM1AR时CT=1,此时CPU不能访问DMA_SxM1AR,但可以向DMA_SxM0AR填充或者读取数据。另外在未使能DMA数据流传输时,可以直接写CT位,改变开始传输的目标存储区。

        双缓冲模式应用在需要解码程序的地方是非常有效的。比如MP3格式音频解码播放,MP3是被压缩的文件格式,我们需要特定的解码库程序来解码文件才能得到可以播放的PCM信号,解码需要一定的实际,按照常规方法是读取一段原始数据到缓冲区,然后对缓冲区内容进行解码,解码后才输出到音频播放电路,这种流程对CPU运算速度要求高,很容易出现播放不流畅现象。如果我们使用DMA双缓冲模式传输数据就可以非常好的解决这个问题,达到解码和输出音频数据到音频电路同步进行的效果。

3.7、DMA中断

 每个DMA数据流可以在发送以下事件时产生中断:

        1)达到半传输:DMA数据传输达到一半时HTIF标志位被置1,如果使能HTIE中断控制位将产生达到半传输中断;

        2)传输完成:DMA数据传输完成时TCIF标志位被置1,如果使能TCIE中断控制位将产生传输完成中断;

        3)传输错误:DMA访问总线发生错误或者在双缓冲模式下试图访问“受限”存储器地址寄存器时TEIF标志位被置1,如果使能TEIE中断控制位将产生传输错误中断;

        4)FIFO错误:发生FIFO下溢或者上溢时FEIF标志位被置1,如果使能FEIE中断控制位将产生FIFO错误中断;

        5)直接模式错误:在外设到存储器的直接模式下,因为存储器总线没得到授权,使得先前数据没有完成被传输到存储器空间上,此时DMEIF标志位被置1,如果使能DMEIE中断控制位将产生直接模式错误中断。

3.7、流配置详细过程

        配置DMA数据流x时应遵守下面的顺序:

        1、复位DMA_SxCR EN=0,将此为写0不会立即生效,所以需要等待EN位置0,然后才可以开始配置数据流。

        2、配置外设端口寄存器地址DMA_SxPAR

        3、配置存储器地址DMA_SxMA0R(在双缓冲区模式下还有DMA_SxMA1R)。

        4、配置要传输的数据量DMA_SxNDTR

        5、DMA通道选择DMA_SxCR CHSEL[2:0]

        6、如果外设用作流控制器而且支持此功能,请将 DMA_SxCR 寄存器中的 PFCTRL 位置 1。

        7、配置数据流优先级DMA_SxCR PL[1:0]

        8、配置FIFO使用情况(使能/禁止,发送和接收阈值)。

        9、配置数据传输方向、外设和存储器地址增量/固定模式、单次传输/突发传输、外设和存储器数据宽度、循环模式、双缓冲区模式和中断配置。

        10、使能数据流DMA_SxCR EN = 1

        一旦使能了流,即可响应连接到数据流的外设发出的任何 DMA 请求。
        一旦在 AHB 目标端口上传输了一半数据,传输一半标志 (HTIF) 便会置 1,如果传输一半中断使能位 (HTIE) 置 1,还会生成中断。传输结束时,传输完成标志 (TCIF) 便会置 1,如果传输完成中断使能位 (TCIE) 置 1,还会生成中断。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值