USER GUIDE / DATA MOVEMENT & TIMERS / PDMA / DMA OPERATION
DMA 操作
描述符传输模式
非 stride(一维)传输模式
要在通道中进行正确的描述符 DMA 传输,请执行以下步骤:
- 步骤一:检查 DMA 控制器的状态是否可用,即对于全局控制 (DMAC),确保 DMAC.AR=0 和 DMAC.HLT=0;然后对于预期通道 n,确保 DCSn.AR=0、DCSn.HLT=0、DCSn.TT=0、DTCn=0。
- 步骤二:确保 DCSn.NDES=0 并通过 DCSn.DES8 选择 4 字或 8 字描述符。
- 步骤三:在内存中建立描述符。在 DDAn 中写入第一个描述符的地址,4 字描述符的地址必须为 16 字节对齐,8 字描述符的地址必须为 32 字节对齐。地址包括两部分:基地址和偏移地址。如果描述符是链接的,则下一个描述符的 32 位地址由 DDAn 中的 20 位基址和 DESn.CDOA 中的 8 位偏移地址组成。详细的描述符结构请参见表 1。
- 步骤四:8 字描述符时,不要通过软件手动更新 DRTn,而是由硬件自动管理描述符传输的请求类型。
- 步骤五:将对应通道的 DBSn 设置 1,以启动描述符获取。
- 步骤六:设置 DMAC.DMAE=1,并配置 DCSn.CTE=1 以激活通道 n。
- 步骤七:硬件一旦开始获取描述符,就会自动清除 DDB 中的相应位。
- 步骤八:等待外设的 DMA 请求,开始通道 n 的 DMA 传输。
- 步骤九:当前描述符描述的 DMA 传输完成后,如果当前 DCMn.LINK=0,则 DCSn.TT 将立即置 1。此外,如果 DCMn.TIE=1,它将发出中断请求。但是,如果 DCMn.LINK=1,将自动获取下一个描述符,重复步骤 8 和 9,但忽略设置 DCSn.TT,直到完成设置 DCMn.LINK=0 的最终描述符。
- 步骤十:当通道 n 的传输正常结束(DCSn.TT=1)或异常结束(DCSn.HLT=1)时,要在以后正确重用该通道,软件必须先将 DCSn.CTE 设置为 0 关闭通道,然后安全地将 DCSn.TT 或 DCSn.HLT 清零,同时需要检查 DTCn 是否为 0,若非 0,需要手动清零。
表 1 描述符结构
| 描述符 | 位 | 名称 | 功能 |
|---|---|---|---|
| 1st(DES0) | 31 | Reserved | -- |
| 30 | Reserved | -- | |
| 29-28 | Reserved | -- | |
| 27-24 | Reserved | -- | |
| 23 | SAI | 源地址递增 | |
| 22 | DAI | 目的地址递增 | |
| 21 | SAIW | 源地址递增后回环 | |
| 20 | DAIW | 目的地址递增后回环 | |
| 19-16 | RDIL | 自主的传输数据单元大小 | |
| 15-14 | SP | 源数据宽度 | |
| 13-12 | DP | 目的数据宽度 | |
| 11-8 | TSZ | 传输数据单元大小 | |
| 7-3 | Reserved | -- | |
| 2 | STDE | Stride传输使能控制 | |
| 1 | TIE | 传输中断使能控制 | |
| 0 | LINK | 描述符链表传输使能控制 | |
| 2nd (DES1) | 31-0 | DSA | 源地址 |
| 3rd (DES2) | 31-0 | DTA | 目的地址 |
| 4th (DES3) | 31-24 | DOA | 描述符偏移地址 |
| 23-0 | DTC | 传输长度 | |
| 5th (DES4) | 31-16 | TSD | 目的地址Stride |
| 15-0 | SSD | 源地址Stride | |
| 6th(DES5) | 31-6 | Reserved | -- |
| 5-0 | DRT | DMA 请求类型 | |
| 7th(DES6) | 31-0 | Reserved | -- |
| 8th(DES7) | 31-0 | Reserved | -- |

Stride(二维)传输模式
Stride 传输模式是指将总传输数细分为数十个甚至数百个大小相同的子块,且每相邻两个子块在前一个子块的尾部和后一个子块的头部之间都有固定的 stride 地址间隔。

Stride 传输模式的操作步骤与非 Stride 传输模式类似。不过,每个新子块的起始地址(源地址或目标地址)都是通过将已完成子块的结束地址的下一个相邻字节地址与相应的地址 Stride 相加来完成的。
非描述符传输模式
要正确执行无描述符 DMA 传输,请执行以下步骤:
- 步骤一:检查 DMA 控制器的状态是否可用,即对于全局控制 (DMAC),确保 DMAC.AR=0 和 DMAC.HLT=0;然后对于预期通道 n,确保 DCSn.AR=0、DCSn.HLT=0、DCSn.TT=0、DTCn=0。
- 步骤二:对于使用的通道 n,正确初始化 DSAn、DTAn、DTCn、DRTn、DCSn、DCMn。
- 步骤三:设置 DMAC.DMAE=1 和 DCSn.CTE=1 以启动 DMA 传输。对于具有自动请求(DRTn.RT=0x8)的通道,当 DCSn.CTE 位和 DMAC.DMAE 位设置为 1 时,传输将自动开始。而对于具有其他请求类型的通道,只有当传输请求被 DMA 检测到时,传输才会开始。
- 步骤四:对于任何通道 n,每成功传输一个数据单元,DTCn 值就会递减 1。当指定数量的传输数据单元完成后(DTCn=0),传输正常结束。同时,如果 DCMn.TIE=1,DIRQP 的相应位将被置 1,以发出中断请求。但是,在传输过程中,如果发生 DMA 地址错误,则应暂停传输,DCSn.AR 和 DMAC.AR 均置 1,DIRQP 的相应位也置 1,以发出中断请求,而不管 DCMn.TIE。
例如,有时在 UART 和另一个终端之间传输数据的通道会出现 UART 奇偶校验错误。在这种情况下,DCSn.HLT 和 DMAC.HLT 都被置 1,传输暂停。软件应通过检查这两个位来识别停止状态,并重新配置 DMA,使 DMA 能在稍后正常运行。