关于STM32 DMA传输的理解


1. DMA是什么

  DMA (Direct Memory Access),直接存储器存取,是一种不经过CPU而直接从内存存取数据的数据交换模式,因而被广泛地使用。早在 8086 的应用中,就已经有 Intel 的 8237 这种典型的 DMA 控制器。而 STM32 的 DMA 则是以类似外设的形式,添加到 Cortex 内核之外的。
  DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。
  DMA由硬件实现,从共用系统数据总线的角度看,DMA和CPU是竞争对手的关系,在实现DMA传输时,是由DMA控制器直接掌管总线,在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU

系统总线包括:

  • 数据总线:用于CPU与主存储器、CPU与I/O接口之间传送数据
  • 地址总线:用于CPU访问主存储器或外部设备时,传送相关的地址
  • 控制总线:用于传送CPU对主存储器和外部设备的控制信号
    即任何一个部件只要按照标准挂接到总线上,就进入了系统,就可以在CPU统一控制下进行工作

2. CPU如何传输数据

  在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式,均由软件实现。CPU是通过系统总线与其他部件连接并进行数据传输。

① 程序控制方式
  1) 无条件传送方式
  也叫做同步传送方式,微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。可以简单理解为CPU直接读取某个引脚的状态。
  2) 条件传送
  也叫做查询式传送方式,在开始传送数据前,必须要确认外设是否已经准备好接受数据的状态。
  是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口电路中既要有数据端口,还要有状态端口。比如iic传输中,读取数据前需要先等待设备响应后才能读取。

② 中断传送方式
  用查询方式,CPU要不断的查询外设的状态,很浪费时间,CPU工作效率很低。采用中断方式之后,CPU不需要查询外设的状态,而是执行主程序时,当外设数据准备好之后向CPU发出中断申请,因此CPU工作效率大大提高。但是CPU处理中断请求时需要进行断点和现场的保护和恢复,浪费了很多CPU的时间,适合少量数据的传送。

  软件方式实现数据传输的过程:
  在硬件系统中,主要由 CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在内存与外设之间转移,或从外设 A 转移到外设 B。
  例如:当 CPU 需要处理由 ADC 外设采集回来的数据时,CPU 首先要把数据从 ADC 外设的寄存器读取到内存中(变量),然后进行运算处理,这是一般的处理方法。

  其过程是内核通过 DCode 经过总线矩阵协调,使用 AHB 把外设 ADC 采集的数据读取到内核,暂时存放在内核的内存中(作为临时数据),然后内核通过 DCode 、再通过总线矩阵协调,把数据存放到内存 SRAM 中,最后再由CPU的运算器读取内存中的数据进行处理运算。

   ③ DMA传输
  DMA 正好可以取代上述的工作,其由硬件完成。即由 DMA 控制器的DMA 总线与总线矩阵协调,使用 AHB 把外设 ADC 的数据经由 DMA 通道存放到内存 SRAM,是点到点的数据转移,而不是使用 DMA 的方式还要以内核来作为中转站。在这个数据传输的过程中,不需要内核的全程参与。
  在DMA方式下,CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。

3. DMA的传输过程

  一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
① 请求
  CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求。

DMA中断和普通中断的区别
  两者最大的不同表现为对CPU的干扰程度不同:DMA 传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干预,DMA只是借用了一点CPU的时间而已。
  还有一个区别就是,CPU对这两个请求的响应时间不同,对中断请求一般都在执行完一条指令的时钟周期末尾响应,而对DMA的请求,由于考虑它的高效性,CPU在每条指令执行的各个阶段之中都可以让给DMA使用,是立即响应。

② 响应
  DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
③ 传输
  DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
  在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过程中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。
④ 结束
  当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。

  由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。

4. DMA一些特性

  STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有 7 个通道。DMA2 有 5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个 DMA 请求的优先权。

● 每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
● 在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。
● 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
● 支持循环的缓冲器管理
● 每个通道都有 3 个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错), 3 个事件标志逻辑或成为一个单独的中断请求。
存储器和存储器间,外设和存储器,存储器和外设的传输
● 闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。
● 可编程的数据传输数目:最大为 65536

5. DMA各通道对应外设

DMA1

