DMA简介

news2025/1/19 20:39:05

DMA是一个数据转运小助手, 它主要是用来协助CPU,完成数据转运的工作

第一个程序: 在这个程序里,我们将使用DMA,进行存储器到存储器的数据转运, 也就是把一个数组里面的数据, 复制到另一个数组里

DMA简介

DMA外设, 是可以直接访问STM32内部的存诸器的, 包括运行内存SRAM, 程序存储器Flash和寄存器等等

DMA可以提供外设(一般是外设的数据寄存器DR, DataRegister, 比如ADC的数据寄存器, 串口的数据寄存器等等)和存储器(指的就是是运行内存SRAM和程序存储器Flash, 是我们存储变量数组和程序代码的地方)或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源

DMA有12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道), 这个通道就是数据转运的路径, 从一个地方移动到另一个地方, 就需要占用一个通道, 如果有多个通道进行转运, 那它们之间可以各转各的, 互不干扰

每个通道都支持软件触发和特定的(意思就是每个DMA的通道, 它的硬件触发源是不一样的, 你要使用某个外设的硬件触发源, 就得使用它连接的那个通道, 而不能任意选通道)硬件触发

这里如果DMA进行的是存储器到存储器的数据转运, 比如我们想把Flash里的一批数据, 转运到SRAM里去, 那就需要软件触发了,使用软件触发之后, DMA就会一股脑地,把这批数据, 以最快的速度 全部转运完成, 那如果DMA进行的是外设到存诸器的数据转运, 就不能一股脑地转运了, 因为外设的数据是有一定时机的, 所以这时我们就需要用硬件触发,比如转运ADC的数据, 那就得ADC每个通道AD转换完成后, 硬件触发一次DMA, 之后DMA再转运, 触发一次,转运一次

STM32F103C8T6 DMA资源:DMA1(7个通道)

STM32的存储器映像

起始地址存储器用途
0x0800 0000程序存储器Flash(ROM)存储C语言编译后的程序代码
0x1FFF F000系统存储器(ROM)存储BootLoader,用于串口下载(下一节讲串口)
0x1FFF F800选项字节(ROM)存储一些独立于程序代码的配置参数
0x2000 0000运行内存SRAM(RAM)存储运行过程中的临时变量(也就是我们在程序中定义变量、 数组、结构体的地方)
0x4000 0000外设寄存器(RAM)存储各个外设的配置参数(也就是我们初始化各个外设, 最终所读写的东西)
0xE000 0000内核外设寄存器(RAM)存储内核各个外设(内核外设就是NVIC和SysTick, 因为内核外设和其他外设不是一个厂家设计的, 所以它们的地址也是被分开了)的配置参数

从下面这个图总结出来的

image-20241207153038629

在上面这个图里,有灰色填充的, 就是Reserved区域,也就是保留区域,没有使用到, 然后这个0地址,实际上也是没有存储器的,它这里写的是别名到Flash或者系统存储器,取决于BOOT引脚, 因为程序是从0地址开始运行的, 所以这里需要把我想要执行的程序, 映射到0地址来,如果映射在Flash区,就是从Flash执行, 如果映射在系统存储器区, 就是从系统存储器运行BootLoader, 如果映射到SRAM,就是从SRAM启动, 怎么选择就是由BOOT0和BOOT1两个引脚来决定, 这就是0地址里的别名区, 接着剩下的0800开始的Flash区, 用于存储程序代码

在这个表里, 无论是Flash, 还是SRAM, 还是外设寄存器, 它们都是存储器的一种, 包括外设寄存器, 实际上也是存储器 ,我们前面这里说的是外设到存储器, 存储器到存储器, 本质上其实都是存储器之间的数据转运,说成外设到存储器,只不过是STM32他特别指定了可以转运外设的存储器而已

0x0800开头, 那你就可以确定, 它是属于主闪存的数据

系统存储器和选项字节的存储介质一般也是Flash, 只不过是我们一般说Flash指的是主闪存Flash, 而不指这两块区域

选项字节里 存的主要是Flash的读保护, 写保护, 还有看门狗等等的配置

外设寄存器的存储介质其实也是SRAM, 只不过我们喜欢把运行内存叫SRAM, 外设寄存器就直接叫寄存器了

STM32的寻址能力是4GB, 而我们STM32的存储器都是KB级别的, 所以这个4GB的寻址空间, 会有大量的地址都是空的, 地址使用率还不到1%

DMA硬件电路图

Snipaste_2024-12-07_15-55-52

总共就是CPU和存储器这两个东西

