- 功能
DMA可以在CPU不干涉的情况下,进行数据的搬移。例如:通过DMA来获取摄像头输出的像素数据,而占用少量CPU资源。
- DMAMUX
DMAMUX负责数据的路由:将触发源绑定到特定的DMA通道,当有触发时就通过通道发送一次数据。例如:触发源可以是
串口发送中断标志,DMA通道选择相应的串口通道。
- 传输方式
DMA支持多种传输方式,先谈一维传输:
以上图为例,设置0x12345670为要发送的数据首地址,设置数据大小为4个字节,设置数据传输一次的地址偏移为4字节,设置传
输循环次数为4次。第一次触发下,传输4个字节数据,发送指针指向0x12345674。四次触发完毕后,数据传输完成,DMA通道关闭。
注意,这里设置的地址偏移不一定要等于4字节(也可以是8字节,但是这样0x12345674-0x12345677间的4字节数据就被忽略了)。
在一维传输结束时,可以将地址回归到0x12345670,从而实现循环传输:
除了一维传输,DMA还提供了二维传输模式,即主循环+子循环模式,在该模式中,每次触发会使Minor Loop循环一次,当Minor Loop
循环结束时,等待下一个触发,Major Loop循环一次。因为主循环与子循环的偏移可以不相同,因此,可以通过二维传输实现隔行扫描。
- 重要寄存器
SADDR:源地址;
DAADR:目的地址;
SOFF:源地址偏移(一次数据传输后读取地址的偏移量);
DOFF:目的地址偏移(一次数据传输后写入地址的偏移量);
ATTR->SMOD:源地址循环/非循环模式;
ATTR->DMOD:目标地址循环/非循环模式;
ATTR->SSIZE:触发源发送一次的数据大小(4/2/1字节);
ATTR->DSIZE:接收方接收一次的数据大小(4/2/1字节);
BITER_ELINKNO:非级联模式下主循环计数初值(循环次数);
CITER_ELINKNO:非级联模式下主循环计数当前值(剩余循环次数);
CR->EMLM:子循环使能;
ERQ:通道触发请求使能;
SMLOE:源地址子循环地址偏移使能;
DMLOE:目的地址子循环偏移使能;
MLOFF:子循环地址偏移量;
NBYTES:子循环计数(循环次数);
CSR:带宽控制,传输结束后的操作;