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

在这里插入图片描述

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

DMA的基础知识与用法

    • 一、DMA功能框图
      • 1、DMA请求
      • 2、通道
      • 3、仲裁器
    • 二、DMA传输设置
      • 1、数据来源与数据去向
        • 外设到存储器
        • 存储器到外设
        • 存储器到存储器
      • 2、每次传输大小
      • 3、传输结束标志

CPU在板子里是个大忙人,各个外设都需要CPU操心,经常出现找不到人的情况。
在这里插入图片描述
所以为了给CPU减负,DMA应运而生。

DMA,全称Direct Memory Access,即直接存储器访问。

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
换句话说,让两个外设自己打电话。

DMA
数据
外设2
外设1
CPU

如果有了DMA,那么传输是这样的:
在这里插入图片描述

参考文章如下:
【STM32】 DMA原理,步骤超细详解,一文看懂DMA

一、DMA功能框图

笔者使用的板子是野火的指南者,MCU为STM32F103。
在开发手册中可以看到
在这里插入图片描述

  1. DMA请求
  2. 通道
  3. 仲裁器

1、DMA请求

如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。

1. 外设发送DMA请求
2. DMA发送应答信号
3. DMA收到外设应答
外设
DMA
启动DMA传输

在这里插入图片描述
DMA 有 DMA1 和 DMA2 两个控制器,DMA1 有 7 个通道,DMA2 有 5 个通道,不同的 DMA 控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置。

2、通道

DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、仲裁器

当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。

仲裁器管理 DMA 通道请求分为两个阶段。

  • 第一阶段属于软件阶段,可以在 DMA_CCRx 寄存器中设置,有 4 个等级:

    • 非常高

    • 在这里插入图片描述
      在这里插入图片描述
  • 第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。

在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

二、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.mzph.cn/pingmian/57446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?

以下是一种在Verilog设计的磁盘阵列控制器中实现不同RAID级别(以RAID 0和RAID 1为例)切换的方法: 添加控制信号 在磁盘阵列控制器模块中添加一个输入信号,例如raid_mode,用于选择RAID模式。假设raid_mode = 0表示RAID 0模式,raid_mode = 1表示RAID 1模式。module raid_co…

前端算法:堆

目录 一、堆 1.堆是什么? 2.堆的性质 3.堆的实现 4.基本操作 5.时间复杂度 二、代码实现 1.最大堆实现 2.最小堆实现 一、堆 1.堆是什么? 堆能用树来表示,并且一般树的实现都是通过链表,而二叉堆是一种特殊的堆&#xf…

GO基础(string相关)

本博文包含了18个小内容,有判断字符串是否以另一个字符串开头、字符串包含关系判断、4、判断非ASCII编码字符、字符串替换、统计字符串出现的次数、重复字符串、修改字符串大写、修改字符串小写、剔除字符串开头和结尾的空白符号、剔除指定字符、剔除开头字符串、剔…

Lua环境安装

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua是一种轻量级、小巧且易于嵌入应用程序的脚本语言,广泛用于游戏开发、Web开发、自动化脚本等领域。本文将详细介绍如何在不同操作系统上安装L…

蓝桥杯注意事项

蓝桥杯注意事项 比赛注意事项 能暴力枚举就暴力枚举,能用简单的思路做就尽量用简单的思路做。认真审核题目的题意和输入输出的要求,避免因为误解题意而导致题目错误。对于提供多组测试样例或者需要对一个过程重复进行循环的代码,要时刻记住…

六大设计原则之一——单一职责原则

单一职责原则 面向对象三大特性之一的 封装 指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的 单一职责原则(Single Responsibility Principle - SRP),就是对一个类而…

【硬啃Dash-Fastapi-Admin】03-requirements-pg.txt 速览

