DMA详解及应用(嵌入式学习)

news2024/11/9 6:23:56

DMA

  • 0. 前言
  • 1. DMA作用
  • 2. DMA特性
  • 3. DMA寄存器
  • 4. DMA的增量或者循环模式
  • 5. 练习

0. 前言

DMA(Direct Memory Access,直接内存访问)是一种计算机系统中用于高效地实现数据传输的技术。它允许数据在外设和内存之间直接传输,而无需CPU的干预和数据复制。

传统上,在计算机系统中,外设(如硬盘、网络适配器、音频设备等)与内存之间的数据传输通常需要通过CPU进行中转。这意味着CPU需要花费大量的时间和计算资源来处理数据传输操作,同时限制了CPU执行其他任务的能力。

而DMA技术的引入解决了这个问题。DMA控制器是一种专用的硬件设备,它可以直接访问系统内存和外设,完成数据的传输。当需要进行数据传输时,CPU只需配置DMA控制器的参数,并将控制权交给DMA控制器,然后就可以继续执行其他任务,而不需要参与具体的数据传输过程。

DMA控制器通过使用内存地址总线和外设地址总线,直接将数据从外设读取到内存,或者将数据从内存发送到外设,实现高速的数据传输。这样可以大大提高数据传输的效率,减轻CPU的负担,允许CPU集中精力处理其他任务。

以下是STM32中DMA的主要特点和用法:

  1. 高速数据传输:DMA允许外设与内存之间的高速数据传输,而无需CPU的干预。这对于需要大量数据传输的外设(例如串行通信接口、SPI接口、I2C接口等)非常有用。

  2. 降低CPU负担:使用DMA功能可以将数据传输任务从CPU上分担下来,使CPU能够专注于其他任务。这有助于提高系统的响应能力和并行处理能力。

  3. 多通道支持:STM32的DMA控制器通常支持多个DMA通道,每个通道可以与一个外设进行连接。这意味着多个外设可以同时执行DMA传输,而不会相互干扰。

  4. 中断和循环模式:DMA传输完成后,可以生成中断请求来通知CPU。此外,DMA还支持循环模式,可以在传输完成后自动重新启动传输,从而实现连续的数据传输。

  5. 灵活的配置:STM32提供了灵活的DMA配置选项,可以根据特定应用的需求进行设置。可以选择传输方向(从外设到内存或从内存到外设)、数据宽度、传输模式等。

使用STM32的DMA功能,可以实现高效的数据传输和处理,尤其适用于需要处理大量数据的应用场景。它提供了一种快速、可靠且低功耗的数据传输方式,有助于优化嵌入式系统的性能。

1. DMA作用

DMA的传输方式无需CPU参与,可以直接控制传输。
DMA给外部设备和内存开辟了一条直接数据传输的通道。
目的:给CPU节省资源,使CPU的工作效率提高

DMA(Direct Memory Access)是一种功能强大的技术,它允许数据在外设和内存之间直接传输,而无需CPU的直接干预。DMA的作用是提高数据传输的效率和性能,减轻CPU的负担,同时允许CPU集中精力处理其他任务。

以下是STM32中DMA的一些主要作用:

  1. 数据传输:DMA可以在外设和内存之间进行高速数据传输。它可以在不占用CPU时间的情况下,自动地将数据从外设读取到内存,或者从内存发送到外设。

  2. 提高效率:通过使用DMA,数据传输可以在后台进行,而不会占用CPU的时间。这样,CPU可以专注于执行其他任务,而不必等待数据传输的完成。

  3. 减少中断:使用DMA可以减少中断的频率。在传统的方式中,每传输一个数据,都需要一个中断来通知CPU。而使用DMA,可以将多个数据一次性传输,从而减少中断的数量。

  4. 外设协议支持:许多外设,如UART、SPI、I2C等,都支持DMA传输。通过使用DMA,可以实现高速的数据传输,提高外设的性能。

  5. 数据处理:DMA还可以在内存之间执行数据处理操作,例如内存之间的拷贝、填充等。这样可以减少CPU的负担,提高数据处理的效率。

总的来说,DMA在STM32中的作用是通过提供直接的内存访问功能,加速数据传输,减轻CPU负担,提高系统性能和效率。它特别适用于需要高速数据传输和对CPU资源要求较高的应用场景。

2. DMA特性

DMA的特性包括直接访问内存、硬件控制、高效数据传输、中断支持、多通道支持、数据流控制和内存保护等。这些特性使得DMA成为一种有效的数据传输技术,可以在计算系统中提高性能和效率。

1)同一个DMA模块可以有多个优先级请求:很高 高 中等 低
2)每个通道有3个事件标志: DMA半传输 DMA传输完成 DMA传输出错
3)数据源 目标源 数据传输宽度对齐
4)传输数据 字节8位 半字16位 全字32位 
5)存储器<->存储器 外设<->存储器 外设<->外设
6)闪存(flash) SRAM APB AHB 外设均可以作为源或者目标
7)搬移数据的最大长度为65535字节

在这里插入图片描述

