stm32入门教程--DMA 超详细!!!

目录

简介

工作模式

1、数据转运+DMA

2、ADC扫描模式+DMA


简介

工作模式

1、数据转运+DMA

  这个例子的任务是将SRAM的数组DataA,转运到另一个数组DataB中,这个基本结构里的各个参数应该如何配置呢?

 首先是外设站点和存储器站点的起始地址、数据宽度、地址是否自增这三个参数,

在这个任务中,外设地址显然应该填DataA数组的首地址,存储器地址给DataB的地址,然后数据宽度,两个数组的类型都是uint8_t,,所以数据宽度都是按8位的字节传输

 我们想要的效果是DataA[0]转运到Data[0],DataA[1]转运到DataB[1],两个数组一一对应,所以转运完DataA[0]和DataB[0]之后,两个站点的地址都应该自增,都移动到下一个数据的位置,继续转运DataA[1]和DataB[1]这样来进行,如果左右都不自增,那就一直是DataA[0]转到DataB[0]其他数据不变。

 下一个数据是方向参数,显然就是外设站点转运到存储器站点了,如果想把DataB转运到DataA,可以把方向参数换过来,这样就是反向转运了

  然后就是传输计数器和是否要自动重装,这里显然幺转运7次,所以传输计数器给7,自动重装暂时不需要,之后触发选择部分 ,这里我们要选择软件触发 ,因为这里是存储器到存储器的数据转运 ,是不需要等待硬件时机的,尽快转运完成就行了 ,最后调用DMA_Cmd,给DMA使能,这样数据就会从DataA转运到DataB了 ,转运7次之后,传输计数器自减到0,DMA停止,转运完成 ,这里的数据转运是一种复制转运,转运完成后DataA的数据并不会消失,这个过程相当于把DataA的数据复制到了DataB的位置 这就是第一个存储器到存储器的数据转运 。

2、ADC扫描模式+DMA

  左边是ADC扫描的全部流程,这里有7个通道,触发一次之后,七个通道依次进行AD转换然后转换结果都放到ADC_DR数据寄存器里面 ,那我们要做的就是,在每个单独的通道转换完成之后,进行一次DMA数据转运,并且目的地址进行自增,这样数据就不会被覆盖,所以这里DMA的配置就是外设地址,写入ADC_DR这个寄存器的地址,寄存器的地址,可以在SRAM中定义的一个数组ADvalue然后把ADvalue的地址当作存储器的地址 ,之后数据宽度 ,因为ADC_DR和SRAM数组 ,我们要的都是uint16_t的数据,所以数据宽度都是16位的半字节传输 ;

地址是否自增,从这个图里,显然是外设地址不自增,存储地址自增,传输方向是外设站点到存储器站点 ,传输计数器,这里通道有七个,所以计数7次;

计数器是否自动重装这里可以看ADC的配置,ADC如果是单次扫描,那DMA的传输计数器可以不自动重装,转换一轮就停止,如果ADC是连续扫描,那DMA就可以使用自动重装 ,在ADC启动下一轮转换的时候,DMA也启动下一轮转运,ADC和DMA同步工作

最后是触发选择,这里ADC_DR的值是在ADC但各通道转换完成后才会有效,所以DMA转运的时机,需要和ADC单个通道转换完成同步,所以DMA的触发要选择ADC的硬件触发。

这里硬件触发要说明一下,ADC扫描模式,在每个单独的通道转换完成后,没有任何标志位,也不会触发中断,所以我们程序不太好判断,某一个通道转换完成的时机是什么时候,索然单个通道转换完成后,不产生任何标志位和中断,但是他应该会产生DMA请求去触发DMA转运。

一般来说,DMA最常见的用途就是配合ADC的扫描模式,因为ADC扫描模式有个数据覆盖的特征,或者说这个数据覆盖的问题是ADC固有的缺陷,这个缺陷使ADC和DMA成了最常见的伙伴,ADC对DMA的续修是非常强烈的 ,像其他一些外设,使用DMA是可以提高效率,是锦上添花的操作。

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

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

相关文章

宇音天下最新力作 | VTX356语音识别合成芯片问世

北京宇音天下科技有限公司,依托在语音技术领域的丰富经验和技术积累,成功推出了一款具有里程碑意义的语音识别合成芯片——VTX356。这款芯片的问世,不仅彰显了公司在智能语音处理领域的专业实力,也预示着智能家居、车载电子、智能…

<Tauri>tauri2.0框架下,基于qwik(前端)和rust(后端)结合的桌面程序体验

关于qwik Qwik is a new kind of web framework that can deliver instant loading web applications at any size or complexity. Your sites and apps can boot with about 1kb of JS (regardless of application complexity), and achieve consistent performance at scale.…

一些面试题整理

第一章、基础 以下是对上述10道面试题的参考答案: 一、Java语言及性能调优 答案: 线程安全问题是指多个线程同时访问共享资源时可能出现的数据不一致或错误的情况。例如,多个线程同时对一个共享变量进行写操作,如果没有适当的同…

STM32F1+HAL库+FreeTOTS学习21——内存管理

STM32F1HAL库FreeTOTS学习21——内存管理 1. 内存管理简介2. 内存管理相关的API函数3. 内存管理算法4. 内存管理实验4.1. 实验内容4.2 代码实现4.3 运行结果 5. 总结 上一期我们学习了FreeRTOS中的低功耗Tickless模式,这一期我们学习最后一个章节:内存管…

