STM32 DMA控制器

embedded/2024/10/17 12:01:55/

目录

STM32 DMA的基本概念

DMA的定义

DMA传输的基本要素

DMA传输过程

DMA的优点与应用

STM32 DMA的结构和主要特征

DMA处理

DMA通道

DMA 中断

DMA的HAL驱动函数


STM32 DMA的基本概念

在很多的实际应用中,有进行大量数据传输的需求,这时如果CPU参与数据的转移,则在数据传输过程中CPU不能进行其他工作。 如果找到一种可以不需要CPU参与的数据传输方式,则可解放CPU,让其去进行其他操作。特别是在大量数据传输的应用中,这一需求显得尤为重要。 直接存储器访问(Direct Memory Access,DMA)就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。DMA是一种可以大大减轻CPU工作量的数据转移方式,用于在外设与存储器之间及存储器与存储器之间提供高速数据传输。DMA操作可以在无须任何CPU操作的情况下快速移动数据,从而解放CPU资源以用于其他操作。DMA使CPU更专注于更加实用的操作——计算、控制等。

DMA的定义

DMA是一个计算机术语,是直接存储器访问(Direct Memory Access)的缩写。它是一种完全由硬件执行数据交换的工作方式,用来提供在外设与存储器之间,或者存储器与存储器之间的高速数据传输

DMA在嵌入式实时系统中的价值

DMA可以在存储器之间交互数据,还可以在存储器和STM32的外围设备(外设)之间交换数据。这种交互方式对应了 DMA 另一种更简单的地址变更规则-地址持续不变。STM32将外设的数据寄存器映射为地址空间中的一个固定地址,当使用 DMA 在固定地址的外设数据寄存器和连续地址的存储器之间进行数据传输时,就能够将外设产生的连续数据自动存储到存储器中,或者将存储器中存储的数据连续地传输到外设中。 以A/D转换器为例,当DMA被配置成从A/D转换器的结果寄存器向某个连续的存储区域传输数据后,就能够在CPU不参与的情况下,得到连续的A/D转换结果。

DMA传输的基本要素

每次DMA传输都由以下基本要素构成。

(1)传输源地址和目的地址:顾名思义,定义了DMA传输的源地址和目的地址。

(2)触发信号:引发DMA进行数据传输的信号。如果是存储器之间的数据传输,则可由软件一次触发后连续传输直至完成即可。数据何时传输,则要由外设的工作状态决定,并且可能需要多次触发才能完成。

(3)传输的数据量:每次DMA数据传输的数据量及DMA传输存储器的大小。

(4)DMA通道:每个DMA控制器能够支持多个通道的DMA传输,每个DMA通道都有自己独立的传输源地址和目的地址,以及触发信号和传输数量。当然各个DMA通道使用总线的优先级也不相同。

(5)传输方式:包括 DMA 传输是在两块存储器间还是存储器和外设之间进行;传输方向是从存储器到外设,还是外设到存储器;存储器地址递增的方式和递增值的大小,以及每次传输的数据宽度(8位、16位或32位等);到达存储区域边界后地址是否循环等要素(循环方式多用于存储器和外设之间的DMA数据传输)。

(6)其他要素:包括DMA 传输通道使用总线资源的优先级,DMA完成或出错后是否起中断等要素。

DMA传输过程

具体地说,一个完整的DMA数据传输过程如下:

(1)DMA请求。CPU初始化DMA控制器,外设(1/O接口)发出DMA请求。

(2)DMA响应。DMA控制器判断DMA请求的优先级及屏蔽,向总线仲裁器提出总线请求。当CPU执行完当前总线周期时,可释放总线控制权。此时,总线仲裁器输出总线应答,表示DMA已经响应,DMA控制器从CPU接管对总线的控制,并通知外设(I/O接口)开始DMA传输。

