stm32入门-----DMA直接存储器存取(上——理论篇)

目录

前言

DMA

 1.简介

2.存储器映像

3.DMA结构

4.数据宽度与对齐 

5.DMA工作示例


前言

        本期我们就开始学习DMA直接存储器存取,DMA是一个数据装运的小助手,执行数据的搬运处理,减少了CPU的负担,在stm32中担当重要的工作。在前面学习ADC的时候我们就提及过这个,那么本期就正式开始学习DMA,先从理论部分入手,下一期我们就进行关于DMA的相关项目实操。(视频:[8-1] DMA直接存储器存取_哔哩哔哩_bilibili)

DMA

 1.简介

  • DMADirect Memory Access)直接存储器存取
  • DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
  • 12个独立可配置的通道: DMA17个通道), DMA25个通道)
  • 每个通道都支持软件触发和特定的硬件触发

STM32F103C8T6 DMA资源:DMA17个通道)

 

2.存储器映像

        存储器分为大类,分为ROM和RAM,其中ROM是一种掉电不丢失数据的存储器,而RAM是一种掉电就丢失数据的存储器,其实很类似我们的电脑ROM类似为硬盘里面的数据,RAM类似为电脑内存存储的临时数据。

类型

起始地址

存储器

用途

ROM

0x0800 0000

程序存储器Flash

存储C语言编译后的程序代码

0x1FFF F000

系统存储器

存储BootLoader,用于串口下载

0x1FFF F800

选项字节

存储一些独立于程序代码的配置参数

RAM

0x2000 0000

运行内存SRAM

存储运行过程中的临时变量

0x4000 0000

外设寄存器

存储各个外设的配置参数

0xE000 0000

内核外设寄存器

存储内核各个外设的配置参数

3.DMA结构

下面是DMA的整体框架,这里我们可以看出是有三个DMA的(但是我们使用的STM32F103C8T6只有一个DMA1),这里的DMA是通过一个总线来去访问各个存储器的内容,但是总线是只有一个的,所以当出现多个通道都需要去访问的时候,不可能都去挤这一个总线,这时候有一个仲裁器去判断哪个通道优先去执行,类似于中断的优先级。

 下图是DMA的基本结构,DMA的搬运方向是可以分为三个,分别是外设到存储器,存储器到外设,存储器到存储器。下面还有一个计数器,这个计数器是一个自减的计数器,是一个搬运次数计数意思是当开始设定一个数字这个数字减少到0的时候搬运就结束,后面还有一个自动重装,当我们开启自动重装的时候,计数器的值就会回归到我们开始设定的那个数字,然后就开始数据搬运的操作。下面还有一个触发方式的选择,M2M选择1的话是软件触发,选择0是硬件触发,软件触发一般用于存储器到存储器的数据搬运,比如程序里面的数组赋值到另外一个数组,二硬件触发一般用于外设到存储器之间的数据搬运,因为硬件触发要考虑到外设的触发条件,比如ADC转换结束或者中断等等。

         下面可以看出对于硬件触发的并不是每一个通道的都是一样的,是这个通道有特定的硬件信号才能触发。

4.数据宽度与对齐 

 这里就涉及到起始和目标二者之间数据宽度的问题,如果是二者的宽度都是一样的,比如8位,那么传输的话就会一一对应传输;如果起始的数据比目标的位宽要小,那么传输到目标后的数据是右对齐的方式,也就是高位的补零;如果起始的数据比目标的要大,那么传输到目标的数据是舍弃掉高位的数据。

5.DMA工作示例

(1)数据转运+DMA

下面是数据的转运,也就是把一个数据变量的值复制到另一个变量那里去,入下面所示,把第一个数组A复制到另外一个数组B,这里没有涉及到了相关外设条件,所以是用最快的方式来去进行也就是软件触发,另外就是需要执行7次,在转运的过程中还需要去对地址进行移位的操作,类似于指针地址移位,其实就是我们常见的数组++,要想实现下面一一对应的赋值,起始数组和目标数组都需要执行地址++操作。

(2)ADC扫描模式+DMA

下面是ADC扫描模式通过DMA来去搬运转换好的数据。在上一期我们就说过ADC的规则组的数据寄存器是只能存储一个转换结果的,但是列表中是有多个通道要进行转换,那么如果不及时拿走上一个通道转换的结果,那么下一个通道转换的结果就会覆盖掉上一个的值,所以这里就需要DMA来去搬运这些转换好的结果,每一个通道转换后切换到另外一个通道的时候,中间是可以继续DMA搬运操作的,所以ADC扫描模式和DMA就可以实现完美的配合操作,每完成一个转换,DMA就可以把这个结果拿走存起来,然后数据寄存器就可以继续放下一个通道转换的结果。 

以上就是本期的全部内容了,我们下次见!

