STM32G4系列MCU的Direct memory access controller (DMA)功能介绍之二

news2024/11/30 13:12:53

目录

概述

1  DMA通道

1.1 可编程数据大小

1.2 指针增量

2 通道配置

2.1 配置步骤

2.2 通道状态和禁用通道

3 模式应用

3.1 循环模式(内存到外设/外设到内存的传输)

3.2 内存到内存模式

3.3 Peripheral-to-peripheral模式

3.4 编程转移方向,分配源/目的

3.5 DMA数据宽度、对齐方式和端序

3.6 寻址不支持字节/半字写入传输的AHB外设 

4 DMA错误和中断

4.1 DMA错误管理

4.2 DMA中断


概述

本文主要介绍STM32G4系列MCU的DMA的通道,配置参数,模式应用,以及DMA的的错误和中断参数。

1  DMA通道

每个通道可以处理位于固定地址的外设寄存器和存储器地址之间的DMA传输。传输的数据项的数量是可编程的。包含要传输的数据项数量的寄存器在每次传输后递减。

DMA通道是在块传输级编程的。

1.1 可编程数据大小

单个数据(字节、半字或字)传输到外设和内存的大小分别通过PSIZE[1:0]和MSIZE[1:0]字段可编程DMA_CCRx登记。

1.2 指针增量

根据DMA_CCRx寄存器的PINC和MINC位,外设和内存指针可以在每次传输后自动增加。

如果启用增量模式(PINC或MINC设置为1),则下一次传输的地址是前一次传输的地址,根据PSIZE[1:0]或MSIZE[1:0]中定义的数据大小增加1、2或4。第一个转移地址是在DMA_CPARx或DMA_CMARx寄存器中编程的地址。在传输过程中,这些寄存器保持初始编程值。当前的传输地址(在当前内部外设/存储器地址寄存器中)不能被软件访问。

如果通道x配置为非循环模式,则在最后一次数据传输之后(一旦要传输的单个数据数量达到零)不提供DMA请求。为了将新数量的数据项重新加载到DMA_CNDTRx寄存器中,必须禁用DMA通道。

注意点:

如果通道x被禁用,DMA寄存器不会重置。DMA通道寄存器(DMA_CCRx, DMA_CPARx和DMA_CMARx)保留在通道配置阶段编程的初始值。

-

在循环模式下,在最后一次数据传输之后,DMA_CNDTRx寄存器会自动重新加载初始编程值。当前的内部地址寄存器用来自DMA_CPARx和DMA_CMARx寄存器的基址值重新加载。

2 通道配置

2.1 配置步骤

配置DMA通道x需要遵循以下顺序:

1) 在DMA_CPARx寄存器中设置外设寄存器地址。在外设事件之后,或者在内存到内存模式下启用通道之后,数据从这个地址移动到内存。

-

2)在DMA_CMARx寄存器中设置内存地址。数据在外设事件之后或通道在内存到内存模式下启用之后写入/读取内存。

-

3)配置要在DMA_CNDTRx寄存器中传输的数据总数。每次数据传输后,该值将递减。

-

4)在DMA_CCRx寄存器中配置以下参数:

   -通道优先级
   -数据传输方向
   -圆形模式
   -外设和内存增量模式
  -外设和内存数据大小
   -中断使能在一半和/或全部传输和/或传输错误

-

5)通过在DMA_CCRx寄存器中设置EN位来激活通道。

 通道一旦启用,就可以为连接到该通道的外设发出的任何DMA请求提供服务,也可以启动内存到内存的块传输。

注意点:

通道配置过程的最后两个步骤可以合并为对DMA_CCRx寄存器的单个访问,以配置和启用通道。

2.2 通道状态和禁用通道

处于活动状态的通道x是已启用的通道(读作DMA_CCRx)。EN = 1)。活动通道x是必须由软件(DMA_CCRx)启用的通道。EN设置为1),之后没有发生传输错误(DMA_ISR。如果有传输错误,则由硬件自动禁用通道(DMA_CCRx. 0)。En = 0)。

以下三种用例可能会发生:

1)挂起和恢复通道


这对应于以下两个动作:
—通过软件(写入DMA_CCRx)禁用主用通道。EN = 0而
DMA_CCRx。En = 1)。
—软件重新使能通道(DMA_CCRx)。EN设置为1),无需重新配置其他通道寄存器(如DMA_CNDTRx, DMA_CPARx和DMA_CMARx)。
DMA硬件不支持这种情况,这不能保证正确执行剩余的数据传输

-

2)停止并中止一个通道

如果应用程序不再需要该通道,则可以通过软件禁用此活动通道。通道被停止和中止,但是DMA_CNDTRx寄存器内容可能不能正确反映剩余的数据传输与中止的源和目标缓冲区/寄存器。

-

3)中止并重新启动信道

这对应于软件顺序:禁用活动通道,然后重新配置通道并再次启用它。

如果满足以下条件,则硬件支持此操作:

 --- 1)

应用程序保证,当软件禁用通道时,一个DMA数据传输不是在它的主端口上同时发生的。例如,应用程序可以首先禁用DMA模式下的外设,以确保没有来自该外设的未决硬件DMA请求。

---2)

软件必须对同一个DMA_CCRx寄存器进行单独的写访问:首先禁用通道。其次,如果需要更改配置,则重新配置通道以进行下一个块传输,包括DMA_CCRx。当DMA_CCRx. en =1时,存在只读的DMA_CCRx寄存器字段。最后再次启用通道。

当发生通道传输错误时,硬件清除DMA_CCRx寄存器的EN位。这个EN位不能通过软件再次设置来重新激活通道x,直到设置DMA_ISR寄存器的TEIFx位。

3 模式应用

3.1 循环模式(内存到外设/外设到内存的传输)

循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。该特性使用DMA_CCRx寄存器中的CIRC位启用。

注意点:

循环模式不能在内存到内存模式中使用。在启用通道处于圆形模式(CIRC = 1)时,软件必须清除MEM2MEM位DMA_CCRx登记。当循环模式被激活时,要传输的数据量将自动重新加载在通道配置期间编程的初始值阶段,DMA请求继续得到服务。

 为了停止循环传输,软件需要停止外设的生成DMA请求(如退出ADC扫描模式),在禁用DMA通道之前。软件必须在开始/启用传输之前,以及在停止循环传输之后显式地编程DMA_CNDTRx值。

3.2 内存到内存模式

DMA通道可以在没有外设请求触发的情况下运行。这种模式称为内存对内存模式,由软件发起。

如果设置了DMA_CCRx寄存器中的MEM2MEM位,则通道(如果启用)将启动传输。一旦DMA_CNDTRx寄存器达到零,传输就会停止。

注意点:

不能在循环模式中使用内存到内存模式。在启用内存对内存模式(MEM2MEM = 1)的通道之前,软件必须清除DMA_CCRx寄存器的CIRC位。

3.3 Peripheral-to-peripheral模式

 任何DMA通道都可以在外设到外设模式下工作:

•当外设的硬件请求被选择触发DMA通道时这个外设是DMA启动器,将数据从这个外设传输到一个属于另一个内存映射外设(这个外设没有配置在DMA模式下)的寄存器。

-
•当没有外设请求被选择并连接到DMA通道时软件通过设置DMA_CCRx寄存器的MEM2MEM位来配置寄存器到寄存器的传输。

3.4 编程转移方向,分配源/目的

DMA_CCRx寄存器的DIR位的值设置了传输的方向,因此,它标识源和目标,而不管源/目标类型(外设或内存):

DIR =  1通常定义内存到外设的传输。更一般地说,如果DIR = 1:

--- 1)源属性由DMA_MARx寄存器、MSIZE[1:0]字段和DMA_CCRx寄存器的MINC位定义。
不管它们通常的命名是什么,这些“内存”寄存器、字段和位都用于在外设到外设模式下定义源外设。

-

--- 2)目标属性由DMA_PARx寄存器、PSIZE[1:0]字段和DMA_CCRx寄存器的pin位定义。
不管它们通常的命名是什么,这些“外设”寄存器、字段和位被用来在内存对内存模式下定义目标内存。