(3)DMA传输。DMA数据以规定的传输单位(通常是字)传输,每个单位的数据传送完成后,DMA控制器修改地址,并对传送单位的个数进行计数,继而开始下一个单位数据的传送,如此循环往复,直至达到预先设定的传送单位数量为止。

(4)DMA结束。当规定数量的DMA数据传输完成后,DMA控制器通知外设(I/O接口)停止传输,并向CPU发送一个信号(产生中断或事件)报告DMA数据传输操作结束,同时释放总线控制权。

DMA的优点与应用

DMA具有以下优点: 首先,从CPU使用率角度,DMA控制数据传输的整个过程,既不通过CPU,也不需要CPU干预,都在DMA控制器的控制下完成。因此,CPU除了在数据传输开始前配置,在数据传输结束后处理外,在整个数据传输过程中可以进行其他的工作。DMA降低了CPU的负担,释放了CPU资源,使得CPU的使用效率大大提高。 其次,从数据传输效率角度,当CPU负责存储器和外设之间的数据传输时,通常先将数据从源地址存储到某个中间变量,再将数据从中间变量转送到目标地址上。当使用DMA由DMA控制器代替CPU负责数据传输时,不再需要通过中间变量,而直接将源地址上的数据送到目标地址。这样,显著地提高了数据传输的效率,能满足高速I/O设备的要求。

最后,从用户软件开发角度,由于在DMA数据传输过程中,没有保存现场、恢复现场之类的工作。而且存储器地址修改、传送单位个数的计数等也不是由软件而是由硬件直接实现的。因此,用户软件开发的代码量得以减少,程序变得更加简洁,编程效率得以提高。

STM32 DMA的结构和主要特征

STM32的两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自一个或多个外设对存储器访问的请求。还有一个仲裁器协调各个DMA请求的优先权。DMA的功能框图如图所示。 STM32F103VET6的DMA模块具有如下特征。

(1)12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道。

(2)每个通道都直接连接专用的硬件DMA请求,每个通道都支持软件触发。这些功能通过软件配置。

(3)在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有4级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,以此类推)。

(4)独立数据源和目标数据区的传输宽度(字节、半字、全字)是独立的,模拟打包和拆包的过程。源和目的地址必须按数据传输宽度对齐。

(5)支持循环的缓冲器管理。

(6)每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志通过逻辑“或”运算成为一个单独的中断请求。

(7)存储器和存储器间的传输。

(8)外设和存储器、存储器和外设之间的传输。

(9)闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。

(10)可编程的数据传输最大数目为65536。

STM32 DMA的功能描述

DMA控制器和Cortex-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)使用时间。

DMA处理

发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给外设一个应答信号。当从DMA控制器得到应答信号时,外设立即释放请求。一旦外设释放了请求,DMA控制器同时撤销应答信号。如果有更多的请求,外设可以在下一个周期启动请求。 总之,每次DMA传送由3个操作组成:

(1)从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址读取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。

(2)将读取的数据保存到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。

(3)执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

仲裁器

仲裁器根据通道请求的优先级启动外设/存储器的访问。 优先权管理分两个阶段。

(1)软件:每个通道的优先权可以在DMA_CCRx寄存器中的PL[1:0]设置,有4个等级:最高优先级、高优先级、中等优先级、低优先级。

(2)硬件:如果两个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。例如,通道2优先于通道4。 DMA1控制器的优先级高于DMA2控制器的优先级。

DMA通道

每个通道都可以在有固定地址的外设寄存器和存储器之间执行DMA传输。DMA传输的数据量是可编程的,最大为65535。数据项数量寄存器包含要传输的数据项数量,在每次传输后递减。

1.    可编程的数据量 外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程设置。

2.    指针增量 通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以有选择地完成自动增量。

3.    通道配置过程 下面是配置DMA通道x的过程(x代表通道号):

(1)在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。

(2)在DMA_CMARx寄存器中设置数据存储器的地址。发生存储器数据传输请求时,传输的数据将从这个地址读出或写入这个地址。

(3)在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。 (4)在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。

(5)在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。

