<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC45x User Manual》DMA** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2020, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# DMA

## 概述

DMA和CPU同为芯片总线的主设备。

如图8-1所示。其中部分设备不需要被DMA访问，仅仅挂载于与CPU相连的总线上。ADC/DAC/SPI/I2C/MCPWM/UART/Timer/GPIO/Hall/SRAM等设备可以被CPU和DMA共享访问。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-1 DMA
AHB总线架构

DMA有8个通道，共享一个搬运引擎。当DMA空闲且多个通道同时发生请求时，按优先级进行仲裁，但在搬运过程中不会发生抢占，即一定是某个通道完成一轮搬运，DMA空闲后，才会发起仲裁，判断下一个获得请求的通道是哪一个。

DMA的传输分为多个轮次，根据DMA_CCRx.RMODE设置，可以每轮传输一次传输多轮，也可以只传输一轮但是连续进行多次数据搬运。

如果配置一轮传输多次数据，即DMA_CCRx.RMODE=0，则一次DMA请求，DMA连续发送DMA_CTMSx次数据，然后硬件将DMA_CCRx.EN位清零，置位中断标志。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-2 RMODE=0 DMA传输情况

如果配置某个通道为多轮搬运，则在多轮搬运之间，DMA可能会响应其他通道的搬运请求。

多轮传输每轮只搬运一次数据，搬运DMA_CTMSx轮后，硬件将DMA_CCRx.EN位清零，置位中断标志。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-3 RMODE=1 DMA传输情况

DMA
每完成一次传输，地址根据DMA_CCRx.SINC和DMA_CCRx.DINC决定是否自动递增。所有的外设寄存器地址都是word对齐的，所以通常外设的地址递增应配置为0/4。例如对于UART/SPI/I2C，因为每次都是访问UART_DATA或SPI/I2C
FIFO接口的固定地址，所以轮次间无需地址递增；如要访问ADC数据寄存器，则地址通常需要自动加4，可以设置轮内递增。而对于内存，如果设置了轮内递增，每次地址递增的值，根据内存数据位宽(DMA_CCRx.SBTW/DBTW)设定，对于内存访问位宽为byte的情况，地址自动加1，对于half-word，地址自动加2，对于word，地址自动加4。下图以源地址为例，说明了SINC为不同配置时，DMA访问数据源地址的变化情况，目的地址同理。配置为一轮传输4次，源地址和目的地址数据尺寸均为word。实际应用中，如果配置数据尺寸为byte或halfword，则地址偏移按照1/2进行递增。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-4
DMA地址递增控制

一般，SINC=0，DINC=0，源地址、目的地址均不递增，可能为外设到外设的搬运。

SINC=1，DINC=0，源地址递增，目的地址不递增，可能为内存数组到外设寄存器接口的搬运。

SINC=0，DINC=1，源地址不递增，目的地址递增，可能为外设寄存器接口到内存数组的搬运。

SINC=1，DINC=1，源地址、目的地址均递增，为外设多组数据(如ADC_DATx)到内存数组的搬运。

出于功耗控制考虑，DMA模块可以通过设置DMA_CTRL.EN位为0来禁用（要求关闭DMA使能前先关闭8个通道对应的使能DMA_CCRx.EN），此时DMA时钟被门控关闭。DMA包含配置寄存器（可以被CPU配置）和数据搬运模块（向总线发起各种设备访问请求）。

DMA支持8, 16或32 bit (byte, half-word, or word)
三种位宽的传输操作，通过配置DMA_CCRx.SBTW和DMA_CCRx.DBTW来选择源地址和目的地址访问的位宽，源地址访问的位宽与目的地址访问的位宽可以不同。

DMA支持循环模式，由DMA_CCRx.CIRC控制，通常循环模式和DMA_CCRx.RMODE配合使用。