Linux高手进阶

查看系统资源占用: top:查看CPU、内存使用情况,类似 windows 的任务管理器 默认 5秒刷新一次语法: 直接输入 top按 q 或 ctrl c 退出内容详解: 第一行: top:命令名称 -系统时间up 23:57 min &…

Java基础概览和常用知识(十五)

Spring String#equals()和Object#equals()有何区别? String 中的 equals 方法是被重写过的,比较的是 String 字符串的值是否相等。 Object 的 equals 方法是比较的对象的内存地址。 字符串常量池的作用了解吗? 字符串常量池 是 JVM 为了提升性能和减少…

vue3学习记录-单文件组件 CSS 功能

vue3学习记录-单文件组件 CSS 功能 1.组件作用域 CSS1.1为什么要用到样式穿透(:deep())1.2 插槽选择器:slotted(div)1.3 全局选择器:global 2.CSS Modules2.1 基本用法2.2 自定义注入名称2.3 与组合式 API 一同使用 3.…

使用虚拟机搭建环境:CentOS7 Docker、MySQL、Redis 安装与配置

创作灵感 项目实践总结:记录了在虚拟机中安装与配置CentOS7环境下的Docker、MySQL、Redis的全过程,帮助理解和应用各项技术。技术笔记与问题总结:详细梳理了每一步安装的关键点与常见问题,并给出了解决方案。职业感悟与心得&…

postman如何安装旧版本不升级(以9.31和11.10版本为例)

postman版本超过10.x(包含10.x),有个大的麻烦,就是需要登录账号,如果网络不佳(其实是外网受限),那就很难受了 功能页面都进不去了!而8.x /9.x等以下版本就不需要登录了。 比如9.31.30这个版本就…

Cesium基础-(Entity)-(Corridor 走廊)

里边包含Vue、React框架代码详细步骤、以及代码详细解释 4、Corridor 走廊 以下是 CorridorGeometry 类的属性、方法和静态方法,以表格形式展示: 属性 属性名类型默认值描述positionsArray.定义走廊中心的坐标点数组。widthnumber走廊

为什么vue的beforeupdate和updated生命周期会不停的发送请求

在 Vue2 中,beforeUpdate 和 updated 生命周期钩子会在每次组件更新之前和之后被调用。如果在这两个钩子中执行了某些操作,比如发送 HTTP 请求,那么每当组件发生更新时,这些操作也会随之执行,从而导致不断地发送请求。 以下是一些可能导致这种情况的原因: 响应式数据变化…

Python实现图像(边缘)锐化:梯度锐化、Roberts 算子、Laplace算子、Sobel算子的详细方法

目录 Python实现图像(边缘)锐化:梯度锐化、Roberts算子、Laplace算子、Sobel算子的详细方法引言一、图像锐化的基本原理1.1 什么是图像锐化?1.2 边缘检测的基本概念 二、常用的图像锐化算法2.1 梯度锐化2.1.1 实现步骤 2.2 Robert…

PHP程序开发基础

PHP简介及其开发环境与工具一、PHP简介 PHP是一种流行的服务器端脚本语言,最初由拉斯姆斯勒多父于1994年创建,旨在通过C语言编写小程序以统计网站的访问流量。自那时以来,PHP已经经历了多个版本的迭代,功能不断增强,应…

Docker方式部署ClickHouse

Docker方式部署ClickHouse ClickHouse docker 版本镜像:https://docker.aityp.com/r/docker.io/clickhouse/clickhouse-server ClickHouse 21.8.13.6 docker 版本镜像:https://docker.aityp.com/image/docker.io/clickhouse/clickhouse-server:21.8.13.…

Java 分布式缓存

在当今的大规模分布式系统中,缓存技术扮演着至关重要的角色。Java 作为一种广泛应用的编程语言,拥有丰富的工具和框架来实现分布式缓存。本文将深入探讨 Java 分布式缓存的概念、优势、常见技术以及实际应用案例,帮助读者更好地理解和应用这一…

使用Canvas绘制地图

既然是通过canvas来绘制地图,那肯定是需要地图的数据信息的。接下来跟着我的脚步去实现这些细节。 地图数据 地图数据怎么来呢?当然是怎么简单怎么来 npm i surbowl/world-geo-json-zh 这个第三方包是简体中文 Geo JSON 世界地图,带有国家…

Java常见List面试题

前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!获取一个类Class对象的方式有哪些?ArrayList 和 LinkedList 的区别有哪些?用过 ArrayList 吗?说一下它有什么特点?有数组了为什么…

丁子晴作品《指尖的爱的温度》荣获“金犊奖”全球最佳新锐奖

第33届时报金犊奖颁奖盛典于10月18日在中国成都西部智谷数字体验中心隆重举行。丁子晴的作品《指尖的爱的温度》在激烈的竞争中脱颖而出,荣获了第33届“金犊奖”全球最佳新锐奖。享有盛誉的“金犊奖”是一个全球性的奖项,以其专业严谨、创意水平高的特点,被业界誉为“青年创意的…

Opensearch集群部署【docker、服务器、Helm多种部署方式】

操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch ,例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版,但我们只测…