(6)设置DMA_CCRx寄存器的ENABLE位,启动该通道。 一旦启动了DMA通道,即可响应连到该通道上的外设的DMA请求。

4.    循环模式 循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。DMA_CCR寄存器中的CIRC位用于开启这一功能。当循环模式启动时,要被传输的数据数目会自动地被重新装载成配置通道时设置的初值,DMA操作将会继续进行。

5.    存储器到存储器模式 DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。

DMA 中断

每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位打开这些中断。相关的中断事件标志位及对应的使能控制位分别为: (1)“传输过半”的中断事件标志位是HTIF,中断使能控制位是HTIE。

(2)“传输完成”的中断事件标志位是TCIF,中断使能控制位是TCIE。

(3)“传输错误”的中断事件标志位是TEIF,中断使能控制位是TEIE。

DMA的HAL驱动函数

DMA的HAL驱动程序头文件是stm32f1xx_hal_dma.h和stm32f1xx_hal_dma_ex.h,主要驱动函数如表

DMA 传输初始化配置

函数HAL_DMA_Init()用于DMA传输初始化配置,其原型定义如下: HAL_StatusTypeDef  HAL_DMA_Init(DMA_HandleTypeDef *hdma); 其中,hdma是DMA_HandleTypeDef结构体类型指针。结构体DMA_HandleTypeDef的完整定义如下,各成员变量的意义见注释: typedef struct DMA_HandleTypeDef { DMA_Stream_TypeDef          * Instance;       //DMA流寄存器基址,用于指定一个DMA流DMA_InitTypeDef              Init;            //DMA传输的各种配置参数 HAL_LockTypeDef             Lock;          //DMA 锁定状态 _IO HAL_DMA_StateTypeDef    State          //DMA 传输状态 void    * Parent;                        //父对象,即关联的外设对象 /*DMA传输完成事件中断的回调函数指针 */ void (* XferCpltCallback)(struct _DMA_HandleTypeDef *  hdma); /*DMA传输半完成事件中断的回调函数指针 */ void (* XferHalfCpltCallback)(struct_DMA_HandleTypeDef *  hdma); /*DMA 传输完成Memory1 回调函数指针*/

void (* XferM1CpltCallback)(struct _DMA_HandleTypeDef * hdma); /*DMA 传输错误事件中断的回调函数指针 */ void (*  XferM1HalfCpltCal1back)(struct_DMA_HandleTypeDef *  hdma); /* DMA 传输中止回调函数指针 */ void (*  XferErrorCallback) (struct _DMA_HandleTypeDef *  hdma);

_IO  uint32_t    ErrorCode;             //DMA错误码 uint32_t         StreamBaseAddress;     //DMA流基址 uint32_t         StreamIndex;          //DMA 流索引号 }DMA_HandleTypeDef; 结构体 DMA_HandleTypeDef的成员指针变量Instance要指向一个DMA流的寄存器基址。 其成员变量Init是结构体类型 DMA_InitTypeDef,它存储了13.1.2节介绍的DMA传输的各种属性参数。结构体DMA_HandleTypeDef还定义了多个用于DMA事件中断处理的回调函数指针。

存储DMA 传输属性参数的结构体DMA_InitTypeDef的完整定义如下,各成员变量的意义见注释:

typedef  struct { uint32_t  Channel;                //DMA通道,也就是外设的DMA请求 uint32_t  Direction;              //DMA 传输方向 uint32_t  PeriphInc;              //外设地址指针是否自增 uint32_t  MemInc;               //存储器地址指针是否自增 uint32_t  PeriphDataAlignment;    //外设数据宽度 uint32_t  MemDataAlignment;     //存储器数据宽度 uint32_t  Mode;                 //传输模式,即循环模式或正常模式

uint32_t  Priority;                 //DMA流的软件优先级别 uint32_t  FIFOMode;           //FIFO模式,是否使用FIFO uint32_t  FIFOThreshold;    //FIFO阈值,1/4、1/2、3/4或1 uint32_t  MemBurst;            //存储器突发传输数据量 uint32_t  PeriphBurst;          //外设突发传输数据量 }DMA_InitTypeDef; 结构体DMA_InitTypeDef的很多成员变量的取值是宏定义常量,具体的取值和意义在后面示例里通过STM32CubeMX的设置和生成的代码解释。

启动DMA数据传输

在完成DMA传输初始化配置后,我们就可以启动DMA数据传输了。DMA数据传输有轮询方式和中断方式。每个DMA流都有独立的中断地址,有传输完成中断事件,使用中断方式的DMA数据传输更方便。函数HAL_DMA_Start_IT()以中断方式启动DMA数据传输,其原型定义如下: HAL_StatusTypeDef  HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma,uint32_t SrcAddress,uint32_t  DstAddress,uint32_t  DataLength) 其中,hdma是DMA流对象指针,SrcAddress是源地址,DstAddress是目标地址,DataLength是需要传输的数据长度。


http://www.ppmy.cn/embedded/128159.html

相关文章

UE5 猎户座漂浮小岛 03 视觉效果 粒子

UE5 猎户座漂浮小岛 03 视觉效果 粒子 1.视觉效果 1.1 指数级高度雾 fog指数高度雾组件 0.1、1.4 内颜-淡蓝体雾 1.2 体积光 太阳 directionallight-强度光强-3颜色-淡蓝光束-遮 遮暗-0.018范-10000 1.3 天光 天空照亮,泛光,照大地 skylight强范…

Javascript——html生成并预览 PDF及html导出为Word

html生成并预览 PDF <template><div><div ref"content"><!-- 这里放置你想要转换为 PDF 的 HTML 内容 --><h1>标题</h1><p>这是一些内容。</p></div><button click"exportToPDF">生成并预览 …

R语言绘制聚类热图

聚类热图是一种直观的数据可视化工具。它以矩形彩色图表的形式呈现数据矩阵&#xff0c;每个单元格颜色对应特定数值&#xff0c;通常从低值的冷色调到高值的暖色调渐变。常应用于多个领域&#xff0c;如生物学中分析基因表达、蛋白质相互作用和生物群落&#xff1b;金融领域用…

git gui基本使用

一、图形化界面 二、创建新项目 创建文件&#xff0c;加入暂存区&#xff0c;提交到版本库 三、创建分支 四、合并分支 1.切换至master 五、更新分支 六、解决冲突 修改冲突&#xff0c;加入暂存区&#xff0c;提交到版本库 七、远程创建库 Gitee - 基于 Git 的代码托管和研…

自动驾驶系列—自动驾驶整体开放平台:如何加速无人驾驶技术的落地?

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Excel多级结构转成树结构形式

第一步&#xff1a;Excel文件的形式如下 第二步&#xff1a;转换成树结构可选形式 第三步&#xff1a;具体怎么实现&#xff1f; &#xff08;1&#xff09;、需要借助数据库中表来存储这些字段&#xff0c;一张表&#xff08;aa&#xff09;存Excel文件中的所有数据&#xff…

如何通过计算巢在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具&#xff0c;专为开发者构建定制的语言学习模型&#xff08;LLM&#xff09;应用而设计。 通过其拖放式界面&#xff0c;用户可以轻松创建和管理AI驱动的交互式应用&#xff0c;如聊天机器人和数据分析工具。 它基于Lang…

【分布式微服务云原生】《虚拟服务器之暗面:性能损耗、噪音邻居与安全隐私挑战全解析》

标题&#xff1a;《虚拟服务器之暗面&#xff1a;性能、邻居与隐私挑战全解析》 摘要&#xff1a;本文深入探讨虚拟服务器在带来诸多便利的同时&#xff0c;所面临的性能损耗、噪音邻居以及安全隐私问题。读者将全面了解这些问题的具体表现、产生原因以及应对措施&#xff0c;…