一、概述
本文将介绍 NXP S32K1xx 系列 MCU 的 eDMA 模块的基本知识,重点将介绍 eDMA 的组成、特性以及主要功能的概述。
二、eDMA 的组成及特性
eDMA(Enhanced Direct Memory Access)控制器是第二代的数据传输模块,几乎不需要控制器的介入。下图为 eDMA 的系统框图,从图中可以看出 eDMA 的架构主要包括两个部分:DMA 引擎和内存,DMA 引擎主要负责源地址和目的地址的计算和数据传输,内存
主要保存每个 DMA 通道的传输控制描述符(TCD)。
图 2.1 eDMA 模块系统框图
从上图可以看出,eDMA 引擎主要由以下 4 部分组成:
- 地址通路,主要管理所有主机总线地址的计算
- 数据通路,主要实现总线主机的数据通道,包括数据缓存和必要的逻辑单元用来实现数据对齐
- 编程模型/通道仲裁,主要实现 eDMA 的编程模型以及通道仲裁逻辑
- 控制单元,主要提供 eDMA 引擎的所有控制功能
eDMA 的内存保存 DMA 的传输控制描述符(TCD),每个通道对应一个 TCD,每个 TCD 的大小为 32 字节, TCD 的结构如下图所示
图 2.2 TCD 结构
关于 TCD 描述符各个字段的描述如下表所示:
TCD 描述符字段 |
字段长度(位) |
含义 |
SADDR |
32 |
源地址 |
SMOD |
5 |
源地址的模 |
SSIZE |
3 |
源地址的传输大小(8位、16位、32位) |
DMOD |
5 |
目的地址的模 |
DSIZE |
3 |
目的地址的传输大小(8位、16位、32位) |
SOFF |
16 |
源地址的偏移量 |
NBYTES |
32 |
一次副循环传输的字节数 |
SMLOE |
1 |
副循环完成后是否对源地址加上偏移 |
DMLOE |
1 |
副循环完成后是否对目的地址加上偏移 |
MLOFF |
20 |
副循环完成后的偏移量 |
SLAST |
32 |
副循环完成后源地址的偏移量 |
DADDR |
32 |
目的地址 |
CITER.E_LINK |
1 |
是否使能副循环完成后进行通道链接 |
CITER.LINKCH |
6 |
副循环完成后的链接通道 |
CITER |
9 |
执行副循环的次数 |
DOFF |
16 |
目的地址的偏移量 |
DLAST_SGA |
32 |
副循环完成后目的地址的偏移量 |
BITER.E_LINK |
1 |
是否使能每次主循环完成后进行通道链接 |
BITER.LINKCH |
6 |
每次主循环完成后的链接通道 |
BITER |
9 |
主循环的执行次数 |
BWC |
2 |
DMA 带宽控制域 |
MAJOR_LINKCH |
4 |
主循环完成后的链接通道 |
DONE |
1 |
主循环完成标识位,当 CITER 计数为 0 时该位置1 |
ACTIVE |
1 |
指示当前 DMA 通道是否活跃,每次副循环完成后清除 |
MAJOR.E_LINK |
1 |
是否使能主循环完成后进行链接 |
E_SG |
1 |
使能 Scatter/Gather 的功能 |
D_REQ |
1 |
该位用于清除 DMA 请求,当主循环迭代数为 0 时自动清除 ERQ 位 |
INT_HALF |
1 |
该位置位时,当主循环迭代数为一半时产生中断 |
INT_MAJ |
1 |
该位置位时,当主循环迭代数为 0 时产生中断 |
START |
1 |
通道启动位,当 DMA 请求开始执行时该位自动清除 |
表 2.1 TCD 描述符的字段含义
eDMA 模块具有以下特性:
- 通过双地址传输实现所有的数据搬运
- 最多支持 16 个通道
- TCD 支持两层嵌套的传输操作
- 支持 3 种方法激活通道
- 软件激活
- 通过 Channel-to-channel 链接状态机激活,用于连续传输的模式
- 硬件请求
- 支持固定优先级和轮询两种通道仲裁
- 通道传输完成报告,可编程的中断请求
- 支持 scatter/gather 的 DMA 传输
eDMA 模块支持以下三种工作模式:
(1) Normal 模式,该模式下 DMA 正常进行数据传输
(2) Debug 模式,在该模式下可以通过控制寄存器 CR[EDBG] 对 DMA 操作进行控制,该位清除时,DMA 继续传输,该位置位,则停止
DMA 传输,如果当前有通道处于活跃状态,则等该通道退出后再执行停止 DMA 传输 (3) Wait 模式,DMA 传输完成后会进入 Wait 模式
三、 eDMA 的功能概述
3.1 初始化流程
eDMA 的初始化流程包括以下几个步骤:
- 配置 eDMA 的控制寄存器 CR
- 通过 DCHPRIn 寄存器来配置通道的优先级
- 如果需要的话在 EEI 寄存器使能错误中断
- 写入相关通道的 TCD
- 通过 ERQ 寄存器使能硬件请求
- 通过硬件或软件的方式请求 DMA 服务

