|
MCU一般资源小,成本低,绝大数的cortex-m系列都是单线程处理。比如小巧的APM32E030系列。DMA外设却可以不占用MCU的算力,相当于并行处理。 一、DMA模块的核心价值:让CPU从数据搬运中解放 在嵌入式系统中,CPU是核心控制单元,但数据传输这类重复性、高耗时的任务,会大量占用CPU资源,导致其无法实时处理更关键的逻辑运算、中断响应等工作。DMA模块的出现,正是为了解决这一矛盾。 DMA(Direct Memory Access,直接存储器访问)是一种无需CPU直接干预,就能在外设与存储器、存储器与存储器之间实现高速数据传输的硬件技术。它通过为数据传输开辟独立的硬件通道,让数据直接在源地址和目标地址间移动,全程无需CPU参与数据搬运,仅需在传输开始前进行配置、传输结束后接收中断通知即可。 这一特性使得CPU资源得到极大释放,系统整体运行效率显著提升,尤其在数据采集、实时通信、多媒体处理等需要大量数据传输的场景中,DMA的优势更为突出。 二、DMA模块架构与核心特性 以APM32F4系列Cortex-M4芯片为例,其配备两个DMA控制器,共计12个独立通道(DMA1有7个通道,DMA2有5个通道)。每个通道都专门负责管理一个或多个外设的DMA请求,例如ADC1的请求可由DMA1通道1处理,USART1的发送请求对应DMA1通道4,接收请求对应DMA1通道5等。这种多通道设计,让多个外设的数据传输任务可以并行进行,互不干扰,大幅提升了系统的数据吞吐能力。即使是APM32E030的一个DMA控制器,其也有5个通道。 DMA模块支持三种基本传输方向: 外设到内存:常用于数据采集场景,比如ADC将转换后的模拟数据直接传输到内存缓冲区存储; 存到外设:适用于数据发送场景,例如将内存中存储的待发送数据传输到USART外设,实现串口数据的自动发送; 内存到内存:可用于内存区域间的大数据块搬运,比如将Flash中的程序数据复制到SRAM中,该模式仅支持软件触发。
触发方式分为硬件触发和软件触发两类: DMA模块提供了丰富的可配置参数,以适应不同的传输需求: 数据宽度:支持字节(8位)、半字(16位)、全字(32位)三种传输宽度,源地址和目标地址需按所选数据宽度对齐; 传输数量:最大可支持65535个数据单元的传输,满足大数据块传输需求; 循环模式:开启后,当传输完成时,传输数量寄存器会自动重载初始值,实现数据的周期性、连续性传输,适用于需要持续采集或发送数据的场景; 优先级管理:每个通道的优先级可通过软件编程设置,同时当多个通道同时请求传输时,仲裁器会根据通道编号(编号越小优先级越高)和软件设置的优先级进行调度,确保高优先级任务优先执行。
三、DMA模块的工作流程:从配置到传输完成 DMA的工作流程主要分为配置、请求响应、数据传输和传输结束四个阶段: 配置阶段:CPU首先对DMA通道进行初始化配置,包括设置源地址、目标地址、数据宽度、传输数量、传输方向、优先级、循环模式、中断使能等参数,最后使能DMA通道,使其进入就绪状态; 请求响应阶段:对于硬件触发模式,当外设发出DMA请求后,DMA控制器会先判断该通道是否就绪,若就绪则响应请求;对于软件触发模式,CPU配置完成并使能通道后立即触发传输; 数据传输阶段:DMA控制器通过系统总线(AHB/APB)建立源地址到目标地址的数据传输通道,按照配置的参数逐次传输数据。在传输过程中,传输数量寄存器会自动递减,直到减为0; 传输结束阶段:当传输数量寄存器减为0时,DMA会产生传输完成中断(若开启了中断使能),通知CPU传输完成。CPU可在中断服务函数中进行后续处理,例如数据处理、新一轮传输配置等。
好像有点多~~
|