文章目录 dash2.18.1 纯Python的Web应用框架Python Dash库的功能介绍和用法示例功能介绍用法示例 Flask-Compress1.15 Flask响应数据的压缩功能介绍用法示例注意事项 feffery-antd-charts0.1.0rc5 数据可视化组件库功能介绍用法示例 feffery-antd-components0.3.8 Dash 第三方组…

autMan奥特曼机器人-实时翻译的用法

一、基本配置 访问并登录百度翻译开放平台:https://api.fanyi.baidu.com/ 进入开发者信息获取 APP ID和密钥,并开通“通用文本翻译”服务 autMan应用市场->我的->找到“实时翻译”插件安装后去点击“配参” 二、使用示例 假如你和一个俄国人聊…

C程序设计语言精髓 单向链表

目录 单向链表---定义 单向链表---建立 单向链表---删除 单向链表---插入​ 单向链表---输出​ 单向链表---定义 单向链表---建立 单向链表---删除 单向链表---插入 单向链表---输出

Visual Studio安装图文详解教程

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍 Visual Studio 社区版的安装过程及其注意事项。 Visual Studio简介 Visual Studio 社区版功能完备且可扩展的免费 IDE,可用于创…

centos配置ssh

在CentOS上配置SSH服务主要步骤: 安装OpenSSH服务器: 首先,你需要确保OpenSSH服务器软件包已经安装在你的系统上。你可以使用以下命令来安装它: sudo yum update sudo yum install openssh-server 启动SSH服务: 安装完…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节:Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…

如何减小 Maven 项目生成的 JAR 包体积 提升运维效率

在使用 Maven 构建 Java 项目时,有时需要减小生成的 JAR 包的体积,以提高部署效率或减少资源消耗。以下是一些有效的方法来减小 JAR 包的体积: 排除不必要的依赖打包时,依赖jar包独立于应用jar包 1. 排除不必要的依赖 通过排除项目…

【15】协方差

在Excel数据分析中,协方差是用于衡量两个变量之间的线性关系的统计量。它可以帮助你判断两个变量是否同向变化(正协方差)或反向变化(负协方差)。协方差的计算结果可以用于进一步分析变量之间的关系,尤其是在投资组合、回归分析和其他多元分析中有着广泛的应用。 1. 什么…

神策数据客户旅程 GPT:以 AI 驱动客户旅程及埋点落地

数据驱动时代,随着 AI 在数据处理及分析方面的能力日渐强大,将二者结合,可以帮助企业效能提升,获取更多商业价值。 我们在 AI 大模型探索过程中发现,产品经理、技术人员、市场营销人员以及需要数据驱动决策的团队&…

基于opencv的人脸闭眼识别疲劳监测

1. 项目简介 本项目旨在实现基于眼部特征的眨眼检测,通过监测眼睛开闭状态来计算眨眼次数,从而应用于疲劳监测、注意力检测等场景。使用了面部特征点检测算法,以及眼部特征比率(EAR, Eye Aspect Ratio)来判断眼睛的闭…

mysql查询id不在列表中的记录

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…

C语言汇编概述

汇编语言是一种低级编程语言,它允许程序员直接与计算机的硬件交互。在C语言中,汇编语言通常用于执行特定的硬件操作、优化关键代码段以提高性能,或者实现C语言标准库中未提供的功能。C语言提供了内联汇编的功能,使得程序员可以在C…

可观测日北京|观测云:可观测性需要做到“三个一”

2024年10月,备受期待的中国可观测日「北京站」圆满落幕。本次活动汇聚了来自云计算、技术创新等领域的专家,探讨了探讨了可观测性在云计算和数字化转型中扮演的角色。观测云也在活动展示了作为可观测性行业领袖的技术力和创新力。 观测云技术亮点&#…

python画图|坐标轴显隐设置

【1】引言 前序学习中,已经发现坐标轴的显示具有至关重要的影响,因此今天继续探索相关技巧:坐标轴显隐设置。 前序学习内容可通过下述链接直达: python画图| 对齐图名和标签-CSDN博客 【2】官网教程 点击下方链接可以直达官网…