3. DMA寄存器

DMA_CPARx :设置外设地址的寄存器
DMA_CMARx :设置存储器地址的寄存器
DMA_CCRx :设置数据传输方向
DMA_CNDTRx:设置传输的数据量

4. DMA的增量或者循环模式

1)增量 外设搬移到存储器的时候 ,不希望覆盖上一个会将内存设置为增量模式
2)循环 DMA不停循环的搬移数据,一组的数据传输完成时,计数寄存器将会自动地被恢复成配置该通道时设置的初值.

DMA的增量或循环模式是DMA传输过程中的一种配置选项,用于确定数据传输时内存地址的增加方式。具体来说,增量或循环模式决定了DMA传输过程中数据源和目的地地址的自动增加方式。

  1. 增量模式:在增量模式下,DMA传输过程中的数据源和目的地地址会自动递增。例如,如果数据源地址是0x1000,每次传输后增量模式会自动将数据源地址递增,使下一次传输从地址0x1001开始。同样,目的地地址也会按相同的方式自动递增。

增量模式的优点是可以方便地传输连续的数据块,减少了在每次传输时手动更新地址的工作量。这对于从连续内存区域读取或写入数据非常有用。

  1. 循环模式:在循环模式下,DMA传输过程中的数据源和目的地地址在达到事先设定的终点地址后会重新回到起始地址。这意味着传输可以在源和目的地之间循环进行。

循环模式的优点是可以重复传输一定长度的数据,而无需在每次传输后重新配置DMA寄存器。这对于需要周期性地传输数据或循环缓冲区的应用非常有用。

增量模式和循环模式可以单独或同时使用,具体取决于应用需求。在配置DMA通道时,开发人员可以根据数据的存储方式和传输需求选择适当的模式。使用这些模式可以简化DMA传输的配置和管理,提高数据传输的效率和灵活性。

5. 练习

通过DMA搬移ADC转换完成的数据

不了解ADC的家人们,点击这里跳转——》ADC(模数转换)详解
不了解ADC的家人们,点击这里跳转——》ADC(模数转换)详解
不了解ADC的家人们,点击这里跳转——》ADC(模数转换)详解

从外设 -> 内存(以STM32G030为例)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

HAL_StatusTypeDef HAL_ADC_Start_DMA  (ADC_HandleTypeDef * hadc, uint32_t * pData, uint32_t  Length)
功能:启动ADC开始转换,并通过DMA搬移转换结果。
参数:ADC_HandleTypeDef * hadc 句柄
           uint32_t * pData 数据存放地址
           uint32_t  Length 数据长度

在这里插入图片描述

在主函数中启动ADC并用DMA进行数据搬移,将数据搬移到buf中。

在这里插入图片描述

重写ADC转换完成回调函数,停止ADC并输出buf中的数据

在这里插入图片描述

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

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

相关文章

GEE:为每个对象(斑块/超像素)添加属性

作者:CSDN @ _养乐多_ 本文将介绍为每个对象(斑块/超像素)添加属性的代码。并举例将最近距离作为属性添加到每个对象(斑块/超像素)特征中。 结果如下图所示, 文章目录 一、代码二、代码链接一、代码 这段代码的目的是对动态世界土地覆盖图像进行分析,并提取出其中的目…

贪婪算法简介-数据结构和算法教程

贪婪算法是一种算法范例&#xff0c;它遵循在每个阶段进行局部最优选择的问题求解启发式&#xff0c;希望找到全局最优值。换句话说&#xff0c;贪婪算法在每一步都选择最好的可能选项&#xff0c;而不考虑该选择对未来步骤的影响。 当一个问题可以被划分成更小的子问题&#…

1.GPIO的工作原理

1.stm32引脚说明&#xff1a; 对于stm32f103zet6&#xff1a; 一共有7组io口&#xff1b;每组io口有16个io&#xff1b;一共有16*7112个io&#xff1b;分组情况为&#xff1a;GPIOA&#xff0c;GPIOB~GPIOG&#xff1b; 2.GPIO的基本结构&#xff1a; 3.GPIO的工作模式&…

C++入门:类和对象(后)

目录 前言&#xff1a; 一&#xff1a;static成员 (1)概念 (2)特性 (3)例子 二&#xff1a;explicit关键字 三&#xff1a;内部类 (1)概念 (2)特性 (3)实例 四&#xff1a;匿名对象 (1)概念 (2)特性 (3)实例 五&#xff1a;拷贝对象时的一些编译器优化 (1)引入 …

Spring整合MyBatis底层原理

Spring整合MyBatis底层原理 项目结构图 项目代码 build.gradle需要进入的依赖 // testImplementation(platform("org.junit:junit-bom:5.9.1")) // testImplementation("org.junit.jupiter:junit-jupiter")implementation("org.aspectj:aspect…

电池SOC和动力电池OCV功率联合估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

爱心方程(理科生的浪漫?)

