【嵌入式系统】DMA工作原理与常用函数解析

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
全局流量管理 GTM,标准版 1个月
简介: 【嵌入式系统】DMA工作原理与常用函数解析

嵌入式系统】DMA工作原理与常用函数解析

1、DMA基本原理

直接存储器访问通道(DMA, Direct Memory Access)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。CPU只需初始化DMA,传输本身由DMA控制器来实现而无须CPU干预。DMA挂载在AHB上且数据传输前后不必保存上下文,因此数据可通过DMA高速移动。设置DMA的目的是:通过硬件为存储器和外设间开通若干个直接进行数据传输的通道,节约CPU资源。


image.png

例如图1所示,APB2上挂载的某个外设发起DMA请求,当DMA由CPU使能后开启相应的DMA通道,于是外设通过DMA通道、总线矩阵直接进行了对内存的读或写操作。

2 DMA通道与配置


image.png

大容量STM32 MCU有两个DMA控制器,共12个通道(DMA1有7个通道,DMA2有5个通道),通道的基本属性如图2所示

image.png

如图4所示,DMA每个通道提前规定了特定外设和存储器间的直接数据交换。例如,外设ADC1只能通过Access1与内存进行数据交换,在配置DMA源和目的基地址时要遵照图4所示的预设规定。


image.png

由于DMA控制器一次只能开启一个通道,因此若同一时间有多个来自不同通道的外设进行DMA请求,就需要通过通道优先级来使能高优先级通道(当优先级相同时,通道标号小的优先使能)。DMA控制器内部有一个仲裁器来协调各个DMA请求的优先权。


若配置内存外设数据单位相同,则从源地址处读取一个单位数据包,往目的地址出写一个相同宽度的数据包即可。若两者单位不相同,就要参考“可编程的数据宽度”对照表进行数据传输操作。

3、DMA使用流程与相关函数


image.png

由于DMA通道需要配置的参数较多,因此使用结构体来简化API输入参数。因此这里先根据需要配置结构体DMA_InitStructure,其成员变量如图2所示均为通道基本参数;再以DMA结构体指针作为DMA_Init()的输入参数,在其内部配置相应的寄存器。接下来对DMA_Init()函数作解析,其余函数类似。

void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct)
{
  uint32_t tmpreg = 0;
/*--------------------------- DMAy Channelx CCR Configuration -----------------*/
  /* Get the DMAy_Channelx CCR value */
  tmpreg = DMAy_Channelx->CCR;
  /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */
  tmpreg &= CCR_CLEAR_Mask;
  /* Configure DMAy Channelx: data transfer, data size, priority level and mode */
  /* Set DIR bit according to DMA_DIR value */
  /* Set CIRC bit according to DMA_Mode value */
  /* Set PINC bit according to DMA_PeripheralInc value */
  /* Set MINC bit according to DMA_MemoryInc value */
  /* Set PSIZE bits according to DMA_PeripheralDataSize value */
  /* Set MSIZE bits according to DMA_MemoryDataSize value */
  /* Set PL bits according to DMA_Priority value */
  /* Set the MEM2MEM bit according to DMA_M2M value */
  tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode |
            DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc |
            DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize |
            DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M;
  /* Write to DMAy Channelx CCR */
  DMAy_Channelx->CCR = tmpreg;
/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/
  /* Write to DMAy Channelx CNDTR */
  DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;
/*--------------------------- DMAy Channelx CPAR Configuration ----------------*/
  /* Write to DMAy Channelx CPAR */
  DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr;
/*--------------------------- DMAy Channelx CMAR Configuration ----------------*/
  /* Write to DMAy Channelx CMAR */
  DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr;
}

首先配置DMA_CCR。由于CCR中包含了数据传输方向、数据单位等大量信息,为便于修改和程序移植,函数定义了32bits的临时寄存器tmpreg用于存储这些信息。tmpreg首先捕获当前DMA_CCR的位向量并使用掩码CCR_CLEAR_Mask进行复位,防止置位时产生进位错误。事实上出于安全起见,置位操作前都应该掩去即将要设置的位,今后类似的做法不再赘述。将置位的tmpreg后传给对应通道的CCR即可完成寄存器对应的配置。


image.png

接下来通过DMA结构体依次配置CNDTR(记录传输数据大小)、CPAR(外设基地址)、CMAR(内存基地址)。

目录
相关文章
|
3天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
31 13
|
23天前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
21天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
55 1
|
15天前
|
安全 前端开发 Android开发
探索移动应用与系统:从开发到操作系统的深度解析
在数字化时代的浪潮中,移动应用和操作系统成为了我们日常生活的重要组成部分。本文将深入探讨移动应用的开发流程、关键技术和最佳实践,同时分析移动操作系统的核心功能、架构和安全性。通过实际案例和代码示例,我们将揭示如何构建高效、安全且用户友好的移动应用,并理解不同操作系统之间的差异及其对应用开发的影响。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和知识。
|
18天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
27 5
|
19天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
47 3
|
22天前
|
机器学习/深度学习 人工智能 数据处理
【AI系统】NV Switch 深度解析
英伟达的NVSwitch技术是高性能计算领域的重大突破,旨在解决多GPU系统中数据传输的瓶颈问题。通过提供比PCIe高10倍的带宽,NVLink实现了GPU间的直接数据交换,减少了延迟,提高了吞吐量。NVSwitch则进一步推动了这一技术的发展,支持更多NVLink接口,实现无阻塞的全互联GPU系统,极大提升了数据交换效率和系统灵活性,为构建强大的计算集群奠定了基础。
53 3
|
24天前
|
机器学习/深度学习 自然语言处理 语音技术
揭秘深度学习中的注意力机制:兼容性函数的深度解析
揭秘深度学习中的注意力机制:兼容性函数的深度解析
|
21天前
|
前端开发 Android开发 UED
移动应用与系统:从开发到优化的全面解析####
本文深入探讨了移动应用开发的全过程,从最初的构思到最终的发布,并详细阐述了移动操作系统对应用性能和用户体验的影响。通过分析当前主流移动操作系统的特性及差异,本文旨在为开发者提供一套全面的开发与优化指南,确保应用在不同平台上均能实现最佳表现。 ####
24 0
|
22天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
45 0

推荐镜像

更多
下一篇
DataWorks