STM32(5)-DMA概念详细解析

这篇具有很好参考价值的文章主要介绍了STM32(5)-DMA概念详细解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当遇到大量数据传输时,DMA是一个很重要的技术,可以提高传输效率,减轻CPU负担。


一、DMA是什么?

DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。
STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有 7 个通道。DMA2 有 5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个 DMA 请求的优先权。
STM32 的 DMA 有以下一些特性:
●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能
通过软件来配置。
●在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如
在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。
●独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和
目标地址必须按数据传输宽度对齐。
●支持循环的缓冲器管理
●每个通道都有 3 个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错),这 3 个
事件标志逻辑或成为一个单独的中断请求。
●存储器和存储器间的传输
●外设和存储器,存储器和外设的传输
●闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。
●可编程的数据传输数目:最大为 65536

二、DMA的作用

首先看这句话:DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,而无需CPU干预

1.存储器映像

我们知道,单片机的存储器包括ROM和RAM。
ROM(Read Only Memory)是只读存储器,一旦存储了数据就不能被修改。在单片机中,ROM常用于存储程序代码和常量数据。
RAM(Random Access Memory)是随机存取存储器,可以读写数据。在单片机中,RAM通常用于存储程序执行时需要的缓存数据和变量。
以STM32F103C8T6为例:
单片机dma,stm32,单片机,嵌入式硬件
这里主要说一下flash、SRAM和外设寄存器。

(1)Flash存储器

是一种可编程的非易失性存储器,它的特点是存储容量大,且可以长期保存数据,即使没有电源供应。在单片机中,Flash存储器通常用于存储程序代码和常量数据。程序代码和常量数据一旦存储在Flash中,就可以长期保存,不需要再次加载。

(2)SRAM(Static Random Access Memory)

是一种静态随机存储器,它通常用于暂存数据。它的特点是读写速度快,但存储容量相对较小,且需要持续的电源供应以保持数据的存储。在单片机中,SRAM通常用于存储程序执行时需要的缓存数据和变量。比如定义的变量、数组、结构体等。

(3)单片机的外设寄存器

是用于控制和配置外设的寄存器,它们通常位于单片机内部,可以通过特定的地址和操作方式访问。
外设寄存器的数量和类型取决于单片机的型号和制造商。常见的外设寄存器包括:
GPIO寄存器:用于控制通用输入输出口的状态和配置。
定时器寄存器:用于控制和配置定时器的工作模式、计数器值和中断。
UART寄存器:用于控制和配置串口通信的参数,如波特率、数据位、停止位。
SPI寄存器:用于控制和配置SPI通信的参数,如时钟速率、数据位数等。
ADC寄存器:用于控制和配置模拟数字转换器的参数,如采样率、参考电压等。
PWM寄存器:用于控制和配置PWM输出信号的频率、占空比等参数。
外部中断寄存器:用于配置和控制外部中断的触发方式、优先级等。

2.DMA框图

