【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工作条件

  1. 开关控制,DMA使能。
  2. 传输计数器必须大于0。
  3. 触发源必须有触发信号,触发一次转运一次,传输计数器自减一次。
  4. 当传输计数器等于0,且没有自动重装时,无论是否触发,DMA都不会再进行转运,此时就要失能开关控制(DMA_CMD)关闭DMA,给传输计数器写一个数,再使能开关控制开启DMA,才能继续工作(不能在DMA开启时写入传输计数器)。

DMA请求

  • DMA每一个通道都有数据选择器,可以选择硬件或者软件触发。
  • 每一个通道的硬件触发源不同,想要用不同的外设来触发,就必须选择某个特定的通道。假如选择软件触发,那么通道就可以任意选择。(每个通道都支持软件触发和特定的硬件触发)
  • 到底在一个通道上选择哪一个外设触发源,是根据其中某个外设开启了DMA输出来决定的(如ADC_DMACMD),必须使用库函数开启某个外设的DMA输出才会有效。

 数据宽度与对齐

  • 数据宽度都一样,就是正常的一个个转运。
  • 假如目标的数据宽度比源端的数据宽度大,那就在目标数据前面多出的高位补0。
  • 假如目标数据宽度比源端数据宽度小,那么就会把多出来的高位舍弃。

DMA数据转运

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

ADC扫描+DMA

  • 左边ADC有七个通道,触发以后,七个通道依次进行AD转换,转换的结果都放到ADC_DR数据寄存器中。
  • 在每一个单独的通道转换完成后,进行一次DMA数据转运,且目的地址进行自增。
  • DMA配置

  1. 外设地址写入ADC_DR寄存器的地址。
  2. 存储器的地址在SRAM中定义一个数组ADValue,将ADValue的地址当作存储器的地址。
  3. uint16_t位的数据,故数据宽度为半字传输。
  4. 从ADC_DR寄存器将数据转运到DMA,那么外设地址不自增,存储器地址自增。
  5. 此处通道有七个,故传输计数器写7。
  6. ADC如果是单次扫描,那么DMA的传输计数器可以不自动重装,转换一轮就停止;如果ADC是连续扫描模式,那么DMA就可以使用自动重装,在ADC启动下一轮转换的时候,DMA也启动下一轮转运,ADC和DMA同步工作。
  7. 使用ADC硬件触发DMA,因为ADC_DR的值是在ADC单个通道转换完成后才会有效,故DMA转运的时机需要和ADC单个通道转换完成同步,故选择ADC硬件触发。ADC扫描模式在一个单独的通道转换完成以后,没有任何标志位,也不会触发中断,但是会产生DMA请求,去触发DMA转运。
  8. DMA最常见的用途就是配合ADC的扫描模式,因为ADC扫描模式有数据覆盖的特征。

博客导航

博客导航

posted @ 2024-11-21 14:11  膝盖中箭卫兵  阅读(126)  评论(0)    收藏  举报  来源
ORCID iD icon https://orcid.org/0000-0001-5102-772X