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

news/2025/1/16 16:00:30/

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

DMA的基础知识与用法

    • 二、DMA传输设置
      • 1、数据来源与数据去向
        • 外设到存储器
        • 存储器到外设
        • 存储器到存储器
      • 2、每次传输大小
      • 3、传输结束标志

DMA_4">二、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 循环模式位控制。
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1563650.html

相关文章

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址(Internet Protocol Address)是指互联网协议地址。 它是分配给连接到互联网的设备(如计算机、服务器、智能手机…

lqb.key按键全套

#include "stc15.h" #define FOSC 11059200L //#define T1MS (65536-FOSC/1000) //1T模式 #define T1MS (65536-FOSC/12/1000) //12T模式typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32;#define LY 1 //…

C语言数据结构与算法(排序)详细版

大家好,欢迎来到“干货”小仓库!! 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!无人扶我青云志,我自踏雪至山巅!!&am…

微调的种类

微调的种类 flyfish 全参数微调(Full Fine-Tuning): 对预训练模型的所有参数进行调整,以优化其在特定任务上的性能。 指令微调(Instruction Fine-Tuning): 通过提供特定任务的明确指令或示例来…

C语言| 求两个整数的最小值

C语言| 无参函数、有参函数、形参、实参 C语言| 函数声明、函数的返回值 【程序代码】 #include <stdio.h> //主函数&#xff0c;有且只有一个 int main(void) { int Min(int x, int y); //对Min函数的声明&#xff0c;x,y为形参 int a 111, b 222; pri…

虚拟线程JDK与Spring Core Reactor

两种虚拟线程对比&#xff1a;JDK vs. Spring Core Reactor性能对比 1、基于 JDK 的虚拟线程实现&#xff1a; 摘自实际代码&#xff1a; public static void withFlatMapUsingJDK() { ... var virtualThreadExecutor Executors.newThreadPerTaskExecutor( Thread .ofVirtual…

Docker Desktop 中安装 MySQL 并开启远程访问的详细教程

是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程&#xff1a; 一、安装 MySQL 容器 拉取 MySQL 镜像&#xff1a; docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL&#xff0c;可以将 latest 替换为具体…

UML系列之Rational Rose笔记九:组件图

一、新建组件图 二、组件图成品展示 三、工作台介绍 最主要的还是这个component组件&#xff1b; 然后还有这几个&#xff0c;正常是用不到的&#xff1b;基本的使用第四部分介绍一下&#xff1a; 四、基本使用示例 这些&#xff0c;主要是运用package还有package specifica…