STM32 DMA(直接存储器存取)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、DMA简介

        》》这里指的外设,一般是外设的数据寄存器DR,比如ADC的数据寄存器,串口的数据寄存器等等。存储器指的是,运行内存SRAM和程序存储器Flash。是我们存储变量数组和程序代码的地方,在外设和存储器,或者存储器和存储器之间 进行数据转运,就可以使用DMA来完成。并且在转运过程中,无需CPU的参与,节省了CPU的资源。

        》》12个独立可配置的通道:这个通道就是数据转运的路径。从一个地方移动到另一个地方就需要占用一个通道。如果有多个通道进行转运,那他们之间可以各转各的,互不干扰。

        》》如果DMA进行的是存储器到存储器的数据转运,比如我们想把Flash里的一批数据,转运到SRAM里去,那就需要软件触发了,使用软件触发之后DMA就会一股脑地把这批数据,以最快的速度,全部转运完成。

            如果DMA进行的是外设到存储器的数据转运,就不能一股脑的转运了,因为外设的数据是有一定时机的,所以这时我们就需要用硬件触发。比如转运ADC数据,那就得ADC每个通道AD转换完成后硬件触发一次DMA,之后DMA再转运,触发一次,转运一次,这样数据才是正确的。

        所以存储器到存储器的数据转运,我们一般使用软件触发。外设到存储器的数据转运,我们一般使用硬件触发。

注:每个DMA通道,它的硬件触发源是不一样的,你要使用某个外设的硬件触发源,就得使用它连接的那个通道,而不能任意选择通道。

二、存储器映像

        这个表就是STM32中所有类型的存储器和它们所被安排的地址。存储器总共分成两大类:

        1.ROM:只读存储器,是一种非易失性,掉电不丢失的存储器。分为三块,第一块是程序存储器Flash(主闪存),它的用途就是存储c语言编译后的程序代码,也就是我们下载程序的位置,运行程序一般也是从主闪存里面开始运行的。

2.RAM:随机存储器,是一种易失性,掉电丢失的存储器。首先看运行内存SRAM,用途是存储运行过程中的临时变量。也就是我们在程序中定义变量,数组,结构体的地方。

外设寄存器用途是存储各个外设的配置参数,也就是我们初始化各个外设,最终所读写的东西。

三、DMA框图

        左上角是Cortex_M3内核,里面包含了CPU和内核外设等等。剩下的这所有东西,你都可以看成是存储器,所以总共就是CPU存储器两个东西。

        各个外设都可以看成是寄存器,也是一种SRAM存储器,寄存器是一种特殊的存储器,一方面,CPU可以对寄存器进行读写,就像读写运行内存一样,另一方面,寄存器的每一位背后都连接了一根导线,这些导线可以用于控制外设电路的状态,比如置引脚高低电平,导通,和断开开关,切换数据选择器。所以寄存器是连接软件和硬件的桥梁。软件读写寄存器,就相当于在控制硬件的执行。

        DMA转运就是从某个地址取内容,再放到另一个地址去。

我们看图,为了高效有条理地访问存储器,这里设计了一个总线矩阵总线矩阵的左端是主动单元,也就是拥有存储器的访问权。右端那些是被动单元,它们的存储器只能被左边的主动单元读写。

        主动单元这里内核有DCode和系统总线,可以访问右边的存储器。其中DCode总线是专门访问Flash的,系统总线是访问其他东西的。另外,由于DMA要转运数据,所以DMA也必须要有访问的主动权。

        另外在总线矩阵这里,有一个仲裁器,如果DMA和CPU都要访问同一个目标,那么DMA就会停止CPU的访问,以防止冲突。不过总线仲裁器仍然会保证CPU得到一半的总线带宽,使CPU也能正常的工作。这就是仲裁器的作用。

        AHB从设备:DMA自身的寄存器。因为DMA作为一个外设,它自己也会有相应的配置寄存器。这里连接在了总线右边的AHB总线上,所以DMA,即总线矩阵的主动单元,可以读写各种存储器。也是AHB总线上的被动单元。CPU通过控制AHB来对DMA进行配置。

        DMA请求:请求就是触发的意思,这条线路右边的触发源,是各个外设,所以这个DMA请求就是DMA的硬件触发源。比如ADC转换完成,串口接收到数据需要触发DMA转运数据的时候就会通过这条线路,向DMA发出硬件触发信号,之后DMA就可以执行数据转运的工作了。

注:CPU或者DMA直接访问Flash的话,是只可以读,不可以写的。SRAM是运行内存,可以任意读写。

四、DMA基本结构

        传输计数器:用来指定总共需要转运几次的,这个传输计数器是一个自减计数器。比如給它写一个5,那DMA就只能进行5次数据转运,转运工程中,每转运一次,计数器的数就会减1。当它减到0之后,DMA就不会再进行数据转运了。另外它减到0之后,外设之前自增的地址,也会恢复到起始地址的位置。以方便之后DMA开始新一轮的转运。

        自动重装器:作用就是,当传输计数器减到0之后。是否要自动恢复到最初的值。比如最初传输计数器给5,如果不使用自动重装器,那转运5次后,DMA就结束了。如果使用自动重装器,那转运5次,计数器减到0后,就会立即重装到初始值5。

        DMA触发控制:触发源有硬件触发和软件触发,具体选择哪个由M2M这个参数决定,M2M(存储器到存储器的意思)当我们给M2M位1时,DMA就会选择软件触发,这里的软件触发并不是调用某个函数一次就触发一次,它这个软件触发的执行逻辑时:以最快的速度,连续不断地触发DMA争取早日把传输计数器清零,完成这一轮转换。和外部中断和ADC的软件触发可能不太一样。还有就是这个软件触发和循环模式,不能同时用,如果同时用的话那DMA就停不下来了.

        DMA进行转运条件:1.DMA_Cmd使能。 2.传输计数器大于0。   3.触发源必须有触发信号

触发一次,转运一次,传输计数器自减一次当传输计数器等于0,且没有自动重装时,这时无论是否触发,DMA都不会再进行转运了。此时就需要DMA_Cmd,给DISABLE,关闭DMA,再为传输计数器写入一个大于0的数,再DMA_Cmd,给ENABLE,开启DMA。(注:写传输计数器时,必须要先关闭DMA,再进行,不能在DMA开启时,写传输计数器。)

五、数据宽度与对齐

        如果数据宽度不一样?

图中第一列是源端宽度,第二列是目标宽度,第三列是传输数目。

当源端和目标都是8位时,转运第一步,在源端的0位置,读数据B0,在目标的0位置写数据B0.

当源端8位和目标是16位时,即在源端的0位置,读数据B0,在目标的0位置写数据00B0......

如果目标的数据宽度比源端的数据宽度大,那就在目标数据前面多出来的空位补0,之后8位转运到32位也是一样的处理。

如果目标的数据宽度比源端的数据宽度小时,比如从16位转到8位去现象就是,读B1B0,只写入B0,读B3B2,只写入B2,也就是把多出来的高位舍弃掉.

六、数据转运+DMA

        图示意思是:将SRAM里的数组DataA,转运到另一个数组DataB中.


七、ADC扫描模式+DMA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值