【STM32系列】DMA —— 直接存储器存取
这个最近也忘了,自用。
简介
- 存储器(SRAM、Flash)和外设之间数据传输、存储器和存储器之间数据传输。
- 通道就是数据转运路径,一个数据要进行转运,就要占用一个通道。如果有多个通道进行数据转运, 它们之间可以各转各的,互不干扰。
- 1、使用软件触发以后,DMA就会将数据以最快的速度全部转运完成。一般用于存储器到存储器之间的转运。
2、使用硬件触发,就可以有一定的时机。例如ADC,可以触发一次DMA,DMA转运一次。一般用于外设到存储器的转运。
3、每一个DMA的通道,其硬件触发源是不一样的,想要使用某一个硬件的触发源,就要使用它连接的通道,而不能任意选择。
存储器
所谓的外设只不过是STM32特定指定了可以转运外设的存储器,本质上其实都是存储器到存储器之间的数据转运。
- ROM:只读存储器,非易失性、掉电不丢失的存储器。
- RAM:随机存储器,易失性、掉电丢失的存储器。
DMA存取
- 总线矩阵:其左边是主动单元,拥有存储器的访问权;右边的是被动单元,只能被左边的主动单元读写.
- 仲裁器:虽然DMA有多个通道可以独立转运数据,但是DMA总线只有一条,所以所有的通道都只能分时复用这一条DMA总线。产生了冲突,仲裁器就会根据通道的优先级,来决定使用先后。
- AHB从设备:DMA作为外设的自身的寄存器。所以DMA即是总线矩阵的主动单元,可以读写各种寄存器;也是AHB总线上的被动单元,CPU可以通道AHB总线对DMA进行配置。
- DMA请求:DMA的硬件触发源,比如DMA转换完成、串口接收到数据,需要触发DMA转运数据的时候,就会向DMA发出硬件触发信号。
- CPU和DMA直接访问Flash的话,只能读取而不可写入。
- SRAM是运行内存,可以任意读写。
DMA工作
- 传输计数器:指定DMA需要转运几次,是一个自减计数器。减到0后,就不再进行转运,并且自增的起始地址也会恢复到原本的起始地址。
- 自动重装器:在传输在传输计数器自减到0后将其重装到初始值,决定了转运的模式。如果不使能,就是单次转运模式;如果使能,就是循环转运模式。
- M2M:存储器到存储器。使能M2M时,DMA就会选择软件触发,以最快的速度连续不断的触发DMA,将传输计数器清零,完成一轮转换(注意与ADC的软件触发不太一样,这里可以理解为连续触发),并且软件触发和自动重装器不能一起用。不使能M2M时,可以选择硬件触发,触发源可以选择ADC、串口、定时器等外设,硬件达到某一个时机时,传输一个信号来触发DMA转运。
- 开关控制:DMA_CMD函数,使能后,DMA就能进行转运。
DMA工作条件
- 开关控制,DMA使能。
- 传输计数器必须大于0。
- 触发源必须有触发信号,触发一次转运一次,传输计数器自减一次。
- 当传输计数器等于0,且没有自动重装时,无论是否触发,DMA都不会再进行转运,此时就要失能开关控制(DMA_CMD)关闭DMA,给传输计数器写一个数,再使能开关控制开启DMA,才能继续工作(不能在DMA开启时写入传输计数器)。
DMA请求
- DMA每一个通道都有数据选择器,可以选择硬件或者软件触发。
- 每一个通道的硬件触发源不同,想要用不同的外设来触发,就必须选择某个特定的通道。假如选择软件触发,那么通道就可以任意选择。(每个通道都支持软件触发和特定的硬件触发)
- 到底在一个通道上选择哪一个外设触发源,是根据其中某个外设开启了DMA输出来决定的(如ADC_DMACMD),必须使用库函数开启某个外设的DMA输出才会有效。
数据宽度与对齐
- 数据宽度都一样,就是正常的一个个转运。
- 假如目标的数据宽度比源端的数据宽度大,那就在目标数据前面多出的高位补0。
- 假如目标数据宽度比源端数据宽度小,那么就会把多出来的高位舍弃。
DMA数据转运
存储器到存储器之间的转运,使用软件触发,不需要等待硬件时机,尽快转运完成即可。
ADC扫描+DMA
- 左边ADC有七个通道,触发以后,七个通道依次进行AD转换,转换的结果都放到ADC_DR数据寄存器中。
- 在每一个单独的通道转换完成后,进行一次DMA数据转运,且目的地址进行自增。
DMA配置
- 外设地址写入ADC_DR寄存器的地址。
- 存储器的地址在SRAM中定义一个数组ADValue,将ADValue的地址当作存储器的地址。
- uint16_t位的数据,故数据宽度为半字传输。
- 从ADC_DR寄存器将数据转运到DMA,那么外设地址不自增,存储器地址自增。
- 此处通道有七个,故传输计数器写7。
- ADC如果是单次扫描,那么DMA的传输计数器可以不自动重装,转换一轮就停止;如果ADC是连续扫描模式,那么DMA就可以使用自动重装,在ADC启动下一轮转换的时候,DMA也启动下一轮转运,ADC和DMA同步工作。
- 使用ADC硬件触发DMA,因为ADC_DR的值是在ADC单个通道转换完成后才会有效,故DMA转运的时机需要和ADC单个通道转换完成同步,故选择ADC硬件触发。ADC扫描模式在一个单独的通道转换完成以后,没有任何标志位,也不会触发中断,但是会产生DMA请求,去触发DMA转运。
- DMA最常见的用途就是配合ADC的扫描模式,因为ADC扫描模式有数据覆盖的特征。
【STM32系列】DMA —— 直接存储器存取的更多相关文章
- DMA(直接存储器存取)
DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...
- 直接存储器存取(Direct Memory Access,DMA)详细讲解
一.理论理解部分. 1.直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输. 2.无须CPU干预,数据可以通过DMA快速移动,这就节省了CPU的资源来做其他操作. ...
- STM32之DMA+ADC
借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不 ...
- STM32之DMA实例
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zouleideboke/article/details/75092558 DMA简介: DMA(Di ...
- WS2812B彩灯详细讲解篇(STM32 PWM+DMA控制 STM32 HAL库编程 循环延时控制多种控制方式)
一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1JT4y1P72Q 二. 基础认识 (一) 小理论 WS2812B是一种智能控制LED光源,将控制电路 ...
- STM32之DMA
一.DMA简介 1.DMA简介 DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式. CPU有转移数据.计算.控制程序转移等很多功能,但其实转 ...
- mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信
这个仅仅能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.传输数据完后.DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系 ...
- STM32 基DMA的DAC波形发生器
DAC是STM32系列的一个基本外设,可以将数字信号转化成模拟信号,这次我将使用DAC来输出一个特定波形. 首先确定工作方法,由于我目前在做的简易示波器在输出波形的同时还需要显示输入信号,所以不能占用 ...
- STM32系列ARM单片机介绍
STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex-M3内核.按性能分成两个不同的系列:STM32F103"增强型"系列和STM32F101 ...
- DMA—直接存储器访问
DMA 简介 DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好 ...
随机推荐
- 通过ETL从MySQL同步到GaussDB
在数字化转型深化的背景下,企业会面临数据源异构化的孤立存储和分散管理难题,需要构建统一的数据治理体系以实现跨系统数据资产的整合与价值挖掘.我们可以通过ETL其低代码/无代码架构,有效解决了多源异构数据 ...
- Feature Engineering: 超好用的特征工程Python库: feature_engine
https://leanpub.com/feature-selection-machine-learning-feature-engine https://github.com/feature-eng ...
- 树上最近公共祖先(LCA)问题
参考链接:OI Wiki 倍增LCA 倍增思想 可以参考ST表. 设 $\large f_{x,i}$ 表示 $x$ 的 $2^i$ 级祖先,用 $father_i$ 表示节点 $i$ 的父节点 ,则 ...
- Object Sense (OSE):一款从编辑器脚本发展起来的编程语言
引言:从Vim编辑器走出的语言 在编程语言的世界里,许多革命性的创新往往源于看似简单的工具.Object Sense(简称OSE)的诞生,便与一款经典文本编辑器--Vim息息相关.它的前身是Vim的脚 ...
- Unity 编辑器格子工具
using UnityEditor; using UnityEngine; public class CustomGridWindow3 : EditorWindow { private Textur ...
- lambda表达式一定要在内部捕获受检异常?
场景 以调用java.util.ArrayList#forEach方法为例,用不同的lambda表达式重写该Consumer接口. RuntimeException list中有两个元素,调用forE ...
- 优雅的.net REST API之FastEndpoints
FastEndpoints 是基于 ASP.NET Core 的轻量级.高性能 Web API 开发框架,采用 REPR (请求-端点-响应)设计模式. 本人用FastEndpoints做了一个RES ...
- OpenLDAP 核心使用场景以及应用场景
以下详解 OpenLDAP 的使用场景与核心架构,结合企业级实践和技术原理展开说明. 一.OpenLDAP 核心使用场景 1. 企业用户身份集中管理 统一认证:集中存储员工账号 ...
- 我给自己请了个“AI抬杠师”,吵了半小时,爽了
最近发现一个特别的AI玩法:找一个言辞犀利.逻辑超强的AI当"陪练",专门跟自己抬杠. 不是网上那种毫无逻辑的对喷,也不是跟亲近的人互相伤害,而是一场纯粹的.高强度的.只讲逻辑不讲 ...
- 牛客周赛 round99 E题 小宇
题目链接:https://ac.nowcoder.com/acm/contest/112544/E 思路 首先输入每个数字时候判断一遍该数字与下标大小关系,如果小于下标说明说,因为最小情况严格单调递增 ...