当前位置: 首页 > article >正文

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

目录

概述

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)中止并重新启动信道

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

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

 3.1)

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

-

3.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.kler.cn/a/420106.html

相关文章:

  • Qt几何数据类型:QLine类型详解(基础向)
  • Vue框架开发一个简单的购物车(Vue.js)
  • JAVA中HashMap、TreeMap、LinkedHashMap 的用法与注意事项
  • [NOIP2015 提高组] 神奇的幻方
  • 基于vite6+ vue3 + electron@33 实现的 局域网内互传文件的桌面软件
  • 6.824/6.5840 Lab 1: MapReduce
  • mysql 5.7安装及安装后无法启动问题处理
  • C++:unordered_map与unordered_set详解
  • 2-jsp-实现增删改功能
  • 【从0学英语】形容词性/名词性物主代词是什么?
  • 深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接
  • 一.准备环境,从零开始搭建项目
  • Hive学习基本概念
  • Java 中 ArrayList 与 LinkedList 的详细比较
  • 什么是 KDE?
  • numpy.float8不存在;Python中,实现16位浮点数
  • 种花问题算法
  • 运维工作常用Shell脚本(Commonly Used Shell Scripts for Operation and Maintenance Work)
  • 深入解析 Python 异步编程中的 `gather`、`as_completed` 和 `wait`
  • SQL注入--基本概念
  • 01-标准库开发-STM32定时器
  • 为什么在服务器上设置 fish 为默认 shell, vscode remote ssh 默认还是 bash?
  • flink学习(13)—— 重试机制和维表join
  • 在 uniapp 项目中使用 Iconify 字体图标库
  • 《Python PDF 格式转换全攻略》
  • Linux 进程管理详解