一方面, CPU可以对寄存器进行读写, 就像读写运行内存一样, 另一方面, 寄存器的每一位背后, 都连接了一根导线, 这些导线可以用于控制外设电路的状态, 比如置引脚的高低电平, 导通和断关, 切换数据选择器, 或者多位组合起来, 当做计数器、 数据寄存器, 等等等等, 所以寄存器是连接软件和硬件的桥梁, 软件读写寄存器,就相当于在控制硬件的执行

使用DMA进行数据转运, 都可以为一类问题, 就是从某个地址取内容, 再放到另一个地址去, 为了高效有条理地访问存储器, 这里设计了一个总线矩阵, 总线矩阵的左端, 是主动单元, 也就是拥有存储器的访问权, 右边这些,是被动单元, 它们的存储器只能被左边的主动单元读写, 主动单元这里, 内核有DCode和系统总线, 可以访问右边的存储器, 其中DCode总线是专门访问Flash的, 系统总线是访问其他东西的, 另外, 由于DMA要转运数据,所以DMA也必须要有访问的主动权, 那主动单元 除了内核CPU, 剩下的就是DMA总线了, 这里DMA1有一条DMA总线, DMA2也有一条DMA总线, 下面这还有一条DMA总线, 这是以太网外设自己私有的DMA, 这个可以不用管的, 在DMA1和DMA2里面, 可以看到 DMA1有7个通道, DMA2有5个通道, 各个通道可以分别设置它们转运数据的源地址和目的地址, 这样它们就可以各自独立地工作了, 接着下面这里有个仲裁器,这个是因为,虽然多个通道可以独立转运数据, 但是最终DMA总线只有一条, 所以所有的通道都只能分时复用这一条DMA总线, 如果产生了冲突, 那就会由仲裁器,根据通道的优先级, 来决定谁先用, 谁后用, 另外在总线矩阵这里,也会有个仲裁器, 如果DMA和CPU都要访问同一个目标, 那么DMA就会暂停CPU的访问,以防止冲突, 不过总线伸裁器, 仍然会保证CPU得到一半的总线带宽, 使CPU也能正常的工作, 下面这里是AHB从设备, 也就是DMA自身的寄存器, 因为DMA作为一个外设, 它自己也会有相应的配置寄存器, 这里连接在了总线右边的AHB总线上, 所以DMA, 即是总线矩阵的主动单元, 可以读写各种存储器, 也是AHB总线上的被动单元, CPU通过下面这一条线路,就可以对DMA进行配置了

Snipaste_2024-12-07_16-18-23

接着继续看这里, 是DMA请求, 请求就是触发的意思, 这条线路右边的触发源,是各个外设

Snipaste_2024-12-07_16-21-17

所以这个DMA请求就是DMA的硬件触发源, 比如ADC转换完成, 串口接收到数据, 需要触发DMA转运数据的时候, 就会通过这条线路, 向DMA发出硬件触发信号, 之后DMA就可以执行数据转运的工作了

再讲一个小问题, 就是这里的Flash, 它是ROM只读存诸器的一种, 如果通过总线直接访问的话, 无论是CPU, 还是DMA, 都是只读的,只能读取数据,而不能写入, 如果你DMA的自的地址, 填了Flash的区域, 那转运时, 就会出错, 当然Flash也不是绝对的不可写入, 我们可以配置这个Flash接口控制器, 对Flash进行写入, 这个流程就较麻烦了。 要先对Flash按页进行擦除,再写入数据(去年OS里面SSD这一章节), 然后SRAM是运行内存, 可以任意读写, 没有问题, 外设寄存器的话, 得看参考手册里面的描述, 有的寄存器是只读的, 有的寄存器是只写的, 不过我们主要用的是数据寄存器,数据寄存器都是可以正常读写的

DMA代码流程图

Snipaste_2024-12-07_17-07-42
当M2M位给0, 那就是使用硬件触发了, 硬件触发源可以选择ADC, 串口, 定时器等等, 使用硬件触发的转运,一般都是与外设有关的转运, 这些转运需要一定的时机, 比如ADC转换完成, 串口收到数据、 定时时间到等等, 所以需要使用硬件触发, 在硬件达到这些时机时, 传一个信号过来, 来触发DMA进行转运

然后最后, 就是开关控制了, 也就是DMA_Cmd函数, 当给DMA使能后, DMA就准备就绪, 可以进行转运了, DMA进行转运,有几个条件, 第一, 就是开关控制, DMA_Cmd必须使能, 第二, 就是传输计数器必须大于0, 第三, 就是触发源, 必须有触发信号, 触发一次,转运一次, 传输计数器自减一次,当传输计数器等于0, 且没有自动重装时, 这时无论是否触发, DMA都不会再进行转运了, 此时就需要DMA_Cmd,给DISABLE, 关闭DMA, 再为传输计数器写入一个大于0的数, 再DMA_Cmd,给ENABLE, 开启DMA, DMA才能继续工作, 注意一下,写传输计数器时,必须要先关闭DMA,再进行(这是手册里面的规定)

