ARM-----DMA笔记

news2024/11/27 9:54:03

1.DMA简介

   DMA(Direct Memory Access) —直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数 据,但是不需要占用 CPU ,即在传输数据的时候, CPU 可以干其他的事情,好像是多线程一样。 数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH 。 DMA 控制器包含了 DMA1 DMA2 ,其中 DMA1 7 个通道, DMA2 5 个通道,这里的通道 可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量的单片机中。

2.DMA 功能框图

DMA 控制器独立于内核,属于一个单独的外设,结构比较简单,从编程的角度来看,我们只需
掌握功能框图中的三部分内容即可,具体见图 DMA 框图 DMA 控制器的框图。
2.1DMA 请求
如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求, DMA 收到请求信
号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会
启动 DMA 的传输,直到传输完毕。
DMA DMA1 DMA2 两个控制器, DMA1 7 个通道, DMA2 5 个通道,不同的 DMA
制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置,具体见 DMA 请求
2.3通道
DMA 具有 12 个独立可编程的通道,其中 DMA1 7 个通道, DMA2 5 个通道,每个通道对
应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一
个,不能同时接收多个。
2.4仲裁器
当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。
仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在 DMA_CCRx 寄存器
中设置,有 4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以
上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,
比如通道 0 高于通道 1 。在大容量产品和互联型产品中, DMA1 控制器拥有高于 DMA2 控制器的
优先级。
2.5DMA 数据配置
使用 DMA ,最核心就是配置要传输的数据,包括数据从哪里来,要到哪里去,传输的数据的单
位是什么,要传多少数据,是一次传输还是循环传输等等。
3.1
我们知道 DMA 传输数据的方向有三个:从外设到存储器,从存储器到外设,从存储器到存储器。
具体的方向 DMA_CCR 4 DIR 配置: 0 表示从外设到存储器, 1 表示从存储器到外设。这里面
涉及到的外设地址由 DMA_CPAR 配置,存储器地址由 DMA_CMAR 配置。
外设到存储器
当我们使用从外设到存储器传输时,以 ADC 采集为例。 DMA 外设寄存器的地址对应的就是 ADC
数据寄存器的地址, DMA 存储器的地址就是我们自定义的变量(用来接收存储 AD 采集的数据)
的地址。方向我们设置外设为源地址。
存储器到外设
当我们使用从存储器到外设传输时,以串口向电脑端发送数据为例。 DMA 外设寄存器的地址对
应的就是串口数据寄存器的地址, DMA 存储器的地址就是我们自定义的变量(相当于一个缓冲
区,用来存储通过串口发送到电脑的数据)的地址。方向我们设置外设为目标地址。
存储器到存储器
当我们使用从存储器到存储器传输时,以内部 FLASH 向内部 SRAM 复制数据为例。 DMA 外设寄
存器的地址对应的就是内部 FLASH (我们这里把内部 FALSH 当作一个外设来看)的地址, DMA
存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部 FLASH 的数据)
的地址。方向我们设置外设(即内部 FLASH )为源地址。跟上面两个不一样的是,这里需要把
DMA_CCR 14 MEM2MEM :存储器到存储器模式配置为 1 ,启动 M2M 模式。
2.6 要传多少,单位是什么
当我们配置好数据要从哪里来到哪里去之后,我们还需要知道我们要传输的数据是多少,数据的
单位是什么。
以串口向电脑发送数据为例,我们可以一次性给电脑发送很多数据,具体多少由 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 ,而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据
指针的增量模式由实际情况决定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320592.html

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

相关文章