今日壁纸:

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

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

相关文章

pypi如何上传自己的代码记录

目录 一. 注册pypi账号并创建token 1. 注册pypi账号并创建token 2. Pypi账号注册 3. 邮箱验证 ​编辑 4. 重新生成恢复代码 5. 输入账号密码 ​编辑 6. 保存code并继续 ​编辑7. 输入一行即可,然后点击verify 8. 点击左方目录内的account setting&#xff…

基于微信小程序的高校排课系统 /基于微信小程序的排课管理系统/课程管理系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

爱快路由的dns强制客户端代理真是个强大的功能

大致情况是这样的:同事说在linux服务器/etc/resolv.conf上随便写个IP地址【不在线的】,dns地址也能解析,让我帮忙查查。 我看了下也感觉纳闷,试了下不光在服务器上,我本地的pc随便设置了个dns解析也是一样的。 通过wir…

解决Qt6 error: The kit needs to define a CMake tool to parse this project.

cmake对于Qt6来说很重要,所以学会cmake是必须的。 上述错误,就是我在Windows10下运行cmake项目总是报错的一个问题。 明明路径已经配好了,却总是报错。 具体原因可能和cmake的版本,以及是否设置为默认有关。另外也和QtCreator中…

飞凌全志T527开发板实现局域网内文件传输功能

之前玩开发板的时候,如果需要实现主机与开发板之间的文件传输,通常是通过挂载NFS的方式,而飞凌的OKT527板载WIFI,并且官方提供的镜像中已经将其成功驱动,那我们就可以通过WIFI连接家中的路由器的方式,实现局…

【Redis】Centos7 安装 redis(详细教程)

查看当前 Redis 版本: 当前的 redis 版本太老了,选择安装 Redis5。 一、使用 yum 安装 1、首先安装 scl 源 yum install centos-release-scl-rh 由于我之前已经安装过了,所以加载速度比较快,且显示已经安装成功,是最…

MongoDB整合SpringBoot

文章目录 SpringBoot整合MongoDB环境准备文档操作相关注解创建实体添加文档查询文档更新文档删除文档 小技巧:如何去掉_class属性 SpringBoot整合MongoDB https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.nosql.mongodb.repositor…

prompt技巧(2) - 如何解决对话过程中角色反转问题

在一些角色扮演场景下,需要大模型扮演某个角色进行对话,但是在对话过程中偶尔会发生角色反转问题,如大模型扮演客户角色与销售人员进行对话,大模型有时会忘记自己身份,突然以销售人员的身份进行回答,这种情…

ubuntu上部署vue项目到ngixn中+SpringBoot项目+postgresql数据库

文章目录 前提1.Ubuntu上安装ngix2.部署Vue项目2.1上传vue项目2.2.配置 3.Ubuntu上安装Postgres4.部署springboot项目 前提 记一次在ubuntu部署前端vue和后端springboot项目,以及数据库postgresql的安装以及启动、停止等常用的命令。 1.Ubuntu上安装ngix 1、检查…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台,旨在通过模拟真实的网络环境和攻击场景,提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点: 实战演练: 提供各种网络安全攻防演练场景&#…

yolo模型训练出的.pt文件过大

当我们使用yolov8训练时候,保存的模型变大,如下图: 原模型 训练出来的模型 经过仔细调查,发现是保存的模型中多了很多数据。 原模型 训练出来的模型 只需要把文件中.pt文件读取,重写一遍保存。 from ultralytics im…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师,对JVM及其字节码有着深入的理解。现在&#xf…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep (秒)& usleep(微秒) sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git(git版本控制器) git的主要…

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz,如果…

业绩增长新引擎:智能名片如何助力销售突破

01、智能名片,营销增长利器 在当今竞争激烈的市场环境下,企业正面临着类似品牌曝光不足、销售线索获取困难、客户关系维护复杂等诸多挑战。为帮助企业解决相关难题,促进业绩高效增长,纷享营销通的 智能名片 应运而生&#xff0…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

DB-gpt + one-api + kimi-free-api 真香

# 1. 新建文件夹 one-api 和 子目录 mkdir -p /docker/one-api/data# 运行容器one-api docker run --name one-api -d --restart always -p 3333:3000 \ -e TZAsia/Shanghai -e REDIS_CONN_STRINGredis://192.168.0.3:6379 -e SYNC_FREQUENCY60 -e SQL_DSNroot:123456tcp(192.1…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

极限两边夹定理

极限两边夹定理 1. 定义 两边夹定理 (又称作夹逼定理) 说的是&#xff0c;如果一个函数 f f f 被夹在函数 g g g 和函数 h h h 之 间&#xff0c;当 x → a x \rightarrow a x→a 时&#xff0c;这两个函数 g g g 和 h h h 都收敛于同一个极限 L L L&#xff0c;那么当…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理