如果配置DMA_CCRx.CIRC=1，且DMA_CCRx.RMODE=1，即循环多轮模式。一次DMA请求信号进行触发，只进行一次数据搬运（如UART数据搬运至RAM，完成一轮搬运等待下一次请求。在此模式下，DMA_CTMSx可以配置为一个较大的值，每进行一次搬运DMA_CTMSx减1。由于循环模式DMA进行多轮搬运不再产生中断标志，CPU可以通过读取DMA_CTMSx来判断当前已经传输的数据量，如果已经足够则开始处理。当传输了DMA_CTMSx轮以后，地址会回到初始地址。DMA_CTMSx会重新装载为预设值，开始新一轮的递减。循环多轮模式下，DMA的通道使能DMA_CCRx.EN位由软件置位，一直为高，即使DMA_CTMSx递减至0。如果要退出传输，可以软件清零DMA_CCRx.EN。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-5 CIRC=1且RMODE=1 DMA传输情况

如果配置DMA_CCRx.CIRC=1，且DMA_CCRx.RMODE=0，即循环单轮模式则DMA收到一次请求后会连续地进行DMA_CTMSx次数据搬运，并产生中断标志。在此模式下，DMA_CCRx.EN无须软件置位，当DMA通道收到请求时会自动置位，传输完成一轮后自动清零。如果要退出此种模式，可以清零DMA_CCRx.CIRC位，并清零DMA_CCRx.EN位。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-6 CIRC=1且RMODE=0 DMA传输情况

循环模式下，DMA_CTMSx寄存器随着搬运递减为0后重新装载为初始配置值。如果是搬运数据到内存，则覆盖之前搬运至内存的数据；如果是搬运至外设，则重复一轮数据发射。以将ADC数据搬运至内存为例，设定数据块大小为16bit×12channel×8次，则在循环模式下DMA完成一轮96个half
word搬运后重新开始下一轮搬运，并覆盖之前使用的内存地址，不设置DMA完成中断标志位。单次模式下，DMA完成一定大小的数据块搬运后即终止本次DMA操作，设置当前通道DMA完成中断标志位，同时硬件自动关闭对应的DMA通道，即硬件电路自动在该通道传输完成后将DMA_CCRx.EN设为0。DMA需要搬运的轮次由DMA_CTMS寄存器进行控制。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-7 DMA 循环 / 单次传输模式硬件处理逻辑

## 请求

DMA的请求分为软件请求和硬件请求两类，软件请求通过设置对应DMA通道的DMA_RENx.SW_TRIG=1来产生，写1即产生，软件触发位设置后需要软件清零。硬件请求通常为外设的中断事件，当特定的外设中断事件作为DMA传输请求时，通常要禁用对应事件的中断响应，即不再需要CPU对中断进行响应，响应仅作为DMA传输请求。而且硬件DMA请求信号经过DMA通道受理握手后会被DMA硬件清零，无法软件清除事件标志。

表8-1
DMA请求