目录 前言 C/C 源代码 扩展 Java Python HTML 前言 这个在大一的时候就想找了&#xff0c;然后后面是找到了一个&#xff0c;但是忘记出处了。我决定把可以找到的所有爱心给整理一下&#xff0c;为了实现“理科生的浪漫”&#xff01;&#xff01;&#xff01; C/C 首先…

你认为年轻人存款难吗?难啊难,难如上青天!!!

近日&#xff0c;有调查称“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”&#xff0c;存款超过10万就会超过53.7%的人。”“年轻人”“存款”两个词碰撞在一起&#xff0c;引来了广泛的关注和讨论。你认为年轻人存款难吗&#xff1f;可以从以下几个角度发表你…

Linux Nacos 设置systemctl service 并添加为开机启动

为方便在启动服务器时&#xff0c;不需要一个一个手动启动服务&#xff0c;需要把nacos设置为开机启动。方法如下&#xff1a; 在/usr/lib/systemd/system 目录下面添加nacos.service脚本&#xff1a; # 下面这一行必须有&#xff0c;不然会报错 #vim /usr/lib/systemd/system…

libevent(3)IO模型基础知识

一、用户态和内核态 我们知道现在的操作系统是分层的&#xff0c;内核封装了与底层的接口&#xff0c;通过系统调用提供给上层应用使用。 当进程运行在内核空间时&#xff0c;它就处于内核态&#xff1b;当进程运行在用户空间时&#xff0c;它就处于用户态。 当我们需要进行IO操…

【小沐学Python】网络爬虫之requests

文章目录 1、简介2、requests方法2.1 get2.2 post 3、requests响应信息4、requests的get方法4.1 url4.2 headers4.3 params4.4 proxies4.5 verify4.6 timeout4.7 cookies4.8 身份验证 3、测试代码3.1 获取网页HTML&#xff08;get&#xff09;3.2 获取网页HTML&#xff08;带he…

【LeetCode热题100】打卡第26天:最大矩形

文章目录 最大矩形⛅前言&#x1f512;题目&#x1f511;题解 最大矩形 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数…

随着ChatGPT、文言一心的大火,未来可能的生活工作方式

前面的文章笼统的扯了一些ChatGPT、文言一心的差异化&#xff0c;感觉还是不够明白直观。特地找了一份资料&#xff0c;通过基础能力、进阶能力、和一些垂直领域的几百个各种问题&#xff0c;来对比分析两者的回答情况&#xff0c;让大家可以有个更接地气的了解。 由于问题太多…

无限脉动:释放音乐和区块链在音乐领域的力量

音乐是一种永恒的通用语言&#xff0c;它将人们聚集在一起&#xff0c;超越了边界&#xff0c;在我们灵魂深处产生共鸣&#xff0c;创造联系。在当今数字时代&#xff0c;随着区块链技术和去中心化网络的出现&#xff0c;音乐世界正在经历一场深刻的变革。 我们在与艺术家合作&…

动态规划 DP (二)

3.二维动态规划 1) 力扣https://leetcode.cn/problems/minimum-path-sum/第一行的的路径只与左边的元素有关&#xff0c;第一列的路径只与上面的元素有关。 除了第一行和第一列&#xff0c;其他元素的路径取决于左边和上面元素的最小值。 只要每次都选择值最小的路径&#…

2021电工杯数学建模B题解题思路(光伏建筑一体化板块指数发展趋势分析及预测)

目录 一、前言 二、问题背景 三、具体问题 四、解题思路 &#xff08;一&#xff09;整体思路 &#xff08;二&#xff09;问题一 &#xff08;三&#xff09;问题二 &#xff08;四&#xff09;问题三 &#xff08;五&#xff09;问题四 &#xff08;六&#xff09;…

2023最新谷粒商城笔记之秒杀服务篇(全文总共13万字,超详细)

秒杀服务 秒杀具有瞬间高并发的特点&#xff0c;针对这一特点&#xff0c;必须要做限流异步缓存(页面静态化)独立部署 限流方式&#xff1a; 前端限流&#xff0c;一些高并发的网站直接在前端页面开始限流&#xff0c;例如&#xff1a;小米的验证码设计Nginx 限流&#xff0c…

ChatGPT从入门到精通,深入认识Prompt

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定让ChatGPT帮你高效实现职场办公&#xff01;行动起来吧1、ChatGPT从入门到精通&#xff0c;一站式掌握办公…

Unity 中的旋转、targetFrameRate、 vSyncCount、Time

1. 旋转&#xff1a; Unity 中的旋转用eulerAngle 表示&#xff0c;但在内部是以quaternion存储。欧拉角旋转围绕三个轴进行三次独立旋转&#xff0c;依次是z、x、y。To convert from Euler angles to quaternions, you can use the Quaternion.Euler function.To convert a q…

Linux 文件操作

文章目录 一、task_struct 和 file 的关系二、文件操作的系统调用三、进程默认打开的三个文件四、文件重定向五、Linux 下一切皆文件 文件是在磁盘上创建出来的&#xff0c;当我们想进行文件操作时&#xff0c;根据冯诺依曼体系结构&#xff0c;CPU 只和内存交互&#xff0c;为…