STM32入门教程---DMA简介

DMA简介

  • DMA(Direct Memory Access)直接存储器存取;
  • DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源;
  • 12个独立可配置的通道:DMA1(7个通道)、DMA2(5个通道)
  • 每个通道都支持软件触发和特定的硬件触发
  • STM32F103C8T6 DMA资源:DMA1(7个通道)

存储器映像

在这里插入图片描述
DMA数据转运本质上是从存储器到存储器的数据转运;

  • ROM是只读存储器,是一种非易失性、掉电不丢失的存储器,RAM是一种随机存储器,是一种易失性、掉电丢失的存储器;
  • 存储器起始位置是固定的,而终止位置取决与存储内存,内存多大则终止位置多大;

DMA框图

在这里插入图片描述

  • 寄存器是一种特殊的存储器,一方面,CPU可以对寄存器进行读写,就像读写内存一样,另一方面,寄存器的每一位背后,都连接了一根导线,可以用于控制外设电路的状态,比如导通和断开开关、置引脚的高低电平等;所以寄存器是连接软件和硬件的桥梁。
  • 总线矩阵的左端是主动单元,主动单元有内核CPU和DMA总线,拥有存储器的访问权,右端是被动单元,它们的存储器只能被左端的主动单元读写;
  • DCode是专门访问Flash的,系统总线是访问其他东西的;
  • DMA的各个通道可以分别设置他们转运数据的源地址和目的地址,仲裁器的作用是根据通道的优先级来决定哪个通道先转运;
  • AHB从设备是DMA自身的寄存器,所以DMA既是总线矩阵上的主动单元,可以读写各种寄存器,也是AHB总线上的被动单元;
  • DMA请求就是DMA触发源;

DMA基本结构

在这里插入图片描述

  1. 起始地址:有外设端的起始地址,和存储器端的起始地址,这两个参数决定数据从哪里来,到哪里去;
  2. 数据宽度:指定一次转运要按多大的数据宽度来进行,口语选择字节Byte(8位)、半字HalfWord(16位)、字Word(32位)
  3. 地址是否自增:指定一次转运完成后,下一次转运,是不是要把地址移动到下一个位置去,相当于指针p++;
  4. 传输计数器:用来指定总共需要转运几次;是一个自减计数器,每转运一次计数器的数减1,当计数器的值减到0后,之前自增的地址恢复到起始地址的位置,以方便DMA开启新一轮转换;
  5. 自动重装器:传输计数器减到0之后,是否要自动恢复到最初的值;不重装就是简单的单次模式,重装就是循环模式,相对于ADC的连续模式;
  6. 触发控制就是决定DMA在什么时机开始转运,有硬件触发和软件触发,由M2M决定;软件触发的执行逻辑是:以最快的速度,连续不断的触发DMA,争取早日把传输计数器清零,完成一轮传输即连续触发,所以软件触发和循环模式不能同时使用;
  7. 软件触发一般适用于存储器到存储器的转运,因为存储器到存储器的转运是软件启动、不需要时机、想尽快完成的任务;
  8. 硬件触发源可以选择ADC、串口、定时器等等,使用硬件触发的转运, 一般都是与外设有关的转运,需要一定的时机,在硬件达到这个时机时,传一个信号来触发DMA进行转运;
  9. DMA进行转运的条件:开关控制;传输计数器必须大于0;触发源必须有触发信号;
  10. 注意写传输计数器时,必须先关闭DMA,再进行写入传输计数器,然后再开启DMA进行下一轮转运;

DMA请求

在这里插入图片描述因为每个通道的硬件触发源都不同,所以想使用某个硬件触发源的时候,必须选择对应的通道;而软件触发可以随意选择,因为每个通道的软件触发都是一样的;

仲裁器的优先级原则是通道号越小,优先级越高;

数据宽度与对齐


如果目标宽度比源端宽度大,就在数据前面补0;
如果目标数据宽度比源端数据宽度小,就把多出来的高位舍弃;

例子

数据转运+DMA

在这里插入图片描述
两个站点的数据地址都需要自增

ADC扫描模式+DMA

在这里插入图片描述
外设地址不自增,存储器地址自增;

如果ADC是单次扫描,DMA的传输计数器可以不自动重装;如果ADC是连续扫描,DMA可以使用自动重装,在ADC启动下一轮转换的时候,DMA也启动下一轮的转运;

DMA转运的时机,需要与ADC单个通道转换完成同步。ADC单个通道的数据转换完成后,会产生一个DMA请求

代码

DMA数据转运

接线图

在这里插入图片描述

代码思路

  1. RCC开启时钟;(DMA是AHB总线的设备)
  2. 调用DMA_Init初始化参数,包括外设和存储器站点的起始地址、数据宽度、地址是否自增、方向、传输计数器。是否需要自动重装、选择触发源、通道优先级;
  3. 开关控制,给指定地通道使能;
  4. 如果选择硬件触发,要在对应外设调用xxx_DMACmd,开启触发信号的输出;

库函数

  • DMA_SetCurrDataCounter用于给传输计数器写数据;
  • DMA_GetCurrDataCounter用于获取当前数据寄存器,返回传输计数器的值;
  • 最后四个函数:获取标志位、清除标志位、获取中断状态、清除中断挂起位;
    在这里插入图片描述

DMA-AD多通道

接线图

在这里插入图片描述

代码

在这里插入图片描述
在这里插入图片描述

总结

本节涉及的内容对应手册里的第二章 存储器和总线架构、以及第十章 DMA控制器。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值