|||
|---|---|
|触发来源|描述|
|软件|软件触发时进行的搬运操作由配置寄存器DMA_CCRx指定，当设置了DMA_RENx.SW_TRIG，一旦通道被使能即开始进行DMA操作。|
|ADC|ADC在单段触发模式下，一次完成若干个通道后采样后产生中断请求，由DMA把ADC转换后的值搬运到SRAM。ADC单段采样完成中断事件作为DMA请求信号，请求信号在得到DMA响应后由DMA将其清零，无需软件清零；注意此时需要软件同时禁用ADC采用完成中断，使中断不再被CPU响应。|
|Timer|Timer使用过零/比较/捕获事件作为DMA请求，具体DMA操作根据配置寄存器设定，通常作为定时事件（如每隔10ms触发一次DMA操作）|
|SPI|SPI模块使用接收缓冲区满事件作为DMA请求信号，由于SPI是同时收发，所以接收缓冲区满既是接收完毕也是发送完毕的事件标志。读取SPI FIFO自动清除事件标志。|
|MCPWM|MCPWM模块使用过零/计数周期结束/4个ADC触发信号作为DMA请求，具体DMA操作根据配置寄存器设定|
|I2C|I2C模块使用I2C0_SCR.BYTE_CMPLT即字节发送完成作为触发DMA请求，DMA自动清除I2C的请求标志。其他I2C中断事件仍由CPU响应|
|UART|串口模块使用UART_IF 触发DMA请求，如果DMA配置的传输方向是内存到串口，则使用UART发送完成事件产生DMA请求信号；如果传输方向是串口到内存，则应使用UART接收完成事件产生DMA请求信号。事件标志由DMA自动清零。UART在由DMA操作时应同样禁用相应中断防止被CPU响应。|
|CAN|CAN中断可以作为DMA请求|
|HALL|HALL中断可以作为DMA请求|
|CMP|CMP中断可以作为DMA请求|
|FMAC|当设置FMAC_CR.DMAWEN=1，则当X1 buffer有足够空闲空间时触发DMA向FMAC写入待滤波数据；当设置FMAC_CR.DMAREN=1，则Y buffer有足够有效数据时触发DMA从FMAC读取滤波的数据。具体多少数据触发DMA进行搬运取决于FMAC的水线设置|
|GPIO|GPIO中断可以作为DMA请求|

## 优先级

DMA的优先级采用固定优先级，优先级如图8-7所示。为避免出现来不及响应某些外设请求的情况，在设计应用软件时应考虑任务实时性，每个通道不配置搬运过于大量的数据导致其他通道得不到及时响应。

如图8-7所示，优先级由上至下降低。8个DMA通道中，优先级关系为：通道0\>通道1\>通道2\>…\>通道7
(\>号表示优先级高于)。在DMA各通道内部，通常有多个硬件请求事件和一个软件请求事件，硬件请求优先级高于软件请求。同一个通道内多个硬件请求事件优先级相同。通常，一个DMA通道配置使能一个硬件事件请求，多个硬件请求不应在一个通道内同时发生。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图8-8
DMA通道优先级

## 仲裁

当DMA处于空闲状态，或刚刚完成某一通道的DMA传输后，若此时恰好有一个或多个DMA请求发生，DMA会根据优先级设定进行仲裁，优先级高的外设请求率先得到DMA服务。比如ADC连续模式下，每完成一轮ADC数据搬运，ADC的采样完成事件标志被DMA清零，DMA回到空闲状态或转而服务其他外设请求；对于UART，每搬运一个byte重新仲裁；对于SPI/I2C每搬运完一个FIFO的数据，重新仲裁。

为了避免CPU或DMA长期占用外设/SRAM，在外设/SRAM的端口仲裁模块中加入了时间片机制，即一个主设备占用一段时间后释放访问权，仲裁模块观测另一个主设备是否在请求访问，如果是则转而允许另一个主设备访问，否则继续当前主设备未完成的访问。

## 中断

DMA的一个通道完成DMA操作后产生DMA中断。当DMA某一个通道完成操作后，会自动关闭该通道的使能为DMA_CCRx.EN。

## 寄存器

### 地址分配

DMA控制器模块寄存器的基地址是0x4001_9C00，寄存器列表如下：

表8-2
DMA寄存器列表

