STM32学习笔记---DMA

目录

一、什么是DMA

1、DMA是什么

2、DMA的工作流程

3、DMA控制器与外设控制器

二、如何配置DMA

1、DMA框图

2、功能说明

2.1 通道选择

2.2 仲裁器

 2.3 源、目标和传输模式

2.4 指针递增

2.5 循环模式

2.6 DMA流控制器和外设流控制器

3、程序设计

三、具体使用DMA


一、什么是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 -->源和目标的宽度一致的

2.6 DMA流控制器和外设流控制器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值