STM32的 DMA(直接存储器访问) 详解

STM32的DMA(Direct Memory Access,直接存储器存取)是一种在单片机中用于高效实现数据传输的技术。它允许外设设备直接访问RAM,不需要CPU的干预,从而释放CPU资源,提高CPU工作效率,本文基于STM32F429、Hal库详细分析DMA的特性与使用。

1.DMA的特性

(1)STM32F429拥有两个DMA控制器(DMA1和DMA2),DMA1 控制器 AHB 外设端口不连接到总线矩阵,因此,只有 DMA2 数据流能够执行存储器到存储器的传输,外设包括片内外设和片外外设。

片内外设:例如GPIO(通用输入输出端口)、USART(通用同步/异步收发器)、I2C(Inter-Integrated Circuit,一种串行通信总线)、SPI(Serial Peripheral Interface,串行外设接口)等。这些外设通过DMA控制器,可以直接与内存(如SRAM、Flash等)进行数据传输。

片外外设:这是指通过外部接口连接到STM32芯片的设备,例如DHT11温度传感器、MQ2烟雾传感器等。这些设备通过相应的接口(如ADC、SPI等)与STM32连接,然后通过DMA控制器进行数据传输,要确保片外外设支持DMA功能才可以用DMA传输数据。

存储器到存储器的传输意味着DMA控制器可以直接从一个内存区域(如RAM的一个数组或缓冲区)读取数据,并将这些数据写入到另一个内存区域(同样是RAM的另一个数组或缓冲区)。这种传输模式在多种应用中都非常有用,比如:

  1. 数据移动:如果你需要将一段数据从一个位置移动到另一个位置,使用DMA可以节省CPU时间,因为CPU不需要参与数据的传输过程。

  2. 数据处理:在图像处理、音频处理或任何需要处理大量数据的应用中,你可能需要将数据从一个缓冲区读取出来,进行一些处理(如滤波、FFT等),然后将结果写回另一个缓冲区。使用DMA可以并行地进行数据的读取和写入,从而加速整个处理过程。

  3. 数据桥接:在某些应用中,你可能需要从一个硬件接口读取数据,然后将其写入到另一个硬件接口。使用DMA可以确保这两个接口之间的数据传输是高效的,不会受到CPU中断或其他任务的影响。

  4. 循环缓冲区:在处理实时数据流时,循环缓冲区是一种常见的解决方案。使用DMA可以自动地将新数据写入循环缓冲区的末尾,并将旧数据从缓冲区的开头移出,从而实现无缝的数据传输和处理。

(2)每个DMA控制器有8个数据流,每个数据流拥有8个通道,每次传输的数据最大为65535(如果数据单位为字,则一次可以传输256KB),每个通道具体是什么数据接口如下图所示:

DMA1通道

DMA2通道

(3)DMA传输具有FIFO(先进先出)模式和直接模式。FIFO用于在源数据传输到目标地址之前临时存放这些数据,每个数据流都有一个独立的 4 字 FIFO,阈值级别可由软件配置为 1/4、1/2、3/4 或满。而直接模式在每个外设请求都立即启动对存储器传输。

(4)数据流与数据流之间的传输优先级通过软件和硬件两个方面决定。软件上,可以通过DMA_SxCR寄存器配置数据流的优先级,总共有四个等级:非常高、高、中、低。硬件上,若两个请求的软件优先级相同时,仲裁器根据DMA通道的编号来决定响应顺序,序号较小的数据流优先级更高,另外,DMA1拥有比DMA2更高的优先级。

(5)DMA支持源地址和目标地址的数据宽度可以不同,如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据。源传输和目标传输在整个 4 GB 区域(地址在 0x0000 0000 和 0xFFFF FFFF 之间)都可以寻址外设和存储器。

(6)DMA拥有5个中断,分别是:半传输、传输完成、传输错误、FIFO 上溢/下溢、直接模式错误。

2.DMA的使用

下面我们将一些数据通过DMA2的UART1输出出来:

(1)使能DMA时钟

 __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能    

(2) 初始化DMA通道,配置通道,外设和内存地址,传输数据量等

__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);    //将DMA与USART1联系起来(发送DMA)//Tx DMA配置UART1TxDMA_Handler.Instance=DMA2_Stream7;                            //数据流选择DMA2控制器的数据流7UART1TxDMA_Handler.Init.Channel=DMA_CHANNEL_4;                       //通道选择4UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位UART1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设普通模式UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输HAL_DMA_DeInit(&UART1TxDMA_Handler);   HAL_DMA_Init(&UART1TxDMA_Handler);

(3)开启DMA通道传输

 MYDMA_USART_Transmit(&UART1_Handler,(u8*)SendBuff,SEND_BUF_SIZE); //启动传输    

(4) 查询DMA通道状态,传输结束后关闭串口DMA

while(1){if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7))//等待DMA2_Steam7传输完成{__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志HAL_UART_DMAStop(&UART1_Handler);      //传输完成以后关闭串口DMAbreak; }delayms(10);
}                

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

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

相关文章

C++基础(1)

目录 C的输入输出: 命名空间域: 缺省(默认)参数: 函数重载: 引用: 内联函数inline: 指针空值nullptr: C的输入输出: 输入: int a; char …