||||
|---|---|---|
|名称|偏移地址|说明|
|DMA_CCR0|0x00|DMA通道0通道配置寄存器|
|DMA_REN0|0x04|DMA通道0请求使能寄存器|
|DMA_CTMS0|0x08|DMA通道0传输次数寄存器|
|DMA_SADR0|0x0C|DMA通道0源地址寄存器|
|DMA_DADR0|0x10|DMA通道0目的地址寄存器|
||0x14||
|DMA_CCR1|0x18|DMA通道1通道配置寄存器|
|DMA_REN1|0x1C|DMA通道1请求使能寄存器|
|DMA_CTMS1|0x20|DMA通道1传输次数寄存器|
|DMA_SADR1|0x24|DMA通道1源地址寄存器|
|DMA_DADR1|0x28|DMA通道1目的地址寄存器|
||0x2C||
|DMA_CCR2|0x30|DMA通道2通道配置寄存器|
|DMA_REN2|0x34|DMA通道2请求使能寄存器|
|DMA_CTMS2|0x38|DMA通道2传输次数寄存器|
|DMA_SADR2|0x3C|DMA通道2源地址寄存器|
|DMA_DADR2|0x40|DMA通道2目的地址寄存器|
||0x44||
|DMA_CCR3|0x48|DMA通道3通道配置寄存器|
|DMA_REN3|0x4C|DMA通道3请求使能寄存器|
|DMA_CTMS3|0x50|DMA通道3传输次数寄存器|
|DMA_SADR3|0x54|DMA通道3源地址寄存器|
|DMA_DADR3|0x58|DMA通道3目的地址寄存器|
||0x5C||
|DMA_CCR4|0x60|DMA通道4通道配置寄存器|
|DMA_REN4|0x64|DMA通道4请求使能寄存器|
|DMA_CTMS4|0x68|DMA通道4传输次数寄存器|
|DMA_SADR4|0x6C|DMA通道4源地址寄存器|
|DMA_DADR4|0x70|DMA通道4目的地址寄存器|
||0x74||
|DMA_CCR5|0x78|DMA通道5通道配置寄存器|
|DMA_REN5|0x7C|DMA通道5请求使能寄存器|
|DMA_CTMS5|0x80|DMA通道5传输次数寄存器|
|DMA_SADR5|0x84|DMA通道5源地址寄存器|
|DMA_DADR5|0x88|DMA通道5目的地址寄存器|
||0x8C||
|DMA_CCR6|0x90|DMA通道6通道配置寄存器|
|DMA_REN6|0x94|DMA通道6请求使能寄存器|
|DMA_CTMS6|0x98|DMA通道6传输次数寄存器|
|DMA_SADR6|0x9C|DMA通道6源地址寄存器|
|DMA_DADR6|0xA0|DMA通道6目的地址寄存器|
||0xA4||
|DMA_CCR7|0xA8|DMA通道7通道配置寄存器|
|DMA_REN7|0xAC|DMA通道7请求使能寄存器|
|DMA_CTMS7|0xB0|DMA通道7传输次数寄存器|
|DMA_SADR7|0xB4|DMA通道7源地址寄存器|
|DMA_DADR7|0xB8|DMA通道7目的地址寄存器|
||0xBC||
|DMA_CTRL|0xC0|DMA控制寄存器|
|DMA_IE|0xC4|DMA中断使能寄存器|
|DMA_IF|0xC8|DMA中断标志寄存器|

### DMA_CTRL DMA 控制寄存器

地址：0x4001_9CC0

复位值：0x0

表8-3
DMA控制寄存器DMA_CTRL

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||||||||||||||||EN|
||||||||||||||||RW|
||||||||||||||||0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:1\]||未使用|
|\[0\]|EN|DMA使能|

### DMA_IE DMA 中断使能寄存器

地址：0x4001_9CC4

复位值：0x0

表8-4 DMA中断使能寄存器DMA_IE

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||CH7_FIE|CH6_FIE|CH5_FIE|CH4_FIE|CH3_FIE|CH2_FIE|CH1_FIE|CH0_FIE|
|||||||||RW|RW|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|CH7_FIE|通道7完成中断使能|
|\[6\]|CH6_FIE|通道6完成中断使能|
|\[5\]|CH5_FIE|通道5完成中断使能|
|\[4\]|CH4_FIE|通道4完成中断使能|
|\[3\]|CH3_FIE|通道3完成中断使能|
|\[2\]|CH2_FIE|通道2完成中断使能|
|\[1\]|CH1_FIE|通道1完成中断使能|
|\[0\]|CH0_FIE|通道0完成中断使能|

