打印

GD32F130之DMA

[复制链接]
3229|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
什么是DMA

DMA,即Direct Memory Access,是一种在无需CPU参与的情况下,将数据块在内存(SRAM)和外设(一般是I/O设备)之间高效传输的硬件机制。实现这种功能的集成电路单元叫做DMA Controller,即DMA 控制器。


使用特权

评论回复
评论
自动化陈稳 2023-9-30 19:30 回复TA
———————————————— 版权声明:本文为CSDN博主「哈士奇上蔚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/luliplus/article/details/123723700 
沙发
自动化陈稳|  楼主 | 2023-9-30 19:30 | 只看该作者
使用DMA的好处
一般情况下,为了实现内存(SRAM)和外设(一般是I/O设备)之间的数据传输,有三种常用的方法:轮循法(polling),中断法(interrupt)以及本文要介绍的DMA方法。

使用特权

评论回复
板凳
自动化陈稳|  楼主 | 2023-9-30 19:30 | 只看该作者
轮循法(polling):在主循环中,CPU不断检查外设的相关标志位,来判断其是否需要进行数据的传输,如果有,则CPU将数据在外设和内存之间搬运,实现数据传输。当数据传输服务请求频繁或者的数据量很大时,会影响其他任务的实时性。由于其他任务的存在,也会影响数据传输的实时性。

使用特权

评论回复
地板
自动化陈稳|  楼主 | 2023-9-30 19:30 | 只看该作者
中断法(interrupt):当外设需要传输数据时,会触发中断,CPU会暂停正在处理的任务,转而去处理外设的数据传输任务。CPU无需反复检查外设的标志位,中断机制会指示CPU何时去处理外设数据,但是依然需要CPU去完成数据搬运和传输过程。当外设数据传输服务发生不频繁,且数据量不大时,中断法也是不错的选择。当中断连续不断且频繁发生时,中断法变得不再高效,因为在恢复主流程的执行和中断响应的上下文切换上会占用大量CPU时间。

使用特权

评论回复
5
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
DMA传输法:DMA控制器是一种单片机中的硬件单元,他的功能就是允许I/O外设和存储器之间高效传输数据,且传输过程中无需CPU参与。其工作原理和流程如下:

使用特权

评论回复
6
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
当一个IO设备需要发送数据给存储器或者从存储器读取数据时,它会给DMA 控制器发送一个DRQ请求。DMA控制器收到请求后,向CPU发送HLD请求,要求CPU放弃对总线的使用,因为DMA控制器传输数据时,要使用系统总线。

使用特权

评论回复
7
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
DMA控制器和Cortex™-M3内核共享系统总线。当DMA和CPU访问同样的地址空间时,DMA访问可能会阻挡CPU访问系统总线几个总线周期。总线矩阵中实现了循环仲裁算法来分配DMA与CPU的访问权,它可以确保CPU得到至少一半的系统总线带宽。——《GD32手册》

使用特权

评论回复
8
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
CPU收到DMA控制器的HLD请求后,让出总线使用权给DMA控制器,并向DMA控制器响应HLDA信号。

使用特权

评论回复
9
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
当DMA控制器收到CPU的HLDA信号后,DMA控制器会通知IO设备一个DACK信号,告知IO设备可以进行数据的传输。然后DMA控制器占用系统总线,完成IO设备和存储器之间的数据传输。

使用特权

评论回复
10
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
当数据传输完成后,DMA控制器向CPU申请中断,告知CPU数据传输完成。同时CPU恢复系统总线的使用权。

从上描述可以发现:①在数据传输过程中,CPU完全不需要参与,只有传输完成后才有必要参与进来,大大的节约了CPU时间。②DMA数据传输请求总是IO外设发起的

使用特权

评论回复
11
自动化陈稳|  楼主 | 2023-9-30 19:31 | 只看该作者
GD32F130 DMA简介
GD32F130系列单片机有一个DMA控制器,它有7个DMA通道(CH0~CH6)。 每一个通道可以服务一个外设与存储器之间的DMA数据传输。通道之间相互独立。

下图是DMA通道外设请求表。表格中标记有颜色的请求通道是支持重映射的。

1. 当 SYSCFG_CFGR0 寄存器的相应重映射位被清零时,请求被映射到该通道;
2. 当 SYSCFG_CFGR0 寄存器的相应重映射位被置位时,请求被映射到该通道。

使用特权

评论回复
12
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者
例如可以配置SYSCFG_CFGR0寄存器中的对应位清0,来将USART0_TX请求通道映射到通道1。也可以配置SYSCFG_CFGR0寄存器中的对应位置1,来将USART0_TX请求通道重新映射到通道3。通过使用库函数syscfg_dma_remap_enable()和syscfg_dma_remap_disable()来重映射外设DMA通道的配置。

使用特权

评论回复
13
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者
注意,映射DMA通道前,要使用rcu_periph_clock_enable(RCU_CFGCMP)来打开系统配置时钟,因为SYSCFG_CFGR0寄存器属于系统配置部分的寄存器。

使用特权

评论回复
14
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者

使用特权

评论回复
15
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者
配置通道软件优先级
当DMA控制器在同一时间接收到多个外设请求时,仲裁器将根据外设请求的优先级来决定响
应哪一个外设请求。优先级包括软件优先级和硬件优先级,优先级规则如下:

软件优先级:分为4级,低,中,高和极高。可以通过寄存器DMA_CHxCTL的PRIO位域来配置;
硬件优先级:当通道具有相同的软件优先级时,编号低的通道优先级高。例:通道0和通道2配置为相同的软件优先级时,通道0的优先级高于通道2。

使用特权

评论回复
16
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者
设置软件优先级

DMA_CHxCTL.PRIO[1:0] = 00:低
DMA_CHxCTL.PRIO[1:0] = 01:中
DMA_CHxCTL.PRIO[1:0] = 10:高
DMA_CHxCTL.PRIO[1:0] = 11:极高

使用特权

评论回复
17
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者
配置数据传输方向
DMA主要用于外设和存储器之间的数据传输,所有数据传输方向主要有两种:

存储器到外设:例如USART使用DMA方式发送数据,这个数据可能是一个字符串或者一个字节数组。当使用DMA发送时,这些数据从存储器传输到USART外设的TDATA寄存器
外设到存储器:例如USART使用DMA方式接收数据,使用一个字节数组来缓存收到的数据。当使用DMA接收时,收到的数据从USART外设的RDATA寄存器传输到存储器
虽然DMA也支持存储器到存储器,但是几乎用不到。

使用特权

评论回复
18
自动化陈稳|  楼主 | 2023-9-30 19:32 | 只看该作者
禁用存储器到存储器模式

DMA_CHxCTL.M2M=0:禁用存储器到存储器模式
DMA_CHxCTL.M2M=1:启用存储器到存储器模式

使用特权

评论回复
19
自动化陈稳|  楼主 | 2023-9-30 19:33 | 只看该作者
配置传输方向

DMA_CHxCTL.DIR=0:外设到存储器
DMA_CHxCTL.DIR=1:存储器到外设

使用特权

评论回复
20
自动化陈稳|  楼主 | 2023-9-30 19:33 | 只看该作者
配置数据宽度
DMA传输数据的时候,只要传输没结束,每次外设发起传输请求时,需要从外设读数据,或者写一个数据到外设,那么每次读/写的单个数据多大呢?这就是通过设置外设数据宽度来指定的。同理也要设置存储器的数据宽度。总之这里的数据宽度指的是单次传输的数据大小,也就是占用的字节数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1200

帖子

1

粉丝