社交论坛圈子系统APP开发社交圈子小程序系统源码开源,带语音派对聊天室/圈子社交论坛及时聊天

功能// 首页左右滑动切换分类 使用资讯类app常见的滑动切换分类,让用户使用更方便。 2信息卡片流展示 每条信息都是一个卡片,头像展示会员标签,单图自动宽度,多图九宫格展示,底部展示信息发布地址,阅读量、…

采用3种稀疏降噪模型对心电信号进行降噪(Matlab R2021B)

心电信号采集自病人体表,是一种无创性的检测手段。因此,心电信号采集过程中,本身也已经包含了机体内部其他生命活动带来的噪声。同时,由于采集设备和环境中存在电流的变化,产生电磁发射等物理现象,会对心电…

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单…

浅谈VPS主机上的数据库性能优化

如何提高网站性能?一个显而易见的解决方案是升级托管账户。您的网站将拥有更多硬件资源,因此可以同时处理更多请求并更快地传递数据。 无论如何,人们都是这么认为的。但事实总是不一样。 现代网站是一个复杂的系统,包含许多必须…

效果惊人!LivePortrait开源数字人技术,让静态照片生动起来

不得了了,快手已经不是众人所知的那个短视频娱乐平台了。 可灵AI视频的风口尚未过去,又推出了LivePortrait--开源的数字人项目。LivePortrait让你的照片动起来,合成逼真的动态人像视频,阿里通义EMO不再是唯一选择。 让图像动起来 LivePortrait 主要提供了对眼睛和嘴唇动作的…

实体构件库设计说明方案

实体构件库设计说明方案 一、引言 在数字化设计与制造日益普及的今天,实体构件库作为连接设计创意与物理实现的关键桥梁,其重要性不言而喻。实体构件库不仅存储了各类标准化、参数化的零部件模型,还提供了便捷的检索、配置、优化及自动化生…

昇思MindSpore学习总结十二 —— ShuffleNet图像分类

当前案例不支持在GPU设备上静态图模式运行,其他模式运行皆支持。 1、ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍,如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3,利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包,并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…

变长输入神经网络设计

我对使用 PyTorch 可以轻松构建动态神经网络的想法很感兴趣,因此我决定尝试一下。 我脑海中的应用程序具有可变数量的相同类型的输入。对于可变数量的输入,已经使用了循环或递归神经网络。但是,这些结构在给定行的输入之间施加了一些顺序或层…

7.9实验室总结 SceneBuilder的使用方法+使用javafx等

由于下错了东西,所以一直运行不出来,今天一直在配置环境,配置好了才学,所以没学多少,看了网课学习了SceneBuilder的使用方法还有了解了javafx是怎么写项目的,, 学习了怎么跳转页面:…

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…

【光伏仿真系统】光伏设计的基本步骤

随着全球对可再生能源需求的不断增长,光伏发电作为一种清洁、可再生的能源形式,正日益受到重视。光伏设计是确保光伏系统高效、安全、经济运行的关键环节,它涉及从选址评估到系统安装与维护的全过程。本文将详细介绍光伏设计的基本步骤&#…

【RHCE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

LLM应用构建前的非结构化数据处理(三)文档表格的提取

1.学习内容 本节次学习内容来自于吴恩达老师的Preprocessing Unstructured Data for LLM Applications课程,因涉及到非结构化数据的相关处理,遂做学习整理。 本节主要学习pdf中的表格数据处理 2.环境准备 和之前一样,可以参考LLM应用构建前…

Raylib 实现超大地图放大缩小与两种模式瓦片地图刷新

原理: 一种刷新模式: 在宫格内整体刷新,类似九宫格移动到边缘,则九宫格整体平移一个宫格,不过这里是移动一个瓦片像素,实际上就是全屏刷新,这个上限是 笔记本 3060 70帧 100*100个瓦片每帧都…

压缩感知3——重构算法正交匹配追踪算法

算法流程 问题的实质是&#xff1a;AX Y 求解&#xff08;A是M维&#xff0c;Y是N维且N>>M并且稀疏度K<M&#xff09;明显X有无穷多解&#xff0c;重构过程是M次采样得到的采样值升维的过程。OMP算法的具体步骤&#xff1a;(1)用X表示信号&#xff0c;初始化残差e0 …

802.11漫游流程简单解析与笔记_Part2_05_wpa_supplicant如何通过nl80211控制内核开始关联

最近在进行和802.11漫游有关的工作&#xff0c;需要对wpa_supplicant认证流程和漫游过程有更多的了解&#xff0c;所以通过阅读论文等方式&#xff0c;记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

C#用反射机制调用dll文件的字段、属性和方法

1、创建dll文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace CLStudent {public class Student{//字段public string Name "Tom";//属性public double ChineseScore { get; s…

connect to github中personal access token生成token方法

一、问题 执行git push时弹出以下提示框 二、解决方法 去github官网生成Token&#xff0c;步骤如下 选择要授予此 令牌token 的 范围 或 权限 要使用 token 从命令行访问仓库&#xff0c;请选择 repo 。 要使用 token 从命令行删除仓库&#xff0c;请选择 delete_repo 其他根…