目录
一、什么是DMA

1、DMA是什么
直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。
2、DMA的工作流程
串口发送接收数据为例
①不使用DMA:
发送:内核把SRAM中的数据给串口的数据寄存器DR,串口控制器再通过GPIO口发送出去
接收:外界的数据通过IO口到串口的数据寄存器DR,内核将数据从DR 放到 SRAM中
说明:如果需要从SRAM中发送大量数据则CPU会被占用的时间过长,会影响其他功能的运行。
②使用DMA:
发送:内核只需要告诉DMA控制器把SRAM中某个数组的数据搬运到串口的数据寄存器DR,DMA控制器就会搬运数据搬运给DR,而CPU就会去执行其它程序
说明:发送或接收大量数据时候会节省CPU的时间
什么时候用DMA?
当搬运大量数据的时候,用DMA搬运可以节省CPU的时间,从而去执行其他程序.
3、DMA控制器与外设控制器
使用DMA控制器时,CPU需要给DMA的命令
串口发送 :DMA流控制器(DMA将数据搬运到数据寄存器后,通过串口1将数据发生出去)
源地址 :存储器地址 存储器寄存器地址
目的地址 :外设地址 外设寄存器地址
搬运次数 :项数寄存器
每次搬运的字节数:MSIZE-->存储器数据大小 PSIZE-->外设数据大小
串口接收 :外设流控制器(串口接收到数据后,通过DMA将数据搬运到SRAM中)
源地址 :外设地址 外设寄存器地址
目的地址 :存储器地址 存储器寄存器地址
搬运次数 :无
每次搬运的字节数:MSIZE-->存储器数据大小 PSIZE-->外设数据大小
二、如何配置DMA
1、DMA框图

说明:
一个DMA里有8个数据流,每个数据流有8个通道,片上外设在使用DMA搬运数据前需要确定用哪个DMA的哪个数据流的哪个通道
2、功能说明

2.0 解除写保护

2.1 通道选择

需要确定用哪个DMA的哪个数据流的哪个通道 //需要查表
比如:串口1的发送要使用DMA
通过查表可知:DMA2的数据流7的通道4
注意:如果是存储器到存储器,只能用DMA2,数据流和通道随意

所用到的寄存器:DMA_SxCR(DMA stream x configuration register)

2.2 仲裁器

说明:如果两个数据流的软件优先级相同,数据流的编号越低优先级越高
所用到的寄存器:DMA_SxCR(DMA stream x configuration register)

2.3 源、目标和传输模式
传输方向所用到的寄存器:DMA_SxCR(DMA stream x configuration register)
源地址(数据起始的地址)所用到的寄存器:DMA_SxM0AR(DMA stream x memory 0 address register)
目标地址(数据要传输到的地址)所用到的寄存器:DMA_SxPAR(DMA stream x peripheral address register)

例子:
串口1发送数据采用DMA搬运; u8 str[10] = “qwertyuio”;
传输方向 : 存储器到外设(DMA将数据搬运到数据寄存器后,通过串口1将 数据发生出去)
存储器地址寄存器 : 数组的地址
外设地址寄存器 : 串口1的数据寄存器DR的地址
为什么存储器地址寄存器写入的所需搬运数据的地址?不应该是存储器的地址吗?
存储器地址寄存器专门用于存储数据传输的起始地址。在DMA传输过程中,DMA控制器会根据存储器地址寄存器中存储的地址信息,从源地址读取数据,并将数据写入到目标地址。这样,DMA就能实现数据的自动搬运,而无需CPU的参与。
注意:
存储器到存储器实际是外设到存储器地址存放规则(必须开FIFO)
为什么必须开FIFO?
当源存储器和目标存储器的数据宽度不一致时,FIFO可以对数据进行封装或拆包,以确保数据在传输过程中不会丢失。例如,如果源存储器是32位宽,而目标存储器是16位宽,直接传输会导致高16位数据丢失。而使用FIFO,可以将32位数据拆分为两个16位数据分别传输,从而避免数据丢失
2.4 指针递增
存储器部分:
地址需要明确偏移量 所用到的寄存器:DMA_SxCR(DMA stream x configuration register)


外设部分:
一般地址不需要偏移量 所用到的寄存器:DMA_SxCR(DMA stream x configuration register)


2.5 循环模式

所用到的寄存器:DMA_SxCR(DMA stream x configuration register)

FIFO模式与直接模式:
FIFO模式:可以使用1/4级(4个字节) 1/2级(8个字节) 3/4级(12个字节) 4/4级(16个字节) 源与目标的宽度可以不一致 如:4个字节的进入FIFO 1个字节出
FIFO模式配置: SxFCR寄存器的DMDIS位

FIFO容量配置: SxFCR寄存器的 FTH 位

突发增量配置: 一定要用FIFO模式
突发增量

如果你设置的是以1个字节进入,可以设置4节拍的突发增量,可以设置8节拍的突发增量,可以设置16节拍的突发增量,从而加快速度。 注意FIFO阈值匹配 参考表41
例如: 设置阈值为1/2 可选用1次8节拍突发增量,也可选择2次4节拍突发
所用到的寄存器:DMA_SxCR(DMA stream x configuration register)

直接模式:不使用FIFO -->源和目标的宽度一致的

最低0.47元/天 解锁文章
922

被折叠的 条评论
为什么被折叠?