DMA2

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: stm32是一款强大的微控制器芯片,可以通过设置它的DMA引擎进行高效的数据传输。而W25Q是一款闪存芯片,它可以与stm32配合使用,实现数据储存和读取。本文将详细介绍如何通过stm32DMA引擎,实现对W25Q的数据读取。 首先,我们需要通过SPI总线与W25Q进行通信。SPI总线是一种高速串行通信协议,它可实现全双工通信,所以我们可以同时发送和接收数据。要实现DMA读取W25Q的数据,我们需要在stm32的寄存器中对DMA进行配置。具体来说,我们需要设置数据的源地址和目的地址,以及数据的长度。然后,我们需要调用stm32DMA应用程序接口,以启动DMA数据传输。 其次,我们需要按照W25Q的规定进行数据读取,这需要使用W25Q的命令集。需要注意的是,在读取W25Q的数据时,需要将W25Q的CS引脚拉低,以启动数据传输。当传输结束后,我们需要将W25Q的CS引脚拉高,以表示数据读取完成。 在使用DMA读取W25Q的过程中,还需要注意其他一些问题。例如,在设置DMA引擎的寄存器时,我们需要根据具体的stm32芯片型号和DMA引擎版本进行调整。此外,为了保证数据传输的可靠性,我们还需要在W25Q的操作中添加一些必要的校验和纠错机制。 总的来说,通过设置stm32DMA引擎,可以高效地读取W25Q的数据。但是,在实践中需要注意各种问题,包括芯片型号,寄存器设置,命令集的使用等等。只有在理解了这些问题的前提下,才能够充分发挥这种数据传输方式的功效。 ### 回答2: STM32是一种高性能的微控制器,它内置有DMA控制器,可以用于数据传输。W25Q是一款高性能SPI接口的闪存芯片,可以存储大量的数据。为了实现STM32对W25Q的数据读取,可以使用DMA方式进行数据传输。 在进行DMA数据传输时,首先需要进行DMA配置。以SPI2为例,需要配置SPI2的DMA发送通道和DMA接收通道。然后,需要配置DMA的源地址和目的地址,以及数据传输长度等参数。配置完成后,启动DMA传输即可开始数据读取。 具体的流程如下: 1. 初始化W25Q和SPI接口,使其处于正确的工作状态。 2. 配置SPI2的DMA发送通道和DMA接收通道,同时设置为循环传输模式。 3. 配置DMA的源地址为W25Q的地址,目的地址为STM32的内存地址。 4. 设置DMA传输的数据长度,启动DMA传输,等待传输完成。 5. 读取数据,将其存储到STM32的内存中。 需要注意的是,在进行DMA传输时,需要保证W25Q和SPI接口的读写时序正确,否则可能会出现数据传输错误的情况。同时,为了提高数据传输速度,可以合理设置DMA传输控制器的相关参数。 ### 回答3: STM32 DMA读W25Q,是指使用STM32芯片内置的直接存储访问(DMA)功能来读取W25Q闪存芯片中的数据。 W25Q闪存芯片是一种常见的串行闪存存储器,具有高速度、大容量、低功耗等特点,因此被广泛应用于各种嵌入式系统中。 使用STM32来进行W25Q闪存的读取,可以利用STM32芯片内置的DMA功能,将读取操作直接传输到内存中,从而提高了读取速度和效率。 具体步骤如下: 1. 配置W25Q闪存芯片:根据具体的需求,配置W25Q芯片的读取模式、读取速度、尺寸等参数,以确保正确地读取数据。 2. 配置DMA控制器:设置DMA传输模式、传输方向、传输量、数据地址等参数,以便DMA能够正确地从W25Q芯片中读取数据并传输到内存中。 3. 启动DMA传输:将DMA控制器设置传输标志位,启动DMA传输操作,使数据能够被DMA控制器直接从W25Q芯片中读取,并传输到内存中。 4. 等待传输完成:等待DMA传输操作完成,以便确保所有数据被正确地传输到内存中。 5. 处理传输数据:将传输到内存中的数据进行处理,分析、处理或直接使用它,以便满足具体的应用需求。 总之,使用STM32 DMA读取W25Q闪存芯片的数据,是一种高效、方便、可靠的方法,可以大大加速读取数据的速度,并提高整个嵌入式系统的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值