DIR = 0通常定义一个外设到内存的传输。更一般地,如果DIR = 0:

 -- 1) 源属性由DMA_PARx寄存器、PSIZE[1:0]字段和DMA_CCRx寄存器的pin位定义。
不管它们通常的命名是什么,这些“外设”寄存器、字段和位被用来在内存对内存模式下定义源内存

-

-- 2) 目标属性是由DMA_MARx寄存器定义的MSIZE[1:0]字段和DMA_CCRx寄存器的MINC位。不管它们通常的命名是什么,这些“内存”寄存器、字段和位被用来在外设到外设模式下定义目标外设。

3.5 DMA数据宽度、对齐方式和端序

 当PSIZE[1:0]和MSIZE[1:0]不相等时,DMA控制器执行一些数据对齐,如下表所示。

3.6 寻址不支持字节/半字写入传输的AHB外设 

当DMA控制器发起AHB字节或半字写传输时,数据在AHB主32位数据总线(HWDATA[31:0])的未使用的通道上复制。


当AHB从外设不支持字节或半字写传输并且不产生任何错误时,DMA控制器写入32个HWDATA位,如下面的两个示例所示:

1) 要写半字0xABCD, DMA控制器将HWDATA总线设置为具有半字数据大小的0xABCDABCD (AHB主总线中的HSIZE = HalfWord)。

-

2)为了写字节0xAB, DMA控制器将HWDATA总线设置为0xABABABAB,并设置字节数据大小(HSIZE = AHB主总线中的字节)。

假设AHB/APB网桥是AHB 32位从外设,不考虑HSIZE数据,任何AHB字节或半字传输都将更改为32位APB传输,如下所述:

1) 从0xB0到0x0、0x1、0x2或0x3地址之一的AHB字节写传输被转换为从0xB0B0B0B0到0x0地址的APB字写传输。

-

2)从0xB1B0到0x0或0x2地址的AHB半字写传输被转换为从0xB1B0B1B0到0x0地址的APB字写传输。 

4 DMA错误和中断

4.1 DMA错误管理

当读取或写入保留的地址空间时,会产生DMA传输错误。当DMA读或写访问期间发生DMA传输错误时,通过硬件清除相应DMA_CCRx寄存器中的EN位,自动禁用故障通道x。

设置DMA_ISR寄存器的TEIFx位。如果设置了DMA_CCRx寄存器的TEIE位,则会产生中断。
DMA_CCRx寄存器的EN位不能通过软件再次设置(通道x重新激活),直到DMA_ISR寄存器的TEIFx位被清除(通过设置DMA_IFCR寄存器的CTEIFx位)。
当软件在一个涉及外设的通道上收到传输错误通知时,软件必须首先在DMA模式下停止这个外设,以便禁用任何挂起的或将来的DMA请求。然后软件通常可以重新配置DMA和DMA

4.2 DMA中断

中断可以对传输的一半、传输完成或传输错误分别产生单独的中断使能位可用于灵活性

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

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

相关文章

【一文读懂】大语言模型

学习参考 项目教程:中文教程 代码仓库:代码地址 仓库代码目录说明: requirements.txt:官方环境下的安装依赖 notebook:Notebook 源代码文件 docs:Markdown 文档文件 figures:图片 data_base&…

注册表修改键盘位置

1.winr 输入 regedit 2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 3.右键Keyboard Layout->新建->二进制值->取名Scancode Map 4.右键Scancode Map,修改如下 //第一列 自动生成序号,不用管 第一行 输入8个00 第二…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时,解决方法需要根据服务器的操作系统(如 Linux 或 Windows )和具体服务器环境来处理。以下是常见的解决办法: 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

shell脚本编写练习2

1.准备阶段 在根目录下创建一个目录来存储shell脚本 mkdir /s3 2.题目 1. 使用case实现成绩优良差的判断 #!/bin/bash# 假设成绩存储在变量GRADE中 read -p "请输入成绩(0-100):" GRADE# 使用case语句进行判断 case $GRADE in[…

