欢迎光临散文网 会员登陆 & 注册

STM32 DMA教程 如何在STM32中使用直接内存访问(DMA)

2023-02-22 11:20 作者:心飞若  | 我要投稿

在这个STM32 Blue Pill教程中,我们介绍了STM32微控制器的DMA直接内存访问控制器。我们将讨论 DMA 单元的硬件和特性、如何配置和使用它及其应用。

直接内存访问通常称为 DMA,是一种数据传输技术,其中 I/O 设备直接与内存通信,而无需通过中央处理器。在这种硬件机制中,DMA控制器是计算机体系结构中代替CPU单元的数字逻辑单元,负责访问输入输出设备和存储器以传输数据。因此,它减轻了与内存传输相关的操作负载,从而大大降低了 CPU 负载。

DMA 控制器是一种专用硬件,无需 CPU 参与即可直接执行读取和写入操作,并节省了涉及操作码获取、解码、递增和源/目标测试地址的时间,否则中央处理器应该执行这些操作。这导致外围设备和内存之间的数据传输速率很高,并且可以快速传送大块数据。

没有 DMA 单元的 CPU 可能会过载并导致其过度工作,因为主处理器负责在外围设备和内存之间传输数据以及执行代码和获取指令。为了确保 CPU 发挥其全部潜力,数据传输过程被交给 DMA 单元,以减少主处理器的负载。


显示 DMA 单元的 STM32 Blue Pill 系统架构

下图显示了 STM32 Blue Pill 附带的 STM32F103C8T6 微控制器的系统架构。

请注意,在上图中,通过合并一个 DMA 单元,来自任何外设(例如 ADC1 或 USART1)的数据流现在可以直接发送到 SRAM,而无需主处理器的干预。CPU 可以继续执行自己的任务,从而提高系统的生产率。虽然并不总是有利,但 DMA 单元也可能带来一些问题。

DMA 单元与 Cortex-M3 内核共享系统总线,使其能够完成直接内存传输。总线矩阵使用循环调度,确保 CPU 可以访问至少一半的系统带宽。总线矩阵实现循环调度,从而在 DMA 停止 CPU 访问系统总线时确保 CPU 至少有一半的系统总线带宽(内存和外设)主处理器具有相同的目标目的地。

简而言之,DMA 单元释放了 CPU 并允许它执行其他操作。在没有任何 CPU 干预的情况下,在 DMA 单元的帮助下,外围设备和内存之间以及内存到内存之间会发生快速数据传输。

STM32 Blue Pill DMA 硬件

正如您在下面的系统架构中看到的,STM32F103C8T6 有 2 个 DMA 控制器(DMA1 和 DMA2)。DMA1 有 7 个通道,DMA2 有 5 个通道。此外,每个通道都有专门的资源来管理来自一个或多个外设的内存访问请求,这意味着它总共有 12 个通道,可以与不同的外设一起使用,以直接在内存和外设之间传输。我们还可以将每个 DMA 通道与一个或多个外设一起使用来处理内存传输请求。为此,它提供了一个仲裁器来设置 DMA 请求的优先级。

主要特征

下面我们列出了 STM32 Blue Pill 的 DMA 单元的一些主要特性:

  • STM32 Blue Pill 具有十二个通道,可针对 DMA 请求进行配置。这包括七个用于 DMA1 和五个用于 DMA2

  • 所有通道都有自己的 DMA 硬件请求和软件触发器,可以通过软件轻松配置。

  • DMA 请求还具有非常高、高、中和低四个级别的优先级,可以通过软件设置。它们在 DMA_CCRx 寄存器中配置。就硬件而言,它具有相等性,其中编号较小的通道优先于编号较大的通道。仲裁器负责根据设置的优先级监控通道请求。之后,它将启动外设或内存访问序列。

  • 它具有模拟打包/解包、自依赖源和目标传输(包括字节、半字和字)的特点。

  • 循环缓冲区管理

  • 具有内存到内存、外设到外设、外设到内存和内存到外设的传输功能

  • 能够访问闪存、SRAM、APB1、APB2 和 AHB 外设,既可以作为源也可以作为目标。

  • 通过DMA单元最多可传输65536个可编程数据

  • 对于单个中断请求,每个通道都有三个事件标志,包括 DMA 传输一半、DMA 传输完成和 DMA 传输错误。这些标志使灵活性成为可能,因为有单独的中断使能位。