computed 和 watch 的奇妙世界:让数据驱动你的 Vue 应用(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

RAG检索增强技术在知识库智能检索场景下的应用实践

如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、知识检索增强的基本概述 1.1、知识检索增强技术提出的背景 1.1.1、L…

【AD封装】2.0间距排针排母插件贴片(带3D)

包含了我们平时常用的2.0间距的排针,排母,贴片的插件的都有,总共100种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 2.0排针排母是一种电子连接器,通常用于电路板上的电子元件之间的连接。它由一…

【Python】人工智能-机器学习——不调库手撕贝叶斯分类问题

1. 作业内容描述 1.1 背景 数据集大小150该数据有4个属性,分别如下 Sepal.Length:花萼长度(cm)Sepal.Width:花萼宽度单位(cm)Petal.Length:花瓣长度(cm)Petal.Width:花瓣宽度(cm)category:类别&#xff0…

深入理解Spring Security授权机制原理

原创/朱季谦 在Spring Security权限框架里,若要对后端http接口实现权限授权控制,有两种实现方式。 一、一种是基于注解方法级的鉴权,其中,注解方式又有Secured和PreAuthorize两种。 Secured如: 1 PostMapping("…

推荐几款值得收藏的3DMAX插件

推荐几款值得收藏的3DMAX插件 StairGenerator StairGenerator一键楼梯插件,不需要花费太多的时间,轻松从2D平面图生成3D楼梯模型,生成的楼梯模型细节丰富真实。 【主要功能】 1.简单:轻松实现2D到3D建模。 2.具有最详细三维结…

六:爬虫-数据解析之BeautifulSoup4

六:bs4简介 基本概念: 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据官方解释如下: Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱…

中断响应,解决死锁的例子

对于关键字synchronized来说,如果一个线程在等待锁,那么结果只有两种情况,要么它获得这把锁继续执行,要么它就保持等待。而使用重入锁,则提供另外一种可能,那就是线程可以被中断。也就是在等待锁的过程中&a…

【Java 集合】ArrayBlockingQueue

ArrayBlockingQueue, 顾名思义: 基于数组的阻塞队列, 位于 JUC (java.util.concurrent) 下, 是一个线程安全的集合, 其本身具备了 不支持 null 元素: 存入 null 元素会抛出异常固定容量: 在初始化时需要指定一个固定的容量大小。这意味着一旦队列达到最大容量,将不再…

去除Antd组件库中上传文件中的一些默认样式

最近写的项目用到了antd组件库中的Upload了 <><Upload {...UploadProps} classNamechooseFile><Button style{{ marginRight: 8px }}>选择文件</Button></Upload><Button type"primary" onClick{upload}>开始上传</Button&g…

YOLOv8代码下载及环境配置

Github 下载YOLOv8官方代码进入Miniconda pytorch虚拟环境&#xff0c;或者用Pycharm打开文件进入虚拟环境&#xff0c;切换到YOLOv8代码目录&#xff0c;输入pip install -r requirements.txt 安装YOLOv8环境。 如果报错&#xff1a;WARNING: Ignore distutils configs in set…

高级桌面编程(一)

前言 学习心得&#xff1a;C# 入门经典第8版书中的第15章《高级桌面编程》 创建控件并设置样式 1 样式 Style WPF 当中我们可以对每一个控件进行完全的自定义。我们可以随意更改控件外观和功能。提供我们能完成这样的效果与控件的样式&#xff08;Style&#xff09;有着不可分…

OpenCV技术应用(8)— 如何将视频分解

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成热力图&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 视频是…

蚂蚁SEO强引蜘蛛是什么

强引蜘蛛在网页中是指一些特殊类型的网页&#xff0c;这些网页具有极高的吸引力和价值&#xff0c;能够吸引搜索引擎蜘蛛&#xff08;Spider&#xff09;的强烈关注和抓取。强引蜘蛛的网页通常具有以下特点&#xff1a; 如何联系蚂蚁seo&#xff1f; baidu搜索&#xff1a;如…

C++ Qt开发:ComboBox下拉组合框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ComboBox下拉组合框组件的常用方法及灵活运用…

概率论复习

第一章&#xff1a;随机概率及其概率 A和B相容就是 AB 空集 全概率公式与贝叶斯公式&#xff1a; 伯努利求概率&#xff1a; 第二章&#xff1a;一维随机变量及其分布&#xff1a; 离散型随机变量求分布律&#xff1a; 利用常规离散性分布求概率&#xff1a; 连续性随机变量…

Unity 如何通过2D Sprite切割一张图为多张

1、理解 在一些2D游戏开发中&#xff0c;我们常常使用2D Sprite把一张大图切割成多个小图使用。 这样做有不少好处&#xff0c;首先&#xff0c;通过精准使用小图&#xff0c;能够一定程度上节省内存&#xff0c;提高渲染性能。 其次把同类的小图做成一张大图在切割使用会更…

强大的数学软件 GeoGebra 多平台适用

GeoGebra 是一款教育数学软件&#xff0c;可以帮助学生和教师探索、学习和教授各种数学概念和科学领域的知识。GeoGebra 以其灵活性和强大的功能而闻名&#xff0c;它融合了几何、代数、微积分、概率、统计和其他数学领域的工具&#xff0c;以及绘图和计算功能。 功能 GeoGeb…

深度学习项目实战:垃圾分类系统

简介&#xff1a; 今天开启深度学习另一板块。就是计算机视觉方向&#xff0c;这里主要讨论图像分类任务–垃圾分类系统。其实这个项目早在19年的时候&#xff0c;我就写好了一个版本了。之前使用的是python搭建深度学习网络&#xff0c;然后前后端交互的采用的是java spring …

【开源】基于Vue和SpringBoot的天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…