(STM32笔记)十二、DMA的基础知识与用法 第二部分

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者

之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

DMA的基础知识与用法

二、DMA传输设置

通常来说,DMA传输最重要的三个内容为:

  1. 数据来源与数据去向
  2. 每次传输大小
  3. 传输结束标志

1、数据来源与数据去向

我们知道 DMA 传输数据的方向有三个:

  • 从外设到存储器 P->M
  • 从存储器到外设 M->P
  • 从存储器到存储器 M->M

具体的方向 DMA_CCR 位 4 DIR 配置:0 表示从外设到存储器,1 表示从存储器到外设。

这里面涉及到的外设地址由 DMA_CPAR 配置,存储器地址由 DMA_CMAR 配置。



外设到存储器

当我们使用从外设到存储器传输时,以 ADC 采集为例。

DMA 外设寄存器的地址对应的就是 ADC数据寄存器的地址,DMA 存储器的地址就是我们自定义的变量(用来接收存储 AD 采集的数据)的地址。
外设到存储器 自定义的变量地址 ADC数据寄存器地址

存储器到外设

当我们使用从存储器到外设传输时,以串口向电脑端发送数据为例。

DMA 外设寄存器的地址对应的就是串口数据寄存器的地址,DMA 存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储通过串口发送到电脑的数据)的地址。
存储器到外设 串口数据寄存器的地址 自定义的变量地址

存储器到存储器

当我们使用从存储器到存储器传输时,以内部 FLASH 向内部 SRAM 复制数据为例。

DMA 外设寄存器的地址对应的就是内部 FLASH(我们这里把内部 FALSH 当作一个外设来看)的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部 FLASH 的数据)的地址。
存储器到存储器 自定义变量的地址 内部FLASH地址
(当做外设看待)

跟上面两个不一样的是,这里需要把DMA_CCR 位 14:MEM2MEM(存储器到存储器模式)配置为 1,启动 M2M 模式。

2、每次传输大小

当我们配置好数据要从哪里来到哪里去之后,我们还需要知道我们要传输的数据是多少,数据的单位是什么。
传输数据设置 如果打开了自动重加载模式
数据量传输至0后复位 设置源地址和目标地址的增量模式
(设置数据存放的方向) 设置源地址和目标地址的宽度
(设置传输单位) 设置传输数据量大小
(设置传输总量)

以串口向电脑发送数据为例,我们可以一次性给电脑发送很多数据,具体多少由 DMA_CNDTR配置,这是一个 32 位的寄存器,一次最多只能传输 65535 个数据。

要想数据传输正确,源和目标地址存储的数据宽度还必须一致,串口数据寄存器是 8 位的,所以我们定义的要发送的数据也必须是 8 位。

外设的数据宽度由 DMA_CCRx PSIZE[1:0] 配置,可以是 8/16/32 位,存储器的数据宽度由 DMA_CCRx MSIZE[1:0] 配置,可以是 8/16/32 位。


在 DMA 控制器的控制下,数据要想有条不紊的从一个地方搬到另外一个地方,还必须正确设置两边数据指针的增量模式。

外设的地址指针由 DMA_CCRx 的 PINC 配置,存储器的地址指针由MINC 配置。


以串口向电脑发送数据为例,要发送的数据很多,每发送完一个,那么存储器的地址指针就应该加 1,而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据指针的增量模式由实际情况决定。

3、传输结束标志

数据什么时候传输完成,我们可以通过查询标志位或者通过中断的方式来鉴别。

每个 DMA 通道在 DMA 传输过半、传输完成和传输错误时都会有相应的标志位,如果使能了该类型的中断后,则会产生中断。

有关各个标志位的详细描述请参考 DMA 中断状态寄存器 DMA_ISR 的详细描述。

传输完成还分两种模式,是一次传输还是循环传输,一次传输很好理解,即是传输一次之后就停止,要想再传输的话,必须关断 DMA 使能后再重新配置后才能继续传输。循环传输则是一次传输完成之后又恢复第一次传输时的配置循环传输,不断的重复。

具体的由 DMA_CCRx 寄存器的CIRC 循环模式位控制。

相关推荐
许有杨1 小时前
STM32 的 GPIO和中断
stm32·单片机·嵌入式硬件
轩辰~1 小时前
STM32F103系列单片机寄存器操作和标准库操作
stm32·单片机·嵌入式硬件
宁酱醇1 小时前
各种各样的bug合集
开发语言·笔记·python·gitlab·bug
DKPT1 小时前
正则表达式
java·数据库·笔记·学习·正则表达式
chuxinweihui1 小时前
数据结构——二叉树,堆
c语言·开发语言·数据结构·学习·算法·链表
zhuyixiangyyds1 小时前
day36图像处理OpenCV
图像处理·笔记·学习
Mr__Miss1 小时前
JVM学习笔记
jvm·笔记·学习
周而复始 否极泰来2 小时前
深入浅出学会函数(上)
c语言·学习
ayas123192 小时前
数模学习:一,层次分析法
学习
freexyn2 小时前
Matlab自学笔记五十一:(推荐)输入参数的数量和可变数量的输入
笔记·算法·matlab