DMA请求

就是上面DMA触发(软硬触发部分)的部分, 下面这张图就是DMA1的请求映像

image-20241207190511669

下面是DMA的7个通道, 每个通道都有一个数据选择器, 可以选择硬件触发或软件触发

这里这个图不好理解

他把EN位画在了数据选择器的侧边, 一般数据选择器的侧边是输入选择控制位, 难道这里的意思是, EN给1, 选择硬件触发, EN给0, 选择软件触发吗?那显然不对, 而且它左边这里写的是软件触发(MEM2MEM位 == M2M), 难道M2M位是软件触发吗?

所以给这个图重新布了个局, 就上一章节的图, M2M位是数据选择器的控制位, 用于选择是硬件触发还是软件触发, EN位是开关控制, EN=0时不工作, EN=1时工作, 这样就好理解了

他那里这样画的意思是, EN并不是数据选择器的控制位而且决定这个数据选择器要不要工作, EN=0, 数据选择器不工作, EN=1, 数据选择器工作, 然后软件触发后面跟个M2M位的意思应该是, 当M2M位=1时选择软件触发

那然后继续看左边的硬件触发源, 这里是外设请求信号, 可以看到, 每个通道的硬件触发源都是不同的, 如果你需要用ADC1来触发的话那就必须选择通道1, 如果需要定时器2的更新事件(TIM2_UP)来触发的话,那就必须选择通道2

因为每个通道的硬件触发源都不同, 所以如果你想使用某个硬件触发源的话, 就必须使用它所在的通道, 而如果使用软件触发的话,那通道就可以任意选择了, 因为每个通道的软件触发都是一样的,所以在PPT的这前面,写的是, 每个通道都支持软件触发和特定的硬件触发,这就是特定的意思, 选择硬件触发是要看通道的

那到底是选哪个触发源呢?

这个是对应的外设是否开启了DMA输出来决定的, 比如你要使用ADC1, 那会有个库函数叫ADC_DMACmd, 必须使用这个库函数开启ADC1的这一路输出, 它才有效

image-20241207191926787

所以, 这三个触发源,具体使用哪个, 取决于你把哪个外设的DMA输出开启了, 如果3个都开启了 那这边是一个或门, 理论上3个硬件都可以进行触发,不过一般情况下我们都是开启其中一个

之后, 这7个触发源, 进入到仲裁器, 进行优先级判断, 最终产生内部的DMA1请求, 这个优先级的判断类似于中断的优先级, 默认优先级是通道号越小优先级越高, 当然也可以在程序中配置优先级

数据宽度与对齐

如果数据宽度都一样, 那就是正常的一个个转运, 如果两个数据宽度不一样,那会怎么处理呢

Snipaste_2024-12-07_19-28-52

下面这个表就是来说明这个问题的

image-20241207192939429

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

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

相关文章

liunx docker 部署 nacos seata sentinel

部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL…

计算机视觉与各个学科融合:探索新方向

目录 引言计算机视觉与其他学科的结合 与医学的结合与机械工程的结合与土木工程的结合与艺术与人文的结合发文的好处博雅知航的辅导服务 引言 计算机视觉作为人工智能领域的重要分支,正迅速发展并渗透到多个学科。通过与其他领域的结合,计算机视觉不仅…

电阻计RM3544、RM3545的使用

目录: 一、电阻计与PC通讯 1、硬件连接 2、RmLogger.exe的使用 二、RM3545测量35uΩ电阻 一、电阻计与PC通讯 1、硬件连接 可以设置USB或COM口(串口)连接PC,也可以设置为“打印”输出。 1)使用USB连接PC 2)使用串口连接PC …

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么? JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…

Mybaits的优点缺点?

大家好,我是锋哥。今天分享关于【Mybaits的优点&缺点?】面试题。希望对大家有帮助; Mybaits的优点&缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 是一个优秀的持久层框架,通常用于 Java 应用程序中&…

gulp应该怎么用,前端批量自动化替换文件

背景 最近公司准备把所有项目中用到的国际化相关的key规范化,原因是: 一直以来公司的app和web端 在针对相同的需求以及相同的国际化语言,需要设置不同的两份国际化文件,难以维护旧版的国际化文件中,存在的大量值重复&#xff0c…

POI遍历行所有单元格的两种方式,getPhysicalNumberOfCells方式有问题,勿用

