1. 概述
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须 CPU
干预,数据可以通过 DMA 快速地移动,这就节省了 CPU 的资源来做其它操作。DMA 控制器有 8 个通道,每
个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调 CPU 与 DMA 请求的
优先权。
2. DMA 与 CPU 关系
DMA 控制器能够独立操作数据收发,不需要 CPU 参与,但由于 DMA 也要占用系统总线,和 CPU 会存
在冲突,因此 DMA 和 CPU 一般是交替占用总线控制权。通过 BURSTIDLE 参数可调节 DMA 占用总线的强
度,数值越大强度越低,由于 BURSTIDLE 最小是 1,DMA 占用总线强度最高也就是和 CPU 以 1:1 方式交替
占用。但 DMA 是以 BURST 方式占用总线,如果 BURSTLEN 设置过大,则单次传输将占用总线时间较长,
某些情况下可能会影响 CPU 效率。
一般而言,DMA 发生频率低于 10%,可以小幅考虑对 CPU 影响,如低于 1%则可以忽略对 CPU 影响。
比如系统主频 120MHz,几个外设以 DMA 方式驱动, UART 以 115.2KBps 波特率运行,可以不考虑对
CPU 效率的影响。而 ADC 以 2MSPS 采样率运行,一次传输 8 个通道数据,则需要注意对 CPU 效率影响。
3. DMA 基本参数配置
DMA 基本参数包括传输数据量 NPKT 和自动重载 RELOAD、源和目标地址配置、数据位宽 SIZE、指针修改方式 SPTYP/DPTYP、触发方式 ONE-SHOT/TO-END、突发长度 BURSTLEN、释放长度 BURSTIDLE。
【注意】NPKT 是按照 n-1 方式进行配置的,如要进行 100 次传输,配置 NPKT=99。 另外,NPKT=0是一种特殊情况,在 DMA enable=0 时没有意义,在 enable=1 时表示传输 1 次。
【注意】DMA 传输数据量有 3 层含义:NPKT 定义传输的 burst 数量,BURSTLEN 定义 burst 长度(DMA 数据个数),SIZE 定义 DMA 数据位宽,分 1、2、4 字节。
【注意】RELOAD 会重新置位 DMA enable,并把 CPKT 计数器清零。但源和目标指针还是按照原来的方式进行修改,不会被清零。同时,如果是软件触发 DMA,RELOAD 并不会自动开启触发。
【注意】RELOAD 在硬件触发的传输中,可以做到不需 CPU 介入而无限传输, 而在软件触发的传输中,因为 RELOAD 重载计数器以后仍然需要软件介入开启软件触发控制位。
【注意】DMA 源和目标并没有限制,即可以配置到 flash 存储区、RAM 存储区、APB1 外设区、APB2外设区、AHB 外设区。支持存储区与外设区的相互传输。
【注意】如果 DMA 目标传输区是 flash 区域,DMA 控制器会自动屏蔽对 flash 的写入操作,flash 控制器不会送出 write error 信息,DMA 控制器也不会送出 DMA error 信息,DMA 会完成全部数据传输,但没有数据被写入 flash。
【注意】DMA 支持外设到外设的直接传输,此时一般以 DMA source 设备作为触发源,而将 DMA destination 设备作为一个普通外设地址,比如本章例程 2 中 UART1 的收发过程。 SH32F9B00 应用指南
【注意】如果 DMA 目标地址被配置到 GPIO 地址,则可以把 SRAM 中存储的数据通过 DMA 方式送到I/O 口上,可以产生一些特殊的波形而不需要 CPU 介入。
【注意】数据位宽有 1byte、2byte、4byte 三种,源和目标位宽不同时会有截取和补零操作,具体参考数据手册表 16-2。
【注意】指针修改方式有累加、累减、固定和循环四种,其中循环方式需配合突发传输一起考量,其循环周期等于突发长度。在无限传输中,循环指针方式特别有意义,可以避免 CPU 介入对指针的修改。
【注意】触发方式也是很直观的,one-shot 是每触发一次传输一个 burst,to-end 是每触发一次把所有burst 全部传输完成。
【注意】突发长度是当前 burst 包含 DMA 数据个数,burst 是 DMA 传输的基本单位,每一个 burst 传输都是无法被 CPU 中断的。突发长度越大,DMA 传输效率越高,但对 CPU 的中断时间越长。
【注意】释放长度是 DMA 释放总线给 CPU 所占时间,BURSTIDLE 最小值为 1 个周期,即 DMA 执行完成后最少释放 1 个周期给 CPU 执行,释放总线数值越大 CPU 获得执行占比越高。
【注意】burstidle 时间也包含在 burst 传输时间内,因此 DMA 仍然处于 busy 状态,但实际上此时 DMA控制器已经释放总线,允许 CPU 执行。由于 DMA busy 置位,DMA 无法切换到下一个 DMA 通道执行。
|