### DMA_IF DMA 中断标志寄存器

地址：0x4001_9CC8

复位值：0x0

表8-5
DMA中断标志寄存器DMA_IF

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||CH7_FIF|CH6_FIF|CH5_FIF|CH4_FIF|CH3_FIF|CH2_FIF|CH1_FIF|CH0_FIF|
|||||||||RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|CH7_FIF|通道7完成中断标志，高有效，写1清零|
|\[6\]|CH6_FIF|通道6完成中断标志，高有效，写1清零|
|\[5\]|CH5_FIF|通道5完成中断标志，高有效，写1清零|
|\[4\]|CH4_FIF|通道4完成中断标志，高有效，写1清零|
|\[3\]|CH3_FIF|通道3完成中断标志，高有效，写1清零|
|\[2\]|CH2_FIF|通道2完成中断标志，高有效，写1清零|
|\[1\]|CH1_FIF|通道1完成中断标志，高有效，写1清零|
|\[0\]|CH0_FIF|通道0完成中断标志，高有效，写1清零|

### DMA通道配置寄存器

#### DMA_CCRx (x =0,1,2,3,4,5,6,7)

地址分别是：0x4001_9C00，0x4001_9C18，0x4001_9C30，0x4001_9C48，0x4001_9C60，0x4001_9C78，0x4001_9C90，0x4001_9CA8

复位值：0x0

表8-6
DMA通道配置寄存器DMA_CCRx

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||SBTW||DBTW|||SINC||DINC|CIRC||RMODE|EN|
|||||RW||RW|||RW||RW|RW||RW|RW|
|||||0||0|||0||0|0||0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:12\]||未使用|
|\[11:10\]|SBTW|源地址访问位宽0: Byte1: Halfword2: Word3: 保留|
|\[9:8\]|DBTW|目的地址访问位宽0:Byte1:Halfword2:Word3:保留|
|\[7\]||未使用|
|\[6\]|SINC|源地址递增方式0:不递增1:每传输一次，地址按照SBTW对应大小递增1/2/4|
|\[5\]||未使用|
|\[4\]|DINC|目的地址递增方式0:不递增1:每传输一次，地址按照DBTW对应大小递增1/2/4|
|\[3\]|CIRC|循环模式，高有效|
|\[2\]||未使用|
|\[1\]|RMODE|0:单轮传输，一轮连续传输多次，每收到DMA请求传输一轮，一个DMA请求即传输完毕1:多轮传输，每轮进行一次数据传输，每收到DMA请求传输一轮，多个DMA请求才传输完毕不支持多轮×多次传输|
|\[0\]|EN|通道使能，高有效，软件置1开启通道进行DMA搬运操作，搬运完成后DMA硬件将此位清零|

#### DMA_RENx (x = 0,1,2,3,4,5,6,7)

地址分别是：0x4001_9C04，0x4001_9C1C，0x4001_9C34，0x4001_9C4C，0x4001_9C64，0x4001_9C7C，0x4001_9C94，0x4001_9CAC

复位值：0x0