今天看POI源码的时候&#xff0c;发现HSSFWorkbook类型的工作簿&#xff0c;行数据是用TreeMap<Integer, HSSFRow>存储的&#xff0c;列数据是用HSSFCell[]数组来存的&#xff1b;XSSFWorkbook类型的工作簿&#xff0c;行数据是用SortedMap<Integer, XSSFRow>存储的…

NUMA-非统一内存访问架构

NUMA&#xff08;Non-Uniform Memory Access&#xff09; 是一种计算机内存架构&#xff0c;主要用于多处理器系统。NUMA架构中的每个处理器都连接到自己的本地内存&#xff0c;并且可以访问其他处理器的内存&#xff0c;但访问其他处理器的内存速度较慢。 内核通过调度优化进…

WPF+LibVLC开发播放器-LibVLC在C#中的使用

LibVLC在C#中的使用 安装包Nuget使用控件使用播放器初始化加载视频文件 视频教程&#xff1a; 使用WPFLibVLC快速开发一个播放器 安装包Nuget 安装下面两个包,必须安装两个 一个是相关框架对应的包&#xff0c;Winform就安装LibVLCSharp.Winform;WPF就安装LibVLCSharp.WPF&am…

用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配?用GPT开发嵌入式

用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配&#xff1f;AI写代码 大家好,我是小杰学长 如果你是大学生 遇到电子技术 学习 成长 入行难题 我曾经通过大学比赛赚钱 从事嵌入式AI 航天军工 用特别的学习和求职方法线下半年带50学弟学妹入行开发 主页佳喔威信&…

基于Java Springboot在线招聘APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

动力商城-05 阿里云短信服务

1.添加依赖 <dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.24</version></dependency>2.控制层 Api(tags "短信业务接口管理") RequestMapping("p/sms&…

深入解析 HTML Input 元素:构建交互性表单的核心

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HAMR技术进入云存储市场!

2024年12月3日&#xff0c;Seagate宣布其Mozaic 3系列HAMR&#xff08;热辅助磁记录&#xff09;硬盘获得了来自一家领先云服务提供商&#xff08;可能AWS、Azure或Google Cloud其中之一&#xff09;以及其他高容量硬盘客户的资格认证。 Seagate的Mozaic 3技术通过引入热辅助磁…

图数据库 | 12、图数据库架构设计——高性能计算架构

在传统类型的数据库架构设计中&#xff0c;通常不会单独介绍计算架构&#xff0c;一切都围绕存储引擎展开&#xff0c;毕竟存储架构是基础&#xff0c;尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地&#xff0c;在图数据库架构设计中&#xff0c;项目就围绕存储的方…

【工具变量】地级市城市全社会用电量数据(2006-2021年)

一、数据范围&#xff1a;覆盖中国300多个地级市 二、包含指标&#xff1a; 省份、地级市、年份、全社会用电量。 三、数据来源&#xff1a;国家电网查询数据。对于极大部分城市&#xff0c;国网售电量就是全社会用电量(往年的售电量和全社会用电量数据相同&#xff09;,此外…

请求响应:常见参数接收及封装(数组集合参数及日期参数)

数组参数 在前端页面的表单中&#xff0c;存在复选框元素&#xff0c;当提交表单到后端的时候&#xff0c;会将复选框中的全部内容提交到后端进行处理&#xff0c;由于复选框中往往存在很多数据&#xff0c;并且同复选框中数据名称相同&#xff0c;这样的请求参数叫做数组参数…

兔子的寿命有多长?

在宠物的世界里&#xff0c;兔子以其灵动的身姿、柔软的皮毛和温顺的性格深受人们喜爱。然而&#xff0c;当我们满心欢喜地将兔子迎进家门时&#xff0c;可曾想过它们能陪伴我们多久&#xff1f;兔子的寿命&#xff0c;是一个值得深入探讨的话题&#xff0c;它不仅关乎生命的时…

本地多卡(3090)部署通义千问Qwen-72B大模型提速实践:从龟速到够用

最近在做文本风格转化&#xff0c;涉及千万token级别的文本。想用大模型转写&#xff0c;在线的模型一来涉及数据隐私&#xff0c;二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限&#xff0c;正好实验室给俺配了4卡3090的机子&#xff0c;反正也就是做个推理&#…

鸿蒙开发——键值型数据库的基本使用与跨设备同步

1、简 述 ❓ 什么是键值型数据库 键值型数据库&#xff08;KV-Store&#xff09;是一种非关系型数据库&#xff0c;其数据以“键值”对的形式进行组织、索引和存储&#xff0c;其中“键”作为唯一标识符。 键值型数据库适合很少数据关系和业务关系的业务数据存储。 另外&#…