清远榉之乡托养机构探讨:自闭症的本质辨析

当人们谈及自闭症时,常常会产生一个疑问:自闭症是精神类疾病吗?今天,清远榉之乡托养机构就来为大家解开这个疑惑。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校,一直致力于为大龄自闭症患者提供专业的支持…

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速,汽车保有量也不断增长,导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求,通常会部署监控设备进行车位监测、现场安全监测等,助力构建智能化停车管理。因此如何为分…

.net XSSFWorkbook 读取/写入 指定单元格的内容

方法如下&#xff1a; using NPOI.SS.Formula.Functions;using NPOI.SS.UserModel;using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;/// <summary>/// 读取Excel指定单元格内容/// </summa…

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…

红日靶场-5

环境搭建 这个靶场相对于前几个靶场来说较为简单&#xff0c;只有两台靶机&#xff0c;其中一台主机是win7&#xff0c;作为我们的DMZ区域的入口机&#xff0c;另外一台是windows2008&#xff0c;作为我们的域控主机&#xff0c;所以我们只需要给我们的win7配置两张网卡&#…

[Java]微服务之分布式事务

介绍 下单业务&#xff0c;前端请求首先进入订单服务&#xff0c;创建订单并写入数据库。然后订单服务调用购物车服务和库存服务: 购物车服务负责清理购物车信息库存服务负责扣减商品库存 问题分析: 下单过程中, 订单服务创建订单, 插入自己的数据库, 执行成功购物车服务, 清…

存储结构及关系(一)

学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…

cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection

原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection&#xff0c;构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…

AMD的AI芯片Instinct系列介绍

AMD最强AI芯片发布&#xff01; 在旧金山举行的Advancing AI 2024大会上&#xff0c;AMD推出Instinct MI325X AI加速器&#xff08;以下简称MI325X&#xff09;&#xff0c;直接与英伟达的Blackwell芯片正面交锋。 现场展示的数据显示&#xff0c;与英伟达H200的集成平台H200 …

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…

kali linux 装 virtual box 增强工具 Guest Addition

kali linux 装 virtual box 增强工具 Guest Addition install Virtual Box Guest Addition in kali linux 搞了一下午&#xff0c;最终发现是白折腾。 kali linux 自带 virtual box 的增强工具。 kali linux 2021.3 之后的版本都是自带virtual box 增强工具 解决方法 直接…

vue3请求接口报错:Cannot read properties of undefined (reading ‘data‘)

文章目录 报错内容解决方案 报错内容 Cannot read properties of undefined (reading ‘data’) 解决方案 响应未按预期返回 确保服务器返回的数据结构符合预期。例如&#xff0c;服务器可能返回了一个错误响应&#xff0c;而不是预期的 JSON 数据。 检查响应 在 response 拦…

RocketMQ rocketmq-tools管理主题

RocketMQ rocketmq-tools管理主题 环境和软件版本增删改查 环境和软件版本 Win10、IDEA、Jdk1.8、rocketmq 5.1.3、rocketmq-tools 5.1.3 引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-tools</artifactId&g…

《datawhale2411组队学习 模型压缩技术7:NNI剪枝》

文章目录 一、NNI简介二、 NNI剪枝快速入门2.1 加载并训练模型2.2 模型剪枝2.3 模型加速&#xff08;剪枝永久化&#xff09;2.4 微调压缩模型2.5 Slim Pruner测试 三、 使用NNI3.0进行Bert压缩&#xff08;剪枝、蒸馏)3.1 数据预处理3.2 训练模型3.3 设置模型蒸馏函数3.4 修剪…

C#学写了一个程序记录日志的方法(Log类)

1.错误和警告信息单独生产文本进行记录&#xff1b; 2.日志到一定内存阈值可以打包压缩&#xff0c;单独存储起来&#xff0c;修改字段MaxLogFileSizeForCompress的值即可&#xff1b; 3.Log类调用举例&#xff1a;Log.Txt(JB.信息,“日志记录内容”,"通道1"); usi…