表8-7 DMA请求使能寄存器DMA\_ RENx

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|SW_TRIG||GPIO|FMAC_Y|FMAC_X1|CMP|HALL1|HALL0|I2C1 TX|I2C1 RX|UART2 TX|UART2 RX|UART1 TX|UART1 RX|UART0 TX|UART0 RX|
|RW||RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|
|0||0|0|0|0|0|0|0|0|0|0|0|0|0|0|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|I2C0 TX|I2C0 RX|MCPWM1|MCPWM0|SPI1 TX|SPI1 RX|SPI0 TX|SPI0 RX|TIMER4|TIMER3|TIMER2|TIMER1|TIMER0|ADC2|ADC1|ADC0|
|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|RW|
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31\]|SW_TRIG|软复位请求使能|
|\[30\]||保留|
|\[29\]|GPIO_TRIG|GPIO 请求使能|
|\[28\]|FMAC_Y|FMAC Y|
|\[27\]|FMAC_X1|FMAC X1|
|\[26\]|CMP|比较器|
|\[25\]|HALL1|HALL1|
|\[24\]|HALL0|HALL0|
|\[23\]|I2C1_TX|I2C1 发送|
|\[22\]|I2C1_RX|I2C1 接收|
|\[21\]|UART2_TX|UART2 发送|
|\[20\]|UART2_RX|UART2 接收|
|\[19\]|UART1_TX|UART1 发送|
|\[18\]|UART1_RX|UART1 接收|
|\[17\]|UART0_TX|UART0 发送|
|\[16\]|UART0_RX|UART0 接收|
|\[15\]|I2C0_TX|I2C0 发送|
|\[14\]|I2C0_RX|I2C0 接收|
|\[13\]|MCPWM1|MCPWM1|
|\[12\]|MCPWM0|MCPWM0|
|\[11\]|SPI1_TX|SPI1 发送|
|\[10\]|SPI1_RX|SPI1 接收|
|\[9\]|SPI0_TX|SPI0 发送|
|\[8\]|SPI0_RX|SPI0 接收|
|\[7\]|TIMER4|TIMER4|
|\[6\]|TIMER3|TIMER3|
|\[5\]|TIMER2|TIMER2|
|\[4\]|TIMER1|TIMER1|
|\[3\]|TIMER0|TIMER0|
|\[2\]|ADC2|ADC2|
|\[1\]|ADC1|ADC1|
|\[0\]|ADC0|ADC0|

DMA的通道中配置的内存、外设地址应与使能的外设中断请求相对应，这一点需要由应用软件保证。其中软件请求始终处于使能状态，即软件向DMA_RENx.SW_TRIG写1即开始一次DMA传输。每一个DMA通道一般在同一时间通常只使能一个硬件DMA请求。软件触发标志DMA_RENx.SW_TRIG在请求被DMA受理后由硬件自动清除。

由于CMP信号可能是一个慢速的电平信号，在使用CMP触发DMA时，推荐将中断触发类型选择为上升沿触发。

DMA_RENx寄存器可以在DMA通道使能的情况下改写。

#### DMA_CTMSx (x = 0,1,2,3,4,5,6,7)

地址分别是：0x4001_9C08，0x4001_9C20，0x4001_9C38，0x4001_9C50，0x4001_9C68，0x4001_9C80，0x4001_9C98，0x4001_9CB0

复位值：0x0

表8-8
DMA传输次数寄存器DMA_CTMSx

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TIMES||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:16\]||未使用|
|\[15:0\]|TIMES|DMA通道x数据搬运次数。此寄存器在该通道使能后变为只读。|

DMA_CTMSx 寄存器只有在通道禁用，即DMA_CCRx.EN=0之后才可以写入数据。

当DMA_CTRL=1且DMA_CCRx.EN=0时，重新填写CTMSx值，可以将DMA内部已搬运的轮数次数计数器清零。

当DMA_CCRx.RMODE=0时，表示传输1轮，每轮传输DMA_CTMS次数据；

当DMA_CCRx.RMODE=1时，表示传输DMA_CTMS轮，每轮传输一次数据；

不支持多轮每轮传输多次数据。

以外设数据宽度为16，内存数据宽度为32，即CTMS.TIMES=16，DMA_CCRx.RMODE=0为例，DMA每轮需要读取外设数据16bit(2byte)×16=32byte，写入内存数据32bit(4byte)×16=64byte。即读取外设32byte，输入内存64byte；

即使仅仅搬运一轮，也需要设置CTMS.ROUND =1，而不能让其为0。