图 3.1 DMA 初始化流程
3.2 、DMA 传输过程
下面通过一个例子来介绍一下 DMA 的传输过程,通过配置 TCD 来执行一个 16 字节数据的 DMA 传输,TCD 的配置如下:
- 主循环的迭代次数设置为 1
- 传输字节设置为 16 字节
- 源地址设置为 0x1000,数据宽度为 1 字节
- 目的地址设置为 0x2000,数据宽度为 4 字节
- 源地址偏移设置为 1
- 目的地址偏移设置为 4
- 设置传输结束后源地址和目的地址恢复为原来的地址
传输流程如下所示:
- 通过写 TCDn_CSR[START] 位请求 DMA 传输
- 该通道通过仲裁被选中
- eDMA 引擎设置 TCDn_CSR[DONE]=0 , TCDn_CSR[START]=0 , TCDn_CSR[ACTIVE]=1
- eDMA 引擎读取 TCD 的数据到内部寄存器
- 执行以下传输序列:
- 从地址 0x1000 读取一个字节,从地址 0x1001 读取一个字节,从地址 0x1002 读取一个字节,从地址 0x1003 读取一个字节
- 写 32 位的数据到地址 0x2000(副循环第一次迭代)
- 从地址 0x1004 读取一个字节,从地址 0x1005 读取一个字节,从地址 0x1006 读取一个字节,从地址 0x1007 读取一个字节
- 写 32 位的数据到地址 0x2004(副循环第 2 次迭代)
- 从地址 0x1008 读取一个字节,从地址 0x1009 读取一个字节,从地址 0x100A 读取一个字节,从地址 0x100B 读取一个字节
- 写 32 位的数据到地址 0x2008(副循环第 3 次迭代)
- 从地址 0x100C 读取一个字节,从地址 0x100D 读取一个字节,从地址 0x100E 读取一个字节,从地址 0x100F 读取一个字节
- 写 32 位的数据到地址 0x200C(副循环第 4 次迭代,主循环完成)
- eDMA 引擎设置 TCDn_SADDR = 0x1000,TCDn_DADDR = 0x2000,TCDn_CITER = 1
- eDMA 引擎设置 TCDn_CSR[ACTIVE] = 0,TCDn_CSR[DONE] = 1,INT[n] = 1
- 该 DMA 通道退出服务,eDMA 进入 Idle 状态或者服务下个通道
3.3、DMA 通道链接
DMA 的通道链接就是当一个通道的主循环或者副循环完成后自动启动其它通道的 DMA 请求,副循环完成后是否链接通过 TCDn_CITER[E_LINK] 进行配置,置位的话使能链接,链接的通道号通过 TCDn_CITER[LINKCH] 进行配置。主循环完成后是否链接通过TCDn_CSR[MAJAR_E_LINK] 进行配置,链接的通道号通过 TCDn_CSR[MAJOR_LINKCH] 配置。而副循环链接的次数通过 TCDn_CITER[CITER] 配置。
例如,进行以下链接设置:
TCDn_CITER[E_LINK] = 1
TCDn_CITER[LINKCH] = 0xC
TCDn_CITER[CITER] = 4
TCDn_CITER[MAJOR_E_LINK] = 1
TCDn_CITER[MAJOR_LINKCH] = 0x7

图 3.2 DMA 通道链接过程
3.4、DMA 通道挂起/恢复
在执行 DMA 传输的过程中,当我们需要挂起 DMA 请求时需要如何操作呢,下面将介绍如何执行 DMA 通道的挂起和恢复。
挂起 DMA 需要执行以下操作:
- 首先停止外设的 DMA 请求,通过读取寄存器确认外设的 DMA 请求已经禁止
- 通过 DMA_HRSn 寄存器检查 DMA 的硬件请求状态确保当前没有正在挂起的 DMA 请求,接着通过清除 ERQ 位来禁用硬件服务请求
要恢复 DMA 的传输需要执行以下操作:
- 设置 ERQ 位来使能 DMA 硬件服务请求
- 使能外设的 DMA 服务请求
四、参考资料
- NXP ,《S32K1XXRM》,https://www.nxp.com.cn/webapp/sps/download/preDownload.jsp?render=true
- NXP ,《S32K-DS》, https://www.nxp.com.cn/docs/en/data-sheet/S32K-DS.pdf
评论