单片机dma,stm32,单片机,嵌入式硬件
①ICode和DCode:
ICode指的是指令存储器(Instruction Memory),用于存放CPU指令的存储器。它通常是一种只读存储器(ROM)或闪存(Flash),存储着程序的指令代码。当CPU需要执行指令时,会从ICode中读取指令进行执行。
DCODE指的是数据存储器(Data Memory),也称为数据存储器或数据存储区,是用于存储程序中所使用的变量和数据的存储器。它通常是一种随机访问存储器(RAM),可以进行读写操作。在程序运行时,CPU会将变量和数据存储在DCODE中,当需要读取或修改变量和数据时,CPU会从DCODE中进行读取和写入操作。
单片机dma,stm32,单片机,嵌入式硬件
②总线:这幅图里大量涉及了关于总线的使用,这里介绍一下:总线矩阵通过连接CPU核、存储器和外设,实现了内部总线的连接和交换。
STM32的总线矩阵通常包括以下几个部分:
AHB总线矩阵:用于连接CPU核、系统总线矩阵和存储器等高速存储器,提供高带宽和低延迟的数据传输。连接着CPU、DMA、SRAM等重要的系统资源。
APB总线矩阵:用于连接外设,提供低带宽和高延迟的数据传输。其中APB1总线连接GPIO、UART、SPI等。它的主频通常是AHB总线的一半,用于低速数据传输和较低性能的操作。
APB2总线针对一些特殊外设的高速总线,如USB OTG、SDIO、CAN等。它的主频通常是AHB总线的一半或一四分之一,用于高速数据传输和高性能操作。
DMA总线矩阵:用于连接DMA控制器和内部总线,实现高速数据传输和复制。
③DMA控制器
(1)DMA1控制器
从外设(TIMx[x=1、2 、3、4] 、ADC1 、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。
外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。
单片机dma,stm32,单片机,嵌入式硬件
(2)DMA2控制器
从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。参见下图的DMA2请求映像。
外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭。
单片机dma,stm32,单片机,嵌入式硬件

3.DMA数据转运思路

比如我举一个例子:当我使用温湿度传感器测得温湿度值时,这个数值实际上是经过CPU的处理后被保存到SRAM的一块地址空间中去,而这时我用常规的串口配置,使得这个数据可以被串口打印到PC上去,这个过程实际是CPU再次寻找到指定的保存好的这块地址空间,读取了里面的数值,并通过总线传输数据到串口缓冲区,由串口硬件模块自动从缓冲区中读取数据并进行发送。那么,在我读取温湿度,并把数据用串口发送这个过程,用到了两次CPU的处理,CPU担任了SRAM和串口数据寄存器的中间人的角色。
但是这样无疑增加了CPU的负担,同时数据传输的速度也不快,所以才要用到DMA,使得SRAM和寄存器之间的数据交换不用CPU插手,直接了当。

二、DMA基本结构及相关参数

借用江科大的图:
单片机dma,stm32,单片机,嵌入式硬件
可以看到,DMA结构中,核心部分是外设寄存器与存储器之间的数据交流,其中涉及了这些参数:方向、起始地址、数据宽度、地址是否自增、计数器、重装、M2M等,DMA可以由硬件或者软件触发,当M2M=1时是软件触发,反之为硬件触发。接下来借助DMA的结构体来分析:

typedef struct 
{ 
	u32 DMA_PeripheralBaseAddr; 
	u32 DMA_MemoryBaseAddr; 
	u32 DMA_DIR; 
	u32 DMA_BufferSize; 
	u32 DMA_PeripheralInc; 
	u32 DMA_MemoryInc; 
	u32 DMA_PeripheralDataSize; 
	u32 DMA_MemoryDataSize; 
	u32 DMA_Mode; 
	u32 DMA_Priority; 
	u32 DMA_M2M; 
} DMA_InitTypeDef;

DMA_PeripheralBaseAddr:该参数用以定义 DMA 外设基地址
DMA_MemoryBaseAddr:该参数用以定义 DMA 内存基地址
DMA_DIR:规定外设是作为数据传输的目的地还是来源(数据传输方向),该参数的取值范围如下表。
单片机dma,stm32,单片机,嵌入式硬件
DMA_BufferSize:用以定义指定 DMA 通道的 DMA 缓存的大小,单位为数据单位。根据传输方向,数据单位等于结构中参数 DMA_PeripheralDataSize 或者参数 DMA_MemoryDataSize 的值。
DMA_PeripheralInc:用来设定外设地址寄存器递增与否
DMA_MemoryInc:用来设定内存地址寄存器递增与否
DMA_PeripheralDataSize:设定了外设数据宽度。该参数的取值范围如下表。
单片机dma,stm32,单片机,嵌入式硬件
DMA_MemoryDataSize:设定了外设数据宽度。该参数的取值范围如下表。
DMA_Mode:设置了 DMA 的工作模式。该参数的取值范围如下表。
单片机dma,stm32,单片机,嵌入式硬件
注意:当指定 DMA 通道数据传输配置为内存到内存时,不能使用循环缓存模式。
DMA_Priority:设定 DMA 通道 x 的软件优先级。该参数的取值范围如下表。
单片机dma,stm32,单片机,嵌入式硬件
DMA_M2M:使能 DMA 通道的内存到内存传输。该参数的取值范围如下表。
单片机dma,stm32,单片机,嵌入式硬件
这就是DMA的结构体变量的配置信息。

总结

DMA只是一种技术,还要把他和具体的外设结合起来,才能发挥其最大的作用,下一篇我将利用DMA和串口进行数据的收发。文章来源地址https://www.toymoban.com/news/detail-759982.html

到了这里,关于STM32(5)-DMA概念详细解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机 STM32启动文件详解(汇编语言解析)

    以前讲了固件库,从ST官网下载的固件库里面,有许多的启动文件(汇编语言写的.s文件) 启动文件 说明 startup_stm32f10x_ld.s Low Density 小容量 startup_stm32f10x_md.s Medium Density 中容量 startup_stm32f10x_hd.s High Density 高容量 startup_stm32f10x_xl.s Extra Large Density 超大容量 startup_stm32f10x_cl.s Con

    2023年04月25日
    浏览(58)
  • 实训关于stm32单片机的多个传感器应用(附C++源码和解析)

    目录 1.实验的目的和要求 2.设计的软件环境 3.思路流程图 4.关键代码解析 4.1温湿度传感器(要监测当前环境的温度、湿度,通过温湿度传感器来实现的) 4.2.光敏电阻传感器(要监测当前环境的光照(黑天和白天),通过光敏电阻传感器来实现的,如果是黑夜,LED灯就亮蓝色

    2023年04月25日
    浏览(35)
  • STM32 DMA的基本原理和工作机制解析

    STM32微控制器中的DMA(Direct Memory Access,直接内存访问)是一种用于高效数据传输的特殊硬件功能。 DMA允许外设之间直接进行数据传输,而无需CPU的干预。下面,我将为您详细解释STM32 DMA的基本原理和工作机制。 ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

    2024年02月20日
    浏览(46)
  • STM32 串口 DMA 数据读取(详细代码)

    最近重新开始学32,搞到串口 DMA 的时候, 数据读取卡了很长一段时间,最终,功夫不负有心人终于搞出来了。在此以记录一下,方便以后查询使用。 在调试的过程中也遇到了很多bug,有些简直就是低级问题,但是还是卡了很久,在此写出来给自己加深印象,同时已给后来者

    2024年02月16日
    浏览(37)
  • STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

    能够点进这篇文章的小伙伴肯定是对STM32串口DMA空闲中断接收数据感兴趣的啦,今天用这一功能实现串口解析航模遥控器sbus信号时,查阅了很多网友发布的文章(勤劳的搬运工~),包括自己之前写过一篇博客 STM32_HAL库_CubeMx串口DMA通信(DMA发送+DMA空闲接收不定长数据)。本文

    2024年02月09日
    浏览(64)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(57)
  • STM32单片机(一)STM32简介

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(57)
  • STM32单片机(二)STM32环境搭建

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(59)
  • STM32单片机开发-01 STM32介绍

    通过野火开发板学习单片机 从内核上分有Cortex-M0、M3、M4 和M7 F1 代表了基础型,基于Cortex-M3 内核,主频为72MHZ F4 代表了高性能,基于Cortex-M4 内核,主频180M。 数据手册:用于芯片选型和设计原理图 参考手册:用于编程时查阅 Icode总线 – 该总线讲M3内核的指令总线与闪存指令

    2024年01月21日
    浏览(57)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包