当设置DMA_CCRx.CIRC=1（即循环模式）时，DMA_CTMSx不再起作用，相当于无限轮；当DMA_CTMSx递减为0时，重新装载为预设值，开启下一阶段的传输。其他情况需要相应设置DMA_CTMSx，如DMA_CTMSx=1，且DMA_CCRx.RMODE=1时，用于搬运一轮数据。

当DMA_CCRx.RMODE=1时，DMA_CTMSx读出为当前剩余未搬运轮数，当DMA传输完成后轮数会复位为配置值。次数读出时一直为配置值。举例来说，比如配置DMA_CTMSx=4，读取时可能看到DMA_CTMSx由4开始递减，3,2,1…之后又变为0。当DMA当前通道需要重新进行4轮传输时，需要重新向DMA_CTMSx写入轮数值。当DMA_CCRx.RMODE=0时，DMA_CTMSx读出为当前这一轮剩余未搬运次数。但由于一轮内的数据是被DMA连续搬运的，所以软件读出的DMA_CTMSx会迅速变化。

注意，每次重新开启DMA通道前，都要重新配置DMA_CTMSx寄存器，已经在上一次传输中DMA_CTMSx寄存器已经递减为0。在设置DMA_CTMSx寄存器时，需要保证DMA_CTRL=1，即DMA被使能，否则DMA_CTMSx会写入无效。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

地址分别是：0x4001_9C0C，0x4001_9C24，0x4001_9C3C，0x4001_9C54，0x4001_9C6C，0x4001_9C84，0x4001_9C9C，0x4001_9CB4

复位值：0x0

表8-9
DMA源地址寄存器DMA\_ SADRx

|||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30||29||28||27||26|25||24||23||22||21||20||19||18|17||16|
|ADDR||||||||||||||||||||||||||||
|RW||||||||||||||||||||||||||||
|0||||||||||||||||||||||||||||
|15||14||13||12||11|10|9|8||7||6||5||4||3||2|1||0||
|ADDR||||||||||||||||||||||||||||
|RW||||||||||||||||||||||||||||
|0||||||||||||||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|ADDR|DMA通道x源地址|

当DMA_CCRx.SBTW=2’b01时，即配置为以16bit为单位从源地址搬运数据。DMA_SADRx.
ADDR\[0\]值无效，源地址会以2为单位递增。

当DMA_CCRx.SBTW=2’b10时，即配置为以32bit为单位从源地址搬运数据。DMA_SADRx.
ADDR \[1:0\]值无效，源地址会以4为单位递增。

**注意：**DMA_SADRx
寄存器只有在通道禁用，即DMA_CCRx.EN=0之后才可以写入数据！！！

#### DMA_DADRx (x = 0,1,2,3,4,5,6,7)

地址分别是：0x4001_9C10，0x4001_9C28，0x4001_9C40，0x4001_9C58，0x4001_9C70，0x4001_9C88，0x4001_9CA0，0x4001_9CB8

复位值：0x0

表8-10
DMA目的地址寄存器DMA_DADRx

|||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30||29||28||27||26|25||24||23||22||21||20||19||18|17||16|
|ADDR||||||||||||||||||||||||||||
|RW||||||||||||||||||||||||||||
|0||||||||||||||||||||||||||||
|15||14||13||12||11|10|9|8||7||6||5||4||3||2|1||0||
|ADDR||||||||||||||||||||||||||||
|RW||||||||||||||||||||||||||||
|0||||||||||||||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|ADDR|DMA通道x目的地址|

当DMA_CCRx.DBTW=2’b01时，即配置为以16bit为单位搬运数据到目的地址。DMA_DADRx.ADDR\[0\]值无效，目的地址会以2为单位递增。

当DMA_CCRx.DBTW=2’b10时，即配置为以32bit为单位搬运内存数据。DMA_DADRx.ADDR\[1:0\]值无效，目的地址会以4为单位递增。

**注意：**DMA_DADRx
寄存器只有在通道禁用，即DMA_CCRx.EN=0之后才可以写入数据！！！