DMA 中的数据处理

在本节中,我们将了解 DMA 单元如何执行数据事务。主要有三个操作决定数据处理/传输过程。

  1. 首先,数据从外设数据寄存器或内存中的特定位置加载。它通过内部当前外设或内存地址寄存器定向。这里,对于第一次传输,起始地址是在 DMA_CPARx/DMA_CMARx 寄存器中编程的基本存储器或外设地址。

  2. 其次,存储加载到外设数据寄存器或内存中特定位置的数据,这些数据是通过内部当前外设或内存地址寄存器定向的。这里,对于第一次传输,起始地址是在 DMA_CPARx/DMA_CMARx 寄存器中编程的基本存储器或外设地址。

  3. 第三,DMA_CNDTRx 寄存器后递减。该寄存器保存剩余的数据传输数。

DMA 通道

如前所述,STM32 Blue Pill 具有十二个独立的 DMA 通道,能够监控内存地址和在特定地址处找到的外设地址之间的 DMA 传输。DMA 单元最多可以传输 65535 个可编程数据。事务发生后,保存数据数量的寄存器会递减。

DMA_CCRx 寄存器包含 PSIZE/MSIZE 位,可以轻松编程外设/存储器的传输数据大小。根据 DMA_CCRx 寄存器中存在的 PINC/MINC 位,可以将外设/内存指针设置为在每次事务发生后递增。如果启用增量模式,则下一次传输的地址将是前一次传输的地址根据设置的数据大小增加 1、2 或 4。

DMA请求可以设置为连续数据传输的循环模式,根据通道配置阶段设置的初始值不断重新加载要发送的数据个数,DMA请求不断工作。要启用循环模式,使用 DMA_CCRx 寄存器中的 CIRC 位。

但是,DMA 请求也可以设置为内存到内存模式。在这种情况下,DMA 通道不是由来自外设的请求触发的。它不与循环模式同时使用。

MA 请求映射

下表显示了从通道 1 到通道 7 的每个通道的 DMA1 请求。

要激活或停用外设 DMA 请求,必须对特定外设寄存器上的 DMA 控制位进行编程。

STM32 Blue Pill DMA 配置

在本节中,让我们看看如何在 STM32 Blue Pill 中配置 DMA 单元。它遵循一系列步骤来成功配置单元。

  • 首先,要配置 DMA 通道,需设置 DMA_CPARx 寄存器中的外设寄存器地址。外设事件发生后,数据将从/到该地址传输到/从内存。

  • 其次,接下来设置 DMA_CMARx 寄存器中的内存地址。外设事件发生后,数据将从/到该地址传输到/从内存。

  • 接下来,要传输的数据总数在 DMA_CNDTRx 寄存器中配置。每当发生数据事务时,寄存器中的值就会递减。

  • 通道的优先级通过 PL[1:0] 位在 DMA_CCRx 寄存器中设置。

  • 之后,在 DMA_CCRx 寄存器中配置 DMA 请求的模式以及数据传输方向、中断类型、外设/内存数据大小等。

  • 最后,设置 DMA_CCRx 寄存器中特定通道的使能位以启动它。

  • 启用 DMA 通道后,DMA 请求从与配置通道连接的外设开始。如果启用 HTIE(半传输中断使能)并标记半传输标志的设置,则在发送一半数据字节时触发中断。在这种情况下,如果使能 TCIE(传输完成中断使能),则在所有数据传输完成后触发中断并标记传输完成标志的设置。

以上文章由IC先生网www.mrchip.cn编辑整理,请勿转载。

STM32 DMA教程 如何在STM32中使用直接内存访问(DMA)的评论 (共 条)

分享到微博请遵守国家法律