【STM32 系列】DMA —— 直接存储器存取
引言
这个最近也忘了,自用。
简介

- 存储器(SRAM、Flash)和外设之间数据传输、存储器和存储器之间数据传输。
 - 通道就是数据转运路径,一个数据要进行转运,就要占用一个通道。如果有多个通道进行数据转运, 它们之间可以各转各的,互不干扰。
 - 1、使用软件触发以后,DMA就会将数据以最快的速度全部转运完成。一般用于存储器到存储器之间的转运。
2、使用硬件触发,就可以有一定的时机。例如ADC,可以触发一次DMA,DMA转运一次。一般用于外设到存储器的转运。
3、每一个DMA的通道,其硬件触发源是不一样的,想要使用某一个硬件的触发源,就要使用它连接的通道,而不能任意选择。 
存储器
所谓的外设只不过是STM32特定指定了可以转运外设的存储器,本质上其实都是存储器到存储器之间的数据转运。
- ROM:只读存储器,非易失性、掉电不丢失的存储器。
 - RAM:随机存储器,易失性、掉电丢失的存储器。
 
DMA存取

- 总线矩阵:其左边是主动单元,拥有存储器的访问权;右边的是被动单元,只能被左边的主动单元读写.
 - 仲裁器:虽然DMA有多个通道可以独立转运数据,但是DMA总线只有一条,所以所有的通道都只能分时复用这一条DMA总线。产生了冲突,仲裁器就会根据通道的优先级,来决定使用先后。
 - AHB从设备:DMA作为外设的自身的寄存器。所以DMA即是总线矩阵的主动单元,可以读写各种寄存器;也是AHB总线上的被动单元,CPU可以通道AHB总线对DMA进行配置。
 - DMA请求:DMA的硬件触发源,比如DMA转换完成、串口接收到数据,需要触发DMA转运数据的时候,就会向DMA发出硬件触发信号。
 - CPU和DMA直接访问Flash的话,只能读取而不可写入。
 - SRAM是运行内存,可以任意读写。
 
DMA工作

- 传输计数器:指定DMA需要转运几次,是一个自减计数器。减到0后,就不再进行转运,并且自增的起始地址也会恢复到原本的起始地址。
 - 自动重装器:在传输在传输计数器自减到0后将其重装到初始值,决定了转运的模式。如果不使能,就是单次转运模式;如果使能,就是循环转运模式。
 - M2M:存储器到存储器。使能M2M时,DMA就会选择软件触发,以最快的速度连续不断的触发DMA,将传输计数器清零,完成一轮转换(注意与ADC的软件触发不太一样,这里可以理解为连续触发),并且软件触发和自动重装器不能一起用。不使能M2M时,可以选择硬件触发,触发源可以选择ADC、串口、定时器等外设,硬件达到某一个时机时,传输一个信号来触发DMA转运。
 - 开关控制:DMA_CMD函数,使能后,DMA就能进行转运。
 
DMA工作条件
- 开关控制,DMA使能。
 - 传输计数器必须大于0。
 - 触发源必须有触发信号,触发一次转运一次,传输计数器自减一次。
 - 当传输计数器等于0,且没有自动重装时,无论是否触发,DMA都不会再进行转运,此时就要失能开关控制(DMA_CMD)关闭DMA,给传输计数器写一个数,再使能开关控制开启DMA,才能继续工作(不能在DMA开启时写入传输计数器)。
 
DMA请求
- DMA每一个通道都有数据选择器,可以选择硬件或者软件触发。
 - 每一个通道的硬件触发源不同,想要用不同的外设来触发,就必须选择某个特定的通道。假如选择软件触发,那么通道就可以任意选择。(每个通道都支持软件触发和特定的硬件触发)
 - 到底在一个通道上选择哪一个外设触发源,是根据其中某个外设开启了DMA输出来决定的(如ADC_DMACMD),必须使用库函数开启某个外设的DMA输出才会有效。
 
数据宽度与对齐
- 数据宽度都一样,就是正常的一个个转运。
 - 假如目标的数据宽度比源端的数据宽度大,那就在目标数据前面多出的高位补0。
 - 假如目标数据宽度比源端数据宽度小,那么就会把多出来的高位舍弃。
 
DMA数据转运

存储器到存储器之间的转运,使用软件触发,不需要等待硬件时机,尽快转运完成即可。
ADC扫描+DMA

- 左边ADC有七个通道,触发以后,七个通道依次进行AD转换,转换的结果都放到ADC_DR数据寄存器中。
 - 在每一个单独的通道转换完成后,进行一次DMA数据转运,且目的地址进行自增。
 -  
DMA配置
 
- 外设地址写入ADC_DR寄存器的地址。
 - 存储器的地址在SRAM中定义一个数组ADValue,将ADValue的地址当作存储器的地址。
 - uint16_t位的数据,故数据宽度为半字传输。
 - 从ADC_DR寄存器将数据转运到DMA,那么外设地址不自增,存储器地址自增。
 - 此处通道有七个,故传输计数器写7。
 - ADC如果是单次扫描,那么DMA的传输计数器可以不自动重装,转换一轮就停止;如果ADC是连续扫描模式,那么DMA就可以使用自动重装,在ADC启动下一轮转换的时候,DMA也启动下一轮转运,ADC和DMA同步工作。
 - 使用ADC硬件触发DMA,因为ADC_DR的值是在ADC单个通道转换完成后才会有效,故DMA转运的时机需要和ADC单个通道转换完成同步,故选择ADC硬件触发。ADC扫描模式在一个单独的通道转换完成以后,没有任何标志位,也不会触发中断,但是会产生DMA请求,去触发DMA转运。
 - DMA最常见的用途就是配合ADC的扫描模式,因为ADC扫描模式有数据覆盖的特征。
 
博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/Skyrim-sssuuu/p/18774947

                
            
        
浙公网安备 33010602011771号
        https://orcid